2012-11-14 68 views
10

Gần đây tôi đã phát hiện ra rằng các cấu trúc trong C# có thể có các phương thức.Sự khác nhau giữa phương pháp cấu trúc tĩnh và phương thức lớp tĩnh là gì?

Khá vô tình, tôi thấy mình đã sử dụng phương pháp tĩnh của một cấu trúc trống trong mã của tôi, chứ không phải là phương pháp tĩnh của một lớp tĩnh mà tôi nghĩ rằng tôi đã làm việc với!

ví dụ:

public struct Foo 
{ 
    public static void Bar(Param param) 
    { 
     ... 
    } 
} 

Nó không thực sự được sử dụng như một cấu trúc tại thời điểm này, vì nó không có thuộc tính nào cả!

Điều này rất khác với việc sử dụng phương pháp tĩnh của một lớp (tĩnh hay cách khác)? Có lý do nào để thích cái này hơn cái kia không? (Ruột của tôi nói với tôi rằng việc sử dụng các phương pháp cấu trúc tĩnh, ở mức tối thiểu, ít trực quan)

Trả lời

16

Không, các thành viên tĩnh thuộc về loại và không trường hợp của các loại. Không có sự khác biệt (không liên quan đến hiệu suất cũng như ngữ nghĩa) giữa khai báo các thành viên lớp tĩnh và các thành viên cấu trúc tĩnh. Điều quan trọng cần lưu ý là nếu chức năng duy nhất của một loại là chứa các thành viên tĩnh, bạn nên sử dụng một lớp tĩnh để thay thế. Các tính năng chính Với các cấu trúc, có một hàm tạo công khai, không có tham số và không thể thay đổi được. Nếu loại sẽ không có bất kỳ phương pháp thể hiện nào, khả năng tạo các cá thể cần được loại bỏ. Khai báo một lớp static giống như khai báo nó abstract sealed, vì vậy các nhà phát triển sẽ không thể vô tình tạo ra các cá thể không có mục đích.

+3

Khai báo một lớp 'tĩnh' có lợi ích bổ sung (trên' niêm phong trừu tượng') cho phép trình biên dịch gắn cờ bất kỳ tập quán nào của loại trong khai báo biến hoặc phôi là lỗi. –

+0

@mikez Điều đó cũng vậy, cũng như gắn cờ bất kỳ tuyên bố thành viên cá thể nào là lỗi. – cdhowie

+3

@mikez Tôi nghĩ sự khác biệt quan trọng hơn là 'lớp niêm phong trừu tượng' đơn giản là không hợp lệ C#. – svick

3

Hành vi không khác biệt. C# bastardized structs bằng cách tăng cực kỳ giao điểm của cấu trúc và các tính năng lớp. Cá nhân tôi sẽ chỉ sử dụng một lớp bởi vì nó có vẻ chính xác hơn với tôi (chắc chắn là phù hợp hơn với các quy ước trong hầu hết các ngôn ngữ).

+0

Có thể định nghĩa các phương thức và hàm tạo cho các cấu trúc trong C++, vì vậy nó không phải là một tính năng hoàn toàn mới được giới thiệu lần đầu tiên trong C#. – Jagger

+0

Điều gì về cấu trúc có tập lệnh '[StructLayout (LayoutKind.Explicit)]'? Điều đó không thể được thay thế bởi một lớp học. –

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