Enums trong C # nên có tập tin riêng của họ? [đóng cửa]


178

Tôi có một lớp sử dụng một bảng liệt kê, enum hiện đang ở trong tệp riêng của nó có vẻ lãng phí.

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

Biên tập

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


86
Nếu bạn đã sử dụng số ma thuật, bạn sẽ không gặp phải vấn đề này.
MusiGenesis

7
Đây có nên là wiki cộng đồng? Không có câu trả lời chính xác và không có cân nhắc kỹ thuật thực sự ngoài khả năng IDE.
Jeff Sternal

1
Chúng vẫn có thể ở trong cùng một không gian tên ngay cả khi chúng ở trong các tệp khác nhau. Nếu bạn đang hỏi câu hỏi phụ về việc có nên tạo một không gian tên .Enums VÀ một tệp mới hay không, thì tôi thường nói 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à một cơ chế tổ chức)
Jason Kleban

1
Khai báo enum trong tệp riêng của nó cho phép lập trình viên dễ dàng xác định vị trí của enum bằng cách sử dụng cửa sổ lệnh (> của [tên enum])
Riju 10/2/2015

Câu trả lời:


103

Tôi sẽ không nói "lãng phí" (một tập tin bổ sung có giá bao nhiêu?), Nhưng nó thường bất tiện. Thông thường có một lớp được kết hợp chặt chẽ nhất với enum và tôi đặt chúng vào cùng một tệp.


7
Nó thêm tiếng ồn vào thư mục khi duyệt, đó là những gì tôi muốn nói là lãng phí.
Fingerlas

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

6
Thông thường có một lớp liên quan chặt chẽ nhất. Nhưng nếu điều đó thay đổi, nếu ai đó đi cùng một lúc quyết định phụ thuộc vào enum, thì đó là lúc để tái cấu trúc.
Giáo hoàng Brennan

2
Nếu enum được chia sẻ giữa các lớp khác nhau, tốt nhất là đặt nó trong một tệp riêng.
Konrad

76

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

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


10
"Đặt một loại duy nhất trong mỗi tệp cũng giúp xác định các thay đổi trong hệ thống kiểm soát nguồn dễ dàng hơn mà không bị chênh lệch." Nỗi 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 lập luận rằng bất kỳ ai không biết cách khác biệt một tệp trong kiểm soát nguồn đều không thực sự sử dụng kiểm soát nguồn.
Dan Bechard 24/2/2015

59

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

Nhưng dù sao chúng thường được tìm thấy thông qua F12khóa.


4
Tôi nghĩ rằng đây có lẽ là tùy chọn tốt nhất vì nó: 1) chỉ là một tệp thay vì nhiều tệp có thể được coi là làm lộn xộn thư mục 2) rõ ràng những gì được chứa trong tệp 3) có nghĩa là bạn biết nơi tìm một enumthay vì nó nằm trong một tệp chứa một lớp có liên quan nhưng không nhất thiết là lớp duy nhất sử dụng nó
dav_i

6
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, enum có mối quan hệ với các lớp học là chủ yếu. Khi đặt tất cả chúng vào một tệp toàn cầu, chúng thậm chí không nằm trong một thư mục (đối với không gian tên phụ) nữa, nơi chúng có thể thuộc về chủ đề.
Ray

3
Có @DebugErr, tôi đồng ý với bạn. Vì câu trả lời này đã được đăng 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 enum trong cùng một tệp với lớp liên quan.
Fredrik Mörk

@Ray ...enums have a relation to classes mostly.. Đây là nơi bạn mất tôi. Xin cho một ví dụ về cách bạn sẽ xử lý các enum có quan hệ với một số lớp?
K - Độc tính trong SO đang tăng lên.

