2015-12-11 21 views
10

Tôi có một lớp tĩnh với một hàm tạo tĩnh. Tôi cần phải vượt qua một tham số bằng cách nào đó để lớp tĩnh này nhưng tôi không chắc chắn cách tốt nhất là. Bạn sẽ đề xuất điều gì?Làm cách nào để truyền tham số tới hàm tạo lớp tĩnh?

public static class MyClass { 

    static MyClass() { 
     DoStuff("HardCodedParameter") 
    } 
} 
+2

Bạn có thể đã tạo ra nó 'tĩnh' vì những lý do sai. Thiết kế lại. –

+0

Câu hỏi đầu tiên thực sự là: tại sao lớp này lại tĩnh? Hiếm khi nó được. –

Trả lời

16

Không sử dụng một constructor tĩnh, nhưng một phương pháp khởi tạo tĩnh:

public class A 
{ 
    private static string ParamA { get; set; } 

    public static void Init(string paramA) 
    { 
     ParamA = paramA; 
    } 
} 

Trong C#, nhà thầu tĩnh là parameterless, và đang có vài phương pháp để khắc phục hạn chế này. Một là những gì tôi đã đề nghị bạn ở trên.

0

Theo MSDN, A static constructor is called automatically to initialize the class before the first instance is created. Do đó bạn không thể gửi bất kỳ tham số nào.

CLR phải gọi một hàm tạo tĩnh như thế nào để biết thông số nào cần truyền?

Vì vậy, không sử dụng hàm tạo tĩnh.

Đây là công việc xung quanh cho yêu cầu của bạn.

public class StaticClass 
{ 
    private int bar; 
    private static StaticClass _foo; 

    private StaticClass() {} 

    static StaticClass Create(int initialBar) 
    { 
    _foo = new StaticClass(); 
    _foo.bar = initialBar; 
    return _foo; 
    } 
} 

constructor tĩnh có các thuộc tính sau:

  • Một constructor tĩnh không mất bổ truy cập hoặc có tham số. Một hàm tạo tĩnh được gọi tự động để khởi tạo lớp trước khi cá thể đầu tiên được tạo hoặc bất kỳ thành viên tĩnh nào được tham chiếu.
  • Một hàm tạo tĩnh không thể được gọi trực tiếp.
  • Người dùng không có quyền kiểm soát khi hàm dựng tĩnh được thực hiện trong chương trình.
  • Việc sử dụng điển hình các hàm tạo tĩnh là khi lớp đang sử dụng tệp nhật ký và hàm tạo được sử dụng để ghi các mục nhập vào tệp này.
  • Trình xây dựng tĩnh cũng hữu ích khi tạo lớp bao bọc cho mã không được quản lý, khi hàm tạo có thể gọi phương thức LoadLibrary .
  • Nếu một hàm tạo tĩnh ném một ngoại lệ, thời gian chạy sẽ không gọi nó lần thứ hai và loại sẽ vẫn chưa được khởi tạo cho thời gian tồn tại của miền ứng dụng mà chương trình của bạn đang chạy là .
0

Nếu bởi "HardCodedParameter" bạn thực sự có nghĩa là mã hóa cứng, bạn có thể sử dụng hằng số.

public static class YoursClass 
{ 
    public const string AnotherHardCodedParam = "Foo"; 
} 

public static class MyClass 
{ 
    private const string HardCodedParam = "FooBar"; 

    static MyClass() 
    { 
     DoStuff(MyClass.HardCodedParam); 
     DoStuff(YoursClass.AnotherHardCodedParam); 
    } 
} 

Ngoài ra, bạn có thể sử dụng các thuộc tính chỉ đọc tĩnh.

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