2010-02-17 31 views
142

Tôi có một lớp học sử dụng một liệt kê, enum hiện đang trong tập tin riêng của mình mà có vẻ lãng phí.Nên enums trong C# có tập tin riêng của họ?

Ý kiến ​​chung về các enums được đặt trong không gian tên của tệp mà chúng được tiêu thụ là gì? Hoặc nên enum thực sự sống trong tập tin cs của riêng mình?

Sửa

tôi nên đề cập rằng trong khi các lớp trong câu hỏi sử dụng các kiểu liệt kê, thì những người gọi bên ngoài. Nói cách khác, một lớp khác có thể thiết lập các liệt kê này. Vì vậy, chúng không được sử dụng trong nội bộ cho lớp học, nếu không câu hỏi này sẽ không có trí tuệ.

+70

Nếu bạn sử dụng số ma thuật, bạn sẽ không gặp vấn đề gì cả. – MusiGenesis

+7

Đây có phải là wiki cộng đồng không? Không có câu trả lời đúng và không có những cân nhắc kỹ thuật thực sự ngoài khả năng của IDE. –

+1

Chúng vẫn có thể nằm trong cùng một không gian tên ngay cả khi chúng nằm trong các tệp khác nhau. Nếu bạn đang hỏi câu hỏi thứ hai về việc tạo một không gian tên .Enums VÀ một tệp mới, thì tôi sẽ nói, thường là, không. Nhưng nếu không, bạn có thể hiểu sai về không gian tên và nên đọc về chúng - (không nhiều đối với chúng, chỉ là cơ chế tổ chức) –

Trả lời

77

Tôi sẽ không nói "lãng phí" (chi phí thêm một tệp là bao nhiêu?), Nhưng điều này thường không thuận tiện. Thông thường có một lớp học được gắn chặt chẽ nhất với enum, và tôi đặt chúng trong cùng một tập tin.

+6

Nó thêm tiếng ồn vào thư mục khi duyệt, đó là những gì tôi có nghĩa là lãng phí. – Finglas

+88

@Finglas - tiếng ồn của một người là tín hiệu của người khác! –

+2

Thông thường có một lớp được liên kết chặt chẽ nhất. Nhưng nếu điều đó thay đổi, nếu ai đó đến cùng một lúc quyết định lấy một sự phụ thuộc vào enum, thì đó là thời gian cho một refactor. –

53

Đây hoàn toàn là vấn đề về phong cách. Những gì tôi có xu hướng làm là để có một tập tin gọi là Enums.cs trong các giải pháp trong đó khai báo enum được thu thập.

Tuy nhiên, chúng thường được tìm thấy thông qua khóa F12.

+4

tôi nghĩ rằng đây có lẽ là lựa chọn tốt nhất vì nó: 1) là chỉ có một file thay vì nhiều mà có thể được coi như là lộn xộn thư mục 2) là rõ ràng những gì được chứa bên trong file 3) phương tiện rằng bạn biết nơi để tìm một 'enum' thay vì nó được trong một tập tin có chứa một lớp học có liên quan nhưng không _necessarily_ lớp duy nhất sử dụng nó –

+3

Tôi hoàn toàn không thích điều này. Như đã nói trong câu trả lời của James Curran, enums có mối quan hệ với các lớp học chủ yếu. Khi đặt tất cả chúng vào một tệp chung, chúng thậm chí không nằm trong một thư mục (cho một không gian tên phụ) nữa, nơi chúng có thể thuộc về chủ đề. –

+2

Có @DebugErr, tôi đồng ý với bạn. Kể từ khi câu trả lời này được đăng trở lại vào năm 2010, tôi đã thay đổi giữa các cách tiếp cận khác nhau và có xu hướng đi với một tệp cho mỗi loại hoặc khai báo enums trong cùng một tệp với lớp có liên quan. –

59

Đây thực sự chỉ là vấn đề ưu tiên.