@KarlMorrison Xin vui lòng, nhận xét đó là 5 tuổi. Dù sao, tôi đã thêm từ "chủ yếu" vì một lý do. Enums có mối quan hệ với nhiều hơn là chỉ các lớp, giống như không gian tên. Nếu tôi có một AnchorStyleenum được sử dụng trong toàn bộ thư viện UI, thông thường tôi cũng có một không gian tên phụ UI và thư mục tương ứng. Sau đó, tôi sẽ đặt nó trong một AnchorStyle.cstệp trong thư mục UI nơi tôi có thể dễ dàng tìm thấy nó, chứ không phải trong tệp "Enums.cs" có tên chung.
Ray

47

Câu hỏi để tự hỏi mình là: có bất cứ điều gì về một kiểu liệt kê trong C # chỉ ra rằng tôi nên đối xử với nó khác với tất cả các loại khác mà tôi tạo ra không?

Nếu liệt kê là công khai, nó nên được đối xử như bất kỳ loại công khai nào khác. Nếu nó là riêng tư, khai báo nó 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 để đặt hai loại công khai trong cùng một tệp chỉ vì một loại là liệt kê. Thực tế rằng 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.


Còn nếu bạn muốn sử dụng lại enum trong một giải pháp khác nhau của cùng một dự án doanh nghiệp thì sao? Các ràng buộc ràng buộc với lớp sử dụng nó sẽ rất khó khăn để sử dụng lại nó.
mko

@mko: Tham chiếu dự án đã có nghĩa là cả lớp và enum sẽ có sẵn cho các giải pháp khác nhau. Điều gì sẽ gây khó khăn?
Bryan Watts

Chắc chắn, nhưng bạn có thực sự muốn chia sẻ toàn bộ lớp với logic của nó nếu bạn chỉ muốn sử dụng enums. Hơn nữa những gì nếu một lớp khác chia sẻ cùng một bảng liệt kê. Bạn sẽ đặt nó ở đâu?
mko

@mko: Với tham chiếu dự án, bạn sẽ nhận được cả hai loại cho dù chúng có trong các tệp khác nhau hay không. Tôi đang gặp khó khăn để tìm ra những gì bạn đang hỏi.
Bryan Watts

Vâng, tôi không nói về tài liệu tham khảo dự án, bạn đang có. Tôi đang nói về việc chuyển enum sang một tệp dự án được chia sẻ và có thể sử dụng lại nó trong nhiều dự án mà không để lộ toàn bộ các lớp. Bạn nói "Không có lý do thuyết phục nào để đặt hai loại công khai vào cùng một tệp chỉ vì một loại là liệt kê". Có thể có một lý do để đặt tất cả các enum trong cùng một tệp nếu bạn làm theo lời giải thích của tôi.
mko

24

Một ưu điểm khác của việc đặt từng loại (lớp, struct, enum) trong 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.


18

Tôi đặt chủ yếu bên trong không gian tên và bên ngoài lớp để có thể dễ dàng truy cập các lớp khác trong không gian tên như bên dưới.

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

Ồ Tôi không biết enums có thể được đặt trực tiếp vào không gian tên. 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 tạo ra logic cho tôi. Cảm ơn vì điều đó. Nâng cao.
C4d

11

Nói chung, tôi thích các enum của mình ở cùng một tệp với Class mà nó có thể sẽ là một thuộc tính nhất. Nếu ví dụ tôi có một lớp Taskthì enum TaskStatussẽ nằm trong cùng một tệp.

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


Điều gì nếu lớp khác nhau cũng sử dụng cùng enum?
mko

2
@mko - Đó là lý do tại sao tôi đã nói (trở lại năm 2010 khi tôi trả lời điều này) rằng nếu enum có tính chất chung chung hơn, tôi sẽ giữ chúng trong các tệp riêng biệt. Theo ngữ cảnh, tôi có nghĩa là trong một số trường hợp, một số enum có thể nằm trong một tệp riêng biệt và trong các trường hợp khác, tôi có thể nhóm một tập hợp các khai báo enum trong một tệp duy nhất.
Nikos Steiakakis

10

Nó phụ thuộc vào những gì cần thiết truy cập.

