2010-09-16 35 views
9

Tôi luôn luôn sử dụng để xem xét cấu trúc như một số loại đặc quyền thấp hơn, hoặc một cái gì đó với các tính năng thấp hơn. Có lẽ vì các khái niệm OOP thổi tất cả mọi thứ vào Lớp học.Tại sao Cấu trúc tĩnh không được phép trong C#?

Từ mức độ tiếp xúc nhỏ với C#, tôi hiểu rằng Đặt một lớp tĩnh, đảm bảo rằng tất cả các thành viên của lớp & đều là tĩnh. Ngoài ra, chúng ta không thể có một hàm khởi tạo để khởi tạo lớp đó vì chỉ có một cá thể duy nhất.

public static struct mystruct 
{ 
    public static int a; 
} 

Tôi đã được chỉ ra ngay tại đây khi lỗi tràn mà đây là phương pháp sai. Ai đó có thể xây dựng được.

Tôi nhận được lỗi thích hợp cho biết "tĩnh không hợp lệ cho mục này" khi tôi tạo tệp cs mới & biên dịch trong bảng điều khiển. Thật kỳ lạ khi tôi thêm điều này vào một dự án làm việc hiện có để xem trình biên dịch có phàn nàn hay không nhưng tôi không ngạc nhiên. Bất kỳ lý do cho điều này?

+6

Trong C#, 'static' là một bí danh cho' sealed' trừu tượng trên khai báo kiểu (nó cũng cho phép một số kiểm tra thời gian biên dịch khác như đảm bảo phương pháp này tĩnh quá). Vì các cấu trúc là các kiểu giá trị và không cho phép hành vi đa hình, thì nó có ý nghĩa tại sao 'static' không được phép. Tuy nhiên, bạn có thể có các thành viên tĩnh trên một cấu trúc. –

+2

@Steve: Nếu lớp là tĩnh, trình biên dịch cũng kiểm tra * sử dụng * của tên loại. Ví dụ, bạn không thể khai báo một tham số kiểu Enumerable. Bạn cũng có thể đã nhận thức được điều đó, nhưng tôi muốn thu hút sự chú ý đến nó :) –

+0

@Jon: Đúng vậy - cảm ơn bạn đã nhắc tôi về điều đó. –

Trả lời

17

Lớp tĩnh chỉ là vùng chứa cho các thành viên tĩnh (thuộc bất kỳ loại trường nào, sự kiện, thuộc tính và phương pháp phổ biến nhất).

Cấu trúc tĩnh sẽ giống hệt nhau, vì vậy sẽ không cung cấp bất kỳ lợi thế nào - nhưng độc giả có thể nghĩ rằng nó có ý nghĩa đặc biệt. Để tránh nhầm lẫn, nó bị cấm. Về mặt khái niệm, nó có ý nghĩa như một lớp tĩnh, tất nhiên - sự khác biệt giữa các cấu trúc và các lớp thực sự là về cách trường hợp trong số chúng hoạt động, và vì sẽ không có trường hợp kiểu tĩnh nào sẽ là tranh luận.

(Không phải là tôi đã tham gia cuộc họp thiết kế, điều này đã được quyết định, dĩ nhiên Eric Lippert cũng có thể tìm thấy một số lưu ý về nó. Ở trên chỉ là một phỏng đoán được giáo dục. vấn đề, theo như tôi có thể thấy.)

+2

Bạn có nghĩa là bạn * không * trong cuộc họp thiết kế? –

+1

@Dan: Than ôi, tôi chưa từng tham gia bất kỳ cuộc họp thiết kế C# nào. Tôi sẽ * yêu * là, tất nhiên. –

+0

@Jon: Xin lỗi, tôi chỉ đọc câu sai lần đầu tiên. Cá nhân, tôi nghĩ rằng tôi sẽ * ghét * để được tại một cuộc họp như vậy ... quá nhiều áp lực để đưa ra quyết định thông minh! –

8

Điều này không thực hiện được gì. Bạn vẫn sẽ có một tập hợp các phương thức tĩnh giống như bạn làm với một lớp tĩnh. Một cấu trúc trong C# ngụ ý nó là một kiểu giá trị thay vì một kiểu tham chiếu, mà không có ý nghĩa ở mức tĩnh.

1

Khái niệm về loại tĩnh không có ý nghĩa đối với cấu trúc. Các cấu trúc ngụ ý ngữ nghĩa theo từng giá trị - điều này chỉ có ý nghĩa khi bạn có thể khởi tạo một loại. Các lớp tĩnh đã được giới thiệu để giúp dễ dàng nhóm các phương thức tĩnh lại với nhau thành một kiểu không thể khởi tạo được. Việc cho phép các cấu trúc tĩnh sẽ là cả dư thừa và khó hiểu.