Tôi thích đặt từng liệt kê vào tệp riêng của nó (tương tự như vậy đối với mỗi giao diện, lớp và cấu trúc, dù nhỏ). Nó làm cho họ dễ dàng hơn để tìm thấy khi tôi đến từ một giải pháp khác hoặc nếu không không có một tham chiếu đến các loại trong câu hỏi.

Đặt một loại duy nhất trong mỗi tệp cũng giúp dễ dàng xác định các thay đổi trong hệ thống kiểm soát nguồn mà không bị phân biệt.

+8

"Đặt một loại duy nhất trong mỗi tệp cũng giúp dễ dàng xác định các thay đổi trong hệ thống kiểm soát nguồn mà không bị phân biệt." Một nỗi sợ hãi của sự khác biệt không nên tạo thành nền tảng cho các quyết định thiết kế của bạn. Tôi thậm chí còn cho rằng bất cứ ai không biết làm thế nào để phân biệt một tập tin trong kiểm soát nguồn là không thực sự sử dụng kiểm soát nguồn ở tất cả. – Dan

1

Tôi muốn có một tệp enums công khai có tên E chứa mỗi enum riêng biệt, sau đó bất kỳ enum có thể được truy cập với E ... và chúng ở một nơi để quản lý.

9

Nói chung tôi thích các enums của mình nằm trong cùng một tệp với Lớp mà nó có lẽ sẽ là thuộc tính của. Nếu ví dụ tôi có một lớp Task thì enum TaskStatus sẽ nằm trong cùng một tệp.

Tuy nhiên, nếu tôi có enums về bản chất chung chung hơn, thì tôi giữ chúng theo ngữ cảnh trong các tệp khác nhau.

7

Tôi nghĩ điều đó phụ thuộc vào phạm vi của enum. Ví dụ, nếu enum là cụ thể cho một lớp, ví dụ sử dụng để tránh kịch bản liên tục kỳ diệu, sau đó tôi sẽ nói đặt nó trong cùng một tập tin như các lớp:

enum SearchType { Forward, Reverse } 

Nếu enum là nói chung và có thể được sử dụng bởi một số lớp cho các kịch bản khác nhau, sau đó tôi sẽ nghiêng để sử dụng đặt nó trong tập tin riêng của mình. Ví dụ dưới đây có thể được sử dụng cho nhiều mục đích:

enum Result { Success, Error } 
5

Tôi có xu hướng đặt enums trong tập tin riêng của họ cho một lý do rất đơn giản: như với các lớp và cấu trúc, nó là tốt đẹp để biết chính xác nơi để xem xét nếu bạn muốn tìm định nghĩa của một loại: trong tệp có cùng tên. (Để công bằng, trong VS bạn luôn có thể sử dụng "Chuyển đến Định nghĩa").

Rõ ràng, nó có thể bị mất.Một đồng nghiệp nơi tôi làm việc thậm chí còn tạo các tệp riêng biệt cho các đại biểu.

17

Tôi đặt phần lớn bên trong vào không gian tên và bên ngoài lớp để dễ dàng truy cập các lớp khác trong không gian tên như dưới đây.

namespace UserManagement 
{ 
    public enum UserStatus { Active, InActive } 
    class User 
    { 
     ... 
    } 
} 
+0

Wow. Tôi không biết enums có thể được đặt vào không gian tên trực tiếp. Tôi sẽ đi với câu trả lời này. Bên trong cấu trúc MVC của tôi, chúng sẽ được đặt bên trong bộ điều khiển điều gì làm cho logic trở thành tôi. Cám ơn vì cái này. Được thăng hạng. – C4u

35

Câu hỏi đặt ra cho chính bạn là: có điều gì về kiểu liệt kê trong C# cho biết tôi nên xử lý nó khác với tất cả các loại khác tôi tạo không?

Nếu điều tra là công khai, nó sẽ được coi như bất kỳ loại công khai nào khác. Nếu nó là riêng tư, khai báo nó như là một thành viên lồng nhau của lớp bằng cách sử dụng nó. Không có lý do thuyết phục nào để đặt hai loại công khai trong cùng một tệp đơn giản vì một là một kiểu liệt kê. Thực tế là nó là một loại công cộng là tất cả những gì quan trọng; hương vị của loại không.

5

Một lợi thế của việc sử dụng một tệp riêng biệt cho enums là bạn có thể xóa lớp gốc sử dụng enum và viết một lớp mới bằng cách sử dụng enum.

Nếu enum độc lập với lớp gốc thì đặt nó vào một tệp riêng biệt sẽ làm cho các thay đổi trong tương lai dễ dàng hơn.

19

Một ưu điểm khác của việc đặt từng loại (lớp, cấu trúc, enum) vào tệp riêng của nó là kiểm soát nguồn. Bạn có thể dễ dàng có được toàn bộ lịch sử của loại.

7

Tùy thuộc vào quyền truy cập là cần thiết.

Nếu enum chỉ được sử dụng bởi một lớp duy nhất, bạn có thể khai báo trong lớp đó bởi vì bạn không cần sử dụng nó ở bất kỳ nơi nào khác.

Đối với các enums được nhiều lớp hoặc trong API công khai sử dụng, thì tôi sẽ luôn giữ định nghĩa trong tệp riêng của nó trong không gian tên thích hợp. Nó dễ dàng hơn nhiều để tìm theo cách đó, và chiến lược theo mô hình của một đối tượng cho mỗi tập tin, đó là tốt để sử dụng với các lớp học và giao diện là tốt.

5

Nếu bạn đang sử dụng trình bổ sung Trình duyệt tệp USysWare cho Visual Studio, bạn có thể tìm nhanh các tệp có tên cụ thể trong giải pháp của mình. Hãy tưởng tượng tìm kiếm một enum mà không phải là trong tập tin riêng của mình mà thay vào đó chôn trong một số tập tin trong một giải pháp khổng lồ.

Đối với các giải pháp nhỏ, nó không quan trọng, nhưng đối với những giải pháp lớn, nó trở nên quan trọng hơn để giữ cho các lớp và enums trong các tệp riêng của chúng. Bạn có thể nhanh chóng tìm thấy chúng, chỉnh sửa chúng và hơn thế nữa. Tôi rất cao, khuyên bạn nên đặt enum của bạn trong tập tin riêng của mình.

Và như đã nêu ... Làm thế nào lãng phí là một tập tin mà kết thúc lên chỉ là một vài kb anyways?

+0

Tôi sử dụng bổ trợ đó, nó khá tiện dụng. Tôi sẽ đặt enums vào tập tin riêng của họ, không có vấn đề nếu các giải pháp là lớn hay nhỏ. –

0

Nếu bạn có nhiều dự án trong một giải pháp. Sau đó, tốt hơn hãy tạo một dự án khác Utilities. Sau đó, tạo một Thư mục \Enumerations và tạo một số lồng nhau static class. Và sau đó gán mỗi lớp tĩnh, nơi bạn sẽ tạo enum tương ứng với tên của dự án của bạn. Ví dụ bạn có một dự án có tên DatabaseReader và DatabaseUsers thì bạn có thể đặt tên cho lớp tĩnh như

public static class EnumUtility { 
    #region --Database Readers Enum 
    public static class EnumDBReader { 
     public enum Actions { Create, Retrieve, Update, Delete}; 
    } 
    #endregion 

    #region --Database Users Enum 
    public static class EnumDBUsers { 
     public enum UserIdentity { user, admin }; 
    } 
    #endregion 

} 

Sau đó, toàn bộ enum có thể được sử dụng trong toàn bộ giải pháp cho mỗi dự án sẽ được công bố vào nó. Sử dụng # region để tách từng mối quan tâm. Bằng cách này, việc tìm kiếm bất kỳ enums nào cũng dễ dàng hơn

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