2013-12-08 17 views
21

tôi đã nhận thấy rằng một lớp không tĩnh có thể có một constructor tĩnh:Chức năng của một hàm tạo tĩnh trong một lớp không tĩnh là gì?

public class Thing 
{ 
    public Thing() 
    { 
     Console.WriteLine("non-static"); 
    } 

    static Thing() 
    { 
     Console.WriteLine("static"); 
    } 
} 

Và khi bạn khởi tạo một thể hiện của Thing constructor tĩnh được gọi đầu tiên.

Output:

tĩnh

không tĩnh

Điều gì sẽ là sự cần thiết cho việc này? Bạn có sử dụng nó để khởi tạo các trường tĩnh trên thể hiện của bạn của loại không tĩnh?

Có điều gì cần xem xét khi sử dụng một hàm tạo tĩnh không?

+4

Bạn tự trả lời 'để khởi tạo trường tĩnh'. Đọc thêm về hàm tạo tĩnh [ở đây] (http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx). –

Trả lời

23

Bạn có sử dụng nó để khởi tạo trường tĩnh trên trường hợp của bạn thuộc loại không tĩnh không?

Khá nhiều, ngoại trừ các trường tĩnh (hoặc các thành viên tĩnh thuộc bất kỳ loại nào) không được liên kết với các phiên bản; chúng được liên kết với chính nó, bất kể nó là một lớp tĩnh hay một lớp không tĩnh.

Các documentation liệt kê một số tính chất của nhà xây dựng tĩnh, một trong số đó là:

  • Một constructor tĩnh được gọi tự động để khởi tạo lớp trước khi trường hợp đầu tiên được tạo ra hay bất kỳ thành viên tĩnh được tham chiếu.

Ở đây, "trước" có nghĩa là "ngay trước" và tùy theo điều nào xảy ra trước. Điều này là do một hàm tạo tĩnh chỉ được gọi một lần cho mỗi loại trong một chương trình thực hiện đơn lẻ.


Có bất kỳ điều cần xem xét khi sử dụng một constructor tĩnh?

Dưới đây là danh sách đầy đủ như được đưa ra bởi các liên kết ở trên, mà nên cung cấp cho bạn một ý tưởng về những gì mong đợi khi sử dụng một constructor tĩnh:

  • 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 tạo 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 trong suốt 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.

Bên cạnh đó đảm bảo rằng bạn không nên cố gắng để truy cập vào các thành viên không tĩnh, vì bạn đang không ở trong một constructor dụ, điều chính khác bạn phải xem xét là một constructor tĩnh luôn được gọi là tại một thời điểm cụ thể trong quá trình thực hiện chương trình. Như đã nói, bạn không thể kiểm soát điều này, ngoài việc kiểm soát khi nào "cá thể đầu tiên được tạo ra hoặc bất kỳ thành viên tĩnh nào được tham chiếu."

1

Bạn sử dụng nó để khởi tạo hoặc gọi các thành viên tĩnh của lớp học.

1

Đây là câu trả lời chủ quan từ trải nghiệm cá nhân, nhưng bạn cũng có thể sử dụng nó để đảm bảo khởi tạo các biến tĩnh khác bên ngoài lớp học, mà các thành viên trong lớp của bạn có thể phụ thuộc.

3

Từ MSDN Link:

Một constructor tĩnh được gọi là tự động để khởi tạo lớp trước khi trường hợp đầu tiên được tạo ra hoặc bất kỳ thành viên tĩnh được tham chiếu.

Như bạn đã nói, nó được sử dụng để khởi tạo các trường tĩnh. Bạn chỉ cần xem xét một điều, các trường không tĩnh không được khởi tạo cho đến khi bạn tạo ra thể hiện của lớp.

0

Như đã nêu trong số BoltClock là hình Unicorn ở trên.

Nhưng một bổ sung tốt đẹp là bạn có thể sử dụng nó để thực hiện một Singleton thoải mái và dễ dàng quá:

public sealed class Singleton 
{ 
    private static readonly Singleton instance; 

    private Singleton() { } 

    static Singleton() 
    { 
     instance = new Singleton() 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
     return instance; 
     } 
    } 
} 

Thông tin chi tiết có thể được tìm thấy tại http://www.codeproject.com/Articles/90896/Singletons-in-C-Static-Constructor-vs-Static-Initi

+0

Điều này không sử dụng một hàm tạo tĩnh ... – Servy

+0

Đã chỉnh sửa để bao gồm mã và liên kết chính xác. Xin lỗi. –

+0

Nhưng không có lý do gì để sử dụng hàm tạo tĩnh tại đây; mã trước đó của bạn thường thích hợp hơn với điều này, làm cho lý do này trở thành một lý do kém để sử dụng một hàm tạo tĩnh. – Servy

1
  • Static Constructor được gọi là tự động trước khi đầu tiên Ví dụ của lớp học là được tạo.
  • Được khai báo bằng cách thêm tiền tố từ khóa tĩnh vào định nghĩa hàm tạo.
  • Không thể truy cập các công cụ sửa đổi truy cập hoặc có bất kỳ thông số nào.
Các vấn đề liên quan