2008-11-27 40 views

Trả lời

23

Lớp tĩnh được tự động niêm phong, vì vậy mọi người không thể kế thừa và ghi đè hành vi của họ.

Đó là khác biệt duy nhất (trừ khi có cái gì đó đặc biệt trong IL)

Vì vậy, nếu bạn sử dụng một lớp tĩnh, bạn tiết kiệm cho mình những rắc rối của việc các nhà xây dựng tư nhân, và tuyên bố lớp niêm phong.

Tôi sẽ thêm, xác định lớp là tĩnh, là mã "tự tạo tài liệu". Người dùng thư viện của bạn sẽ biết rằng lớp này không nên được khởi tạo và chỉ có các giá trị tĩnh.

+2

Thực sự có điều gì đó đặc biệt trong IL. Các lớp tĩnh được đánh dấu cả hai trừu tượng và niêm phong (mà không thể được thực hiện bằng cách khác từ C#) mà hoàn toàn ngăn chặn instantiation. –

+3

Lưu ý rằng theo Mehrdad ([ở đây] (http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927 # 5241927)), sự khác biệt khác là các phương thức tĩnh trên các lớp không tĩnh không thể là các phương thức mở rộng. – Benjol

17

Một lớp tĩnh không bao giờ có thể được khởi tạo. Không đời nào, không.

Một lớp không tĩnh với một hàm tạo riêng nhưng tất cả các phương thức tĩnh có thể bị lạm dụng theo nhiều cách khác nhau - thừa kế, phản chiếu, gọi hàm tạo riêng trong một nhà máy tĩnh - để khởi tạo lớp.

Nếu bạn không bao giờ muốn thuyết minh, tôi sẽ đi với lớp tĩnh.


Edit - Làm rõ cho comment FosterZ của

Giả sử bạn có lớp tiện ích này:

public class Utility 
{ 
    public static string Config1 { get { return "Fourty Two"; } } 

    public static int Negate(int x) { return -x; } 

    private Utility() { }  
} 

Nếu nhà phát triển khác là không rõ ràng về ý định của mình, họ có thể làm điều này:

public class Utility 
{ 
    public static string Config1 { get { return "Fourty Two"; } } 
    public int Config2 { get; set; } 

    public static int Negate(int x) { return -x; } 

    private Utility() { } 

    /// Get an instance of Utility  
    public static Utility GetUtility() 
    { 
     return new Utility(); 
    } 
} 

Bây giờ bạn có Frankenstei n lớp. Một số tính năng của nó yêu cầu instantiation và một số thì không. Có lẽ đó là những gì bạn muốn nhưng có lẽ nó không phải. Bạn có thể ngăn chặn điều này với việc xem xét mã, nhưng tại sao không làm cho ý định của bạn rõ ràng trong mã? Đánh dấu lớp là static sẽ loại bỏ mọi nhầm lẫn có thể xảy ra. Bạn không thể khởi tạo một lớp tĩnh hoặc kế thừa từ nó.

+0

bạn có thể vui lòng cho tôi một ví dụ nhỏ cho thời điểm này "gọi cho nhà xây dựng tư nhân trong một nhà máy tĩnh - để khởi tạo lớp học", m thấy khó hiểu điều này ... – FosterZ

+2

@FosterZ - Tôi đã thêm một ví dụ vào câu trả lời của tôi. Chúc mừng. –

+0

thnku dude rất nhiều .... bây giờ tôi nhận được nó .. – FosterZ

15

Ngoài các câu trả lời trước: Trình biên dịch sẽ không cho phép thành viên không tĩnh trên các lớp tĩnh và tạo và lỗi. Điều này có thể giúp một chút để vô tình thêm các thành viên không tĩnh.

1

Ngoài ra tôi sẽ đi với các nhà xây dựng tư nhân không bao giờ được gọi bằng các phương pháp tĩnh. Vì vậy, bất kỳ khởi tạo trong đó sẽ bị lãng phí ... Nhưng đó chỉ là một lý thuyết.

3

bạn có thể chuyển đối tượng của một lớp có hàm tạo riêng tư làm tham số cho bất kỳ phương thức nào nhưng bạn không thể thực hiện tương tự với lớp tĩnh. Đây là sự khác biệt lớn.

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