Computer >> Máy Tính >  >> Lập trình >> C#

Công dụng của hàm tạo tĩnh trong C # là gì?

Một phương thức khởi tạo tĩnh được sử dụng để khởi tạo bất kỳ dữ liệu tĩnh nào hoặc để thực hiện một phân đoạn chỉ cần thực hiện một lần. Nó được gọi tự động trước khi tạo tầng đầu tiên hoặc bất kỳ thành viên tĩnh nào được tham chiếu.

Các hàm tạo tĩnh rất hữu ích khi tạo các lớp trình 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. Các hàm tạo tĩnh cũng là nơi thuận tiện để thực thi kiểm tra thời gian chạy đối với tham số kiểu không thể được kiểm tra tại thời điểm biên dịch thông qua các ràng buộc.

Các hàm tạo tĩnh có các thuộc tính sau -

  • Một hàm tạo tĩnh không sử dụng các công cụ sửa đổi quyền truy cập hoặc có các tham số.

  • Một lớp hoặc cấu trúc chỉ có thể có một hàm tạo tĩnh.

  • Các hàm tạo tĩnh không thể được kế thừa hoặc quá tải.

  • Một phương thức khởi tạo tĩnh không thể được gọi trực tiếp và chỉ được gọi bằng thời gian chạy ngôn ngữ chung (CLR). Nó được gọi tự động.

  • Người dùng không có quyền kiểm soát khi nào hàm tạo tĩnh được thực thi trong chương trình.

  • Một phương thức khởi tạo tĩnh được gọi tự động để khởi tạo lớp trước khi thể hiện đầ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 khối lệnh statin sẽ chạy trước một phương thức khởi tạo cá thể. Cấu trúc tĩnh của một kiểu được gọi khi một phương thức tĩnh được gán cho một sự kiện hoặc một đại biểu được gọi và không phải khi nó được gán. Nếu các bộ khởi tạo biến trường tĩnh có trong lớp của hàm tạo tĩnh, chúng sẽ được thực thi theo thứ tự văn bản mà chúng xuất hiện trong khai báo lớp ngay trước khi thực thi hàm tạo tĩnh.

  • Nếu bạn không cung cấp một phương thức khởi tạo tĩnh để khởi tạo các trường tĩnh, thì tất cả các trường tĩnh đều được khởi tạo thành giá trị mặc định của chúng như được liệt kê trong Giá trị mặc định của kiểu C #.

  • Nếu một phương thức khởi 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à kiểu 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. Thông thường nhất, ngoại lệ aTypeInitializationException được ném ra khi một phương thức khởi tạo tĩnh không thể khởi tạo một kiểu hoặc đối với một ngoại lệ không được xử lý xảy ra trong phương thức khởi tạo astatic. Đối với các hàm tạo tĩnh tiềm ẩn không được xác định rõ ràng trong mã nguồn, việc khắc phục sự cố có thể yêu cầu kiểm tra mã ngôn ngữ tức thời (IL).

  • Sự hiện diện của một phương thức khởi tạo tĩnh ngăn cản việc bổ sung thuộc tính kiểuBeforeFieldInit. Điều này hạn chế tối ưu hóa thời gian chạy.

  • Trường được khai báo là static readonly chỉ có thể được gán như một phần của khai báo của nó hoặc trong một phương thức khởi tạo tĩnh. Khi không yêu cầu một phương thức khởi tạo tĩnh rõ ràng, hãy khởi tạo các trường tĩnh khi khai báo, thay vì thông qua một mã sttcconstructor để tối ưu hóa thời gian chạy tốt hơn.

Ví dụ

 using System; namespace DemoApplication {public class Program {static void Main (string [] args) {Car user =new Car (); Người dùng xe1 =Xe mới (); Console.ReadLine (); }} public class Car {static Car () {Console.WriteLine ("Hàm tạo tĩnh được gọi là"); } public Car () {Console.WriteLine ("Hàm tạo mặc định được gọi"); }}} 

Đầu ra

 Phương thức tạo tĩnh được gọi là Phương thức khởi tạo mặc định được gọi là Phương thức khởi tạo mặc định được gọi là 

Trong ví dụ trên, chúng ta có thể thấy rằng hàm tạo tĩnh chỉ được gọi một lần.

Ví dụ

 using System; using System.Threading; namespace DemoApplication {public class Car {được bảo vệ tĩnh chỉ đọc DateTime globalStartTime; bảo vệ int RouteNumber {get; đặt; } static Car () {globalStartTime =DateTime.Now; Console.WriteLine ($ "Hàm tạo tĩnh được gọi. Thời gian bắt đầu toàn cục:{globalStartTime.ToLongTimeString ()}"); } public Car (int routeNum) {RouteNumber =routeNum; Console.WriteLine ($ "Xe {RouteNumber} đã được tạo."); } public void Drive () {TimeSpan elapsedTime =DateTime.Now - globalStartTime; Console.WriteLine ($ "Car {this.RouteNumber} đang bắt đầu lộ trình {elapsedTime.Milliseconds} phút sau thời gian bắt đầu toàn cầu {globalStartTime.ToShortTimeString ()}."); }} class TestCar {static void Main () {Car car1 =new Car (1); Car car2 =new Car (2); car1.Drive (); Thread.Sleep (25); car2.Drive (); Console.ReadLine (); }}} 

Đầu ra

 Hàm tạo tĩnh được gọi. Thời gian bắt đầu toàn cầu:7:09:06 AMCar 1 được tạo. / pre>