Hãy suy nghĩ về điều đó theo cách này. static class Foostatic struct Foo khác nhau về hành vi như thế nào? Và nếu họ không ... tại sao lại giới thiệu một khái niệm static struct? Nó chỉ có thể gây nhầm lẫn cho mọi người nghĩ rằng có sự khác biệt ...

+0

Tôi lấy ý kiến ​​của bạn. Nhưng chắc chắn "class" ngụ ý ngữ nghĩa copy-by-reference, khả năng tạo các cá thể và chia sẻ các chi tiết thực hiện thông qua kế thừa, không cái nào trong số đó đúng với các lớp tĩnh. Nó không phải là tất cả rõ ràng rằng lớp tĩnh là * tốt hơn * so với cấu trúc tĩnh, và nó được cho là tồi tệ hơn. –

+0

@Eric: Thật vậy nó ... và có lẽ một số loại thứ ba của khái niệm (mô-đun như bạn đề cập trong bình luận của bạn để bài viết của Jon) có thể đã được tốt hơn. Tôi đoán những gì tôi đã cố gắng để nói (nghèo) là có * cả hai * lớp tĩnh và cấu trúc tĩnh sẽ gây nhầm lẫn và ngụ ý một sự khác biệt hành vi mà không tồn tại. – LBushkin

1

Vì tĩnh không được xác định là được phép trong ngôn ngữ được áp dụng cho cấu trúc.

lớp tĩnh đã xác định cùng một khả năng.

+0

bất kỳ lý do nào cho liên kết cổ đại? –

+0

@John: Cảm ơn bạn đã chỉ ra điều đó. Sửa chữa bằng cách loại bỏ nó.Chỉ là điều đầu tiên xuất hiện trên Google khi tôi tìm kiếm trang tham chiếu. –

3

Nộp theo "đó chỉ là cách nó". Vì bạn có thể làm điều đó với một lớp tĩnh, không có lý do để cho phép cấu trúc tĩnh. Nó sẽ gây nhầm lẫn cho mọi người về sự khác biệt giữa chúng. Họ phải chọn cái này hay cái kia.

3

Also we cannot have a constructor to initialize that class as there is only a single instance.

Thực tế, có không thể hiện của lớp tĩnh. Loại giải thích thiếu sự hỗ trợ cho các cấu trúc tĩnh - hay đúng hơn, việc thiếu bất kỳ nào cần cho một điều như vậy.

Sự khác biệt giữa các loại tham chiếu và loại giá trị trong .NET (classstruct trong C#) là hoàn toàn về cách trường hợp của các loại này được xử lý. Một thể hiện của một kiểu tham chiếu được truy cập thông qua một tham chiếu cho cá thể đó dưới dạng biến. Bản sao cho các tham chiếu như vậy được chuyển qua lại giữa các cuộc gọi phương thức. Một thể hiện của một kiểu giá trị được truy cập trực tiếp, và các bản sao của cá thể đó được truyền đi giữa các cuộc gọi phương thức.

Không có ví dụ để nói về, sự khác biệt này trở nên không liên quan; vì vậy bất kỳ loại nào bao gồm thuần túy các thành viên tĩnh cũng có thể là một lớp tĩnh.

3

Không Instance Dòng Initializers

Trong một lớp học, chúng tôi được phép để tạo ra một lĩnh vực/biến và khởi tạo nó cùng một lúc Một cấu trúc không thể chứa khởi như vậy. Các trường này phải được khởi tạo thông qua các hàm hoặc bằng cách sử dụng chính đối tượng đó. Các trường không thể có giá trị ban đầu tại thời điểm tạo. Mã sau đây đưa ra lỗi:

struct Point 
{ 
    public int x = 20; // Error its not possible to initialize 
    public int y=20; // Error its not possible to initialize 
} 

Tuy nhiên, cấu trúc có thể chứa các trường tĩnh có thể được khởi tạo bên trong cấu trúc. Ví dụ sau đây cho thấy việc sử dụng các trường tĩnh bên trong một cấu trúc.

struct Point { 
     public static int x = 25; 
     public static int y = 50; 
} 

Struct & Phương pháp

Một C# struct cũng có thể chứa các phương pháp. Các phương thức có thể là tĩnh hoặc không tĩnh. Nhưng các phương thức tĩnh có thể truy cập chỉ các thành viên tĩnh khác và chúng không thể gọi bằng cách sử dụng một đối tượng của cấu trúc. Họ có thể gọi chỉ bằng cách sử dụng tên struct.

struct Point 
{  
    static int x = 25;  
    static int y = 50; 
    public void SetXY(int i, int j)  
    {   
     x = i;   
     y = j;  
    }  

    public static void ShowSum()    
    {   
     int sum = x + y;   
     Console.WriteLine("The sum is {0}",sum);  
    } 
} 

như tìm thấy trên "http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120"

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