2011-10-28 32 views
17

thể trùng lặp:
When to Use Static Classes in C#C# lớp tĩnh tại sao sử dụng?

tôi đặt lớp của tôi như rất nhiều tĩnh, nhưng tôi không chắc chắn khi sử dụng tĩnh hay không, hay sự khác biệt nó làm cho sử dụng đó là những gì hay không phải.

ai cũng có thể giải thích được không?

+1

các lớp/phương pháp tĩnh là ví dụ hữu ích để triển khai mẫu Singleton và mẫu Nhà máy ... – Yahia

+2

@Yahia: Mẫu Singleton có các lớp tĩnh? [Tôi không nghĩ vậy.] (Http://stackoverflow.com/questions/3565482/can-singleton-class-be-static/3565496#3565496) – BoltClock

+0

@BoltClock NẾU bạn đọc kỹ thì tôi đã viết "lớp tĩnh/phương pháp "và tôi khá chắc chắn phương pháp tĩnh là hữu ích khi thực hiện một mẫu Singleton ... – Yahia

Trả lời

26

Làm cho lớp học tĩnh chỉ ngăn mọi người cố gắng tạo một thể hiện của nó. Nếu tất cả các lớp của bạn có các thành viên tĩnh thì đó là một thực hành tốt để làm cho lớp đó tĩnh.

+5

Tại sao nó là một thực hành tốt để làm cho lớp là tĩnh nếu chúng ta có tất cả các thành viên như tĩnh? Điều gì sẽ là lợi thế của việc làm cho lớp đó là tĩnh? –

+2

Nó sẽ ngăn không cho mọi người cố gắng thực hiện nó –

+5

Nhưng với mục đích đó, bạn có thể khai báo một hàm tạo riêng và tạo lớp Singleton. Theo như tôi biết, một lớp tĩnh sẽ luôn luôn ở lại trong bộ nhớ tạo ra một lớp học trên cao nhưng bình thường sẽ không. –

11

Nếu một lớp được khai báo là tĩnh thì các biến và phương thức bắt buộc phải được khai báo là tĩnh.

Một lớp có thể được khai báo là tĩnh, cho biết rằng lớp đó chỉ chứa các thành viên tĩnh. Không thể tạo các cá thể của một lớp tĩnh bằng từ khóa mới. Các lớp tĩnh được nạp tự động bởi thời gian chạy ngôn ngữ chung của Khuôn khổ .NET (CLR) khi chương trình hoặc không gian tên chứa lớp được nạp.

Sử dụng lớp tĩnh để chứa các phương thức không được liên kết với một đối tượng cụ thể. Ví dụ, nó là một yêu cầu chung để tạo ra một tập hợp các phương thức không hành động trên dữ liệu cá thể và không được liên kết với một đối tượng cụ thể trong mã của bạn. Bạn có thể sử dụng một lớp tĩnh để giữ các phương thức đó.

-> Các tính năng chính của một lớp tĩnh là:

  • Họ chỉ chứa các thành viên tĩnh.
  • Chúng không thể được khởi tạo.
  • Chúng được niêm phong.
  • Chúng không thể chứa các Trình tạo lập trình hoặc các hàm tạo đơn giản như chúng ta biết rằng chúng được liên kết với các đối tượng và hoạt động trên dữ liệu khi một đối tượng được tạo.

Ví dụ

static class CollegeRegistration 
{ 
    //All static member variables 
    static int nCollegeId; //College Id will be same for all the students studying 
    static string sCollegeName; //Name will be same 
    static string sColegeAddress; //Address of the college will also same 

    //Member functions 
    public static int GetCollegeId() 
    { 
    nCollegeId = 100; 
    return (nCollegeID); 
    } 
    //similarly implementation of others also. 
} //class end 


public class student 
{ 
    int nRollNo; 
    string sName; 

    public GetRollNo() 
    { 
     nRollNo += 1; 
     return (nRollNo); 
    } 
    //similarly .... 
    public static void Main() 
    { 
    //Not required. 
    //CollegeRegistration objCollReg= new CollegeRegistration(); 

    //<ClassName>.<MethodName> 
    int cid= CollegeRegistration.GetCollegeId(); 
    string sname= CollegeRegistration.GetCollegeName(); 


    } //Main end 
} 
+0

bắt buộc bắt buộc bắt buộc bắt buộc bắt buộc –

3

lớp tĩnh có thể hữu ích trong các tình huống nhất định, nhưng có một tiềm năng lạm dụng và/hoặc lạm dụng chúng, giống như hầu hết các tính năng ngôn ngữ.

Như Dylan Smith đã đề cập, trường hợp rõ ràng nhất để sử dụng lớp tĩnh là nếu bạn có một lớp chỉ với các phương thức tĩnh. Không có điểm cho phép các nhà phát triển khởi tạo một lớp như vậy.

Thông báo trước là một sự dư thừa các phương pháp tĩnh có thể tự cho biết một lỗ hổng trong chiến lược thiết kế của bạn. Tôi thấy rằng khi bạn đang tạo ra một hàm tĩnh, nó là một điều tốt để tự hỏi bản thân - nó có phù hợp hơn với phương thức cá thể hay không, hoặc b) một phương thức mở rộng cho một giao diện. Ý tưởng ở đây là hành vi đối tượng thường được liên kết với trạng thái đối tượng, có nghĩa là hành vi phải thuộc về đối tượng. Bằng cách sử dụng hàm tĩnh bạn ngụ ý rằng hành vi không nên thuộc về bất kỳ đối tượng cụ thể nào.

Thiết kế đa hướng và giao diện điều khiển bị cản trở bởi việc lạm dụng các hàm tĩnh - chúng không thể được ghi đè lên trong các lớp dẫn xuất cũng như chúng không được gắn vào một giao diện.Thường thì tốt hơn để có các hàm 'trợ giúp' của bạn gắn với một giao diện thông qua một phương thức mở rộng sao cho tất cả các phiên bản của giao diện đều có quyền truy cập vào chức năng 'trợ giúp' được chia sẻ đó. Một trong những tình huống mà các hàm tĩnh chắc chắn hữu ích, theo ý kiến ​​của tôi, là tạo ra một phương thức .Create() hoặc .New() để thực hiện logic cho việc tạo đối tượng, ví dụ khi bạn muốn proxy đối tượng được tạo ra, ví dụ:

public class Foo 
{ 
    public static Foo New(string fooString) 
    { 
     ProxyGenerator generator = new ProxyGenerator(); 

     return (Foo)generator.CreateClassProxy 
      (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    } 

Điều này có thể được sử dụng với khung ủy quyền (như Castle Dynamic Proxy), nơi bạn muốn chặn/chèn chức năng vào đối tượng, dựa trên một số thuộc tính nhất định. Ý tưởng tổng thể là bạn cần một hàm tạo đặc biệt vì về mặt kỹ thuật bạn đang tạo một bản sao của cá thể ban đầu với chức năng được thêm vào đặc biệt.

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