2013-01-13 41 views
9

thể trùng lặp:
Best way to make data (that may change during run-time) accessible to the whole application?Làm thế nào để tạo ra đối tượng toàn cầu trong một thư viện C#

Tôi có một thư viện C#.

  1. Thư viện có thể có các đối tượng/biến toàn cầu không?
  2. Phương pháp khởi tạo cho các đối tượng đó có thể tự động được thực hiện từ thư viện khi chạy dự án chính hay tôi phải đặt phương thức tĩnh và chạy nó từ dự án chính?
+1

Trạng thái toàn cầu là điều xấu. Nó làm cho các chương trình rất khó để giải thích và gỡ lỗi. – Oded

+1

@Oded, đúng nhưng đôi khi bạn không thể tránh nó - sau đó làm cho nó rõ ràng và minh bạch là rất quan trọng. – Hogan

Trả lời

17

Trong C# Tôi luôn luôn sử dụng một lớp tĩnh để cung cấp chức năng này. lớp tĩnh được trình bày chi tiết here, nhưng một thời gian ngắn họ chỉ chứa các thành viên tĩnh và không được khởi tạo - về cơ bản họ đang chức năng toàn cầu và các biến truy cập thông qua tên lớp của họ

Dưới đây là một ví dụ đơn giản:

(và không gian tên.)
public static class Globals 
{ 
    public static string Name { get; set; } 
    public static int aNumber {get; set; } 
    public static List<string> onlineMembers = new List<string>(); 

    static Globals() 
    { 
     Name = "starting name"; 
     aNumber = 5; 
    } 
} 

Lưu ý, tôi cũng đang sử dụng bộ khởi tạo tĩnh được đảm bảo chạy vào một thời điểm trước khi bất kỳ thành viên hoặc chức năng nào được sử dụng/gọi.

Ở những nơi khác trong chương trình của bạn, bạn chỉ có thể nói:

Console.WriteLine(Globals.Name); 
Globals.onlineMemeber.Add("Hogan"); 

đối tượng tĩnh chỉ "tạo ra" một lần. Vì vậy, ở khắp mọi nơi ứng dụng của bạn sử dụng các đối tượng sẽ được từ cùng một vị trí. Họ là theo định nghĩa toàn cầu. Để sử dụng đối tượng này ở nhiều nơi, chỉ cần tham chiếu tên đối tượng và phần tử bạn muốn truy cập.


Bạn có thể thêm thành viên tĩnh vào bất kỳ lớp nào và chúng sẽ có sẵn trên toàn cầu, nhưng tôi nghĩ có một địa điểm cho hình cầu là thiết kế tốt hơn.

7

Bạn có thể sử dụng công khai static properties trên lớp làm đối tượng/biến toàn cục.

Bạn có thể khởi tạo thuộc tính tĩnh trong một lớp static constructor cho lớp này, sẽ được gọi trực tiếp trước khi lần đầu tiên các thuộc tính được truy cập.

4

Thư viện có thể có các đối tượng/biến toàn cầu không?

Có C# có thể có các lớp tĩnh, thành viên tĩnh. Nhưng Không có biến nào có thể tồn tại bên ngoài lớp.

Phương pháp khởi tạo cho các đối tượng đó có thể tự động được thực hiện từ thư viện khi chạy dự án chính hay tôi phải đặt phương thức tĩnh và chạy nó từ dự án chính?

Hoặc bạn có thể khởi tạo nội dòng hoặc khởi tạo trong các hàm tạo tĩnh. Chúng được gọi trước khi truy cập đầu tiên vào bất kỳ thành viên tĩnh hoặc thành viên cá thể nào. Nếu các thành viên tĩnh không được truy cập và các cá thể không được tạo ra, có khả năng việc khởi tạo sẽ không diễn ra.

Interesting article related to static initializers

Các vấn đề liên quan