Nếu enum chỉ được sử dụng bởi một lớp duy nhất, bạn có thể khai báo nó trong lớp đó 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 enum được sử dụng bởi nhiều lớp hoặc trong API công khai, thì tôi sẽ luôn giữ định nghĩa trong tệp riêng của mình trong không gian tên thích hợp. Cách đó dễ dàng hơn nhiều và chiến lược đi theo mô hình một đối tượng trên mỗi tệp, cũng rất tốt để sử dụng với các lớp và giao diện.


8

Tôi nghĩ rằng nó phụ thuộc vào phạm vi của enum. Ví dụ, nếu enum dành riêng cho một lớp, ví dụ được sử dụng để tránh kịch bản hằng số ma thuật, thì tôi sẽ nói hãy đặt nó trong cùng một tệp với lớp:

enum SearchType { Forward, Reverse }

Nếu enum là 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, thì tôi sẽ có xu hướng sử dụng đặt nó trong tệp riêng của nó. Ví dụ, dưới đây có thể được sử dụng cho một số mục đích:

enum Result { Success, Error }

6

Tôi có xu hướng đặt enum vào tệp riêng của họ vì một lý do rất đơn giản: như với các lớp và cấu trúc, thật tuyệt khi biết chính xác nơi cần tìm nếu bạn muốn tìm định nghĩa của một loại: trong tệp 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ể ra khỏi tầm tay. Một đồng nghiệp nơi tôi làm việc thậm chí tạo các tệp riêng cho đại biểu.


6

Một lợi thế của việc sử dụng một tệp riêng cho enum 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 enum.

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


6

Nếu bạn đang sử dụng bổ trợ Trình duyệt tệp USysWare cho Visual Studio, bạn có thể nhanh chóng tìm thấy 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 không có trong tệp riêng của nó mà thay vào đó được chôn trong một số tệp trong một giải pháp khổng lồ.

Đối với các giải pháp nhỏ, điều đó không thành vấn đề, nhưng đối với các giải pháp lớn, việc giữ các lớp và enum trong các tệp riêng của chúng trở nên quan trọng hơn. Bạn có thể nhanh chóng tìm thấy chúng, chỉnh sửa chúng, và nhiều hơn nữa. Tôi rất, rất 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ói ... Làm thế nào lãng phí là một tập tin cuối cùng chỉ là một vài kb?


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

5

Rất đơn giản lợi thế rất lớn để tách tập tin. Khi bất kỳ đối tượng nào nằm trong tệp MyObjectName.cs của chính nó ... bạn có thể truy cập giải pháp thám hiểm và nhập MyObjectName.cs và được hiển thị chính xác 1 tệp. Bất cứ điều gì làm cho gỡ lỗi tốt hơn là tốt đẹp.

Một ưu điểm khác trên một ghi chú tương tự, nếu bạn tìm kiếm tất cả các tệp ( ctrl+ shft+ F) cho một tên, bạn có thể tìm thấy 20 tham chiếu đến tên trong cùng một tệp ... và tên được tìm thấy sẽ là một phần của các đối tượng khác nhau. Trong cửa sổ Tìm kết quả, tất cả những gì bạn có thể thấy là số dòng và tên tệp. Bạn sẽ phải mở tệp và cuộn để tìm ra đối tượng được tìm thấy trong đó.

Bất cứ điều gì làm cho việc gỡ lỗi dễ dàng hơn, tôi thích.


3

Nếu bạn có nhiều dự án trong một giải pháp. Sau đó tốt hơn tạo một dự án khác Utilities. Sau đó tạo một Thư mục \Enumerationsvà tạo một lồng nhau static class. Và sau đó chỉ định mỗi lớp tĩnh nơi bạn sẽ tạo enum tương ứng với tên của các dự án của bạn. Ví dụ: bạn có một dự án có tên là 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 khai báo trên đó. Sử dụng # regionđể phân tách từng mối quan tâm. Bằng cách này, nó dễ dàng hơn để tìm kiếm bất kỳ enum


1

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.