2009-04-02 20 views
9

Xét đoạn mã sau:Có cách nào để cảnh báo hiển thị trình biên dịch C# khi một câu lệnh chuyển đổi có các trường hợp không được giải quyết không?

 private enum myEnum 
     { 
      A, 
      B 
     } 
     private void myMethod(myEnum m) 
     { 
      switch (m) 
      { 
       case myEnum.A: 
        //do stuff 
       break; 
       case myEnum.B: 
        //do stuff 
       break; 
       default: 
        throw new NotImplementedException(m.ToString()); 
      } 
     } 

Nếu tôi bao giờ thêm một thành viên C thứ ba để MyEnum, tôi sẽ chỉ được cảnh báo trong thời gian chạy bởi một NotImplementedException

Những gì tôi muốn làm là có trình biên dịch cảnh báo tôi khi có chuyển đổi với các trường hợp chưa được xử lý không có mặc định: trường hợp.

Có cách nào để làm điều đó, hoặc giải pháp khác cho vấn đề này, mục tiêu cuối cùng đang được cảnh báo lúc biên dịch-thời gian mà một cái gì đó là mất tích?

Trả lời

6

Thật không may ở đây không có tính năng trình biên dịch để thực hiện việc này cho bạn.

Thay vì có enum, có lớp cơ sở hoặc giao diện. MyMethod được xác định trên giao diện.

Mỗi thành viên enum bây giờ sẽ trở thành một lớp với hành vi khác nhau cho myMethod. Nếu bạn thêm một lớp (để mở rộng các tùy chọn, hiện tại bạn muốn thêm một mục enum) nhưng không triển khai myMethod, bạn sẽ nhận được một lỗi trình biên dịch.

có nhiều vị trí trong mã nơi bạn cung cấp hành vi khác nhau trong các câu lệnh chọn là mùi mà bạn có thể cần phải sử dụng đa hình.

EDIT

Lời khuyên tốt nhất mà tôi có thể đưa ra là xây dựng các unit test cho mỗi chức năng dựa vào câu lệnh switch, và gọi nó là cho mỗi giá trị trong điều tra (bạn có thể nhận các giá trị trong thời gian chạy với thành viên GetValues ​​trong lớp Enum)

+0

Đó là một điểm tốt. Nhưng trong tình huống của tôi, tôi không nghĩ rằng nó áp dụng (nó sẽ dẫn đến hầu hết các lớp học trống rỗng, có chứa một số logic đó không phải là trách nhiệm của họ.Thông thường, tôi có một số DataContracts chứa thành viên được liệt kê, và GUI của tôi chuyển sang các thành viên đó để xem cách định dạng chúng.) – Brann

+0

Một mẫu tốt, nhưng hãy sử dụng nó cẩn thận. Nếu enum của bạn là lớn và chuyển đổi của bạn chỉ cần xử lý một vài trường hợp bạn có thể không muốn tạo ra một lớp học tỷ. –

+0

+1 để chỉnh sửa. =) –

1

Không, không có ngôn ngữ nào để kiểm tra điều này.

Bạn có thể có một:

default: 
    throw new ArgumentOutOfRangeException("Invalid value or bug"); 

trường hợp, nhưng rõ ràng đó là thực hiện theo thời gian chứ không phải là thời gian biên dịch.

1

Không bao giờ sử dụng, nhưng FxCop có thể hữu ích. Nó hỗ trợ viết các quy tắc tùy chỉnh. Tất nhiên, đó không phải là một kiểm tra thời gian biên dịch, nhưng cái gì đó có thể được tích hợp vào các quá trình của bạn.

0

Điều này có thể trở thành cơn ác mộng về bảo trì, đã phải tốn nhiều thời gian để cố gắng gỡ lỗi giá trị enum mất tích trong câu lệnh chuyển đổi.

Wrote một lớp học nhỏ để lập báo cáo chuyển đổi hơn một chút bảo trì thân thiện hơn,

enter image description here

Lớp làm cho chắc chắn rằng tất cả các giá trị enum là một trong hai xử lý hoặc dứt khoát bỏ qua, nó ném một NotImplementedExpcetion khác.

Kiểm tra mã nguồn và biết thêm chi tiết here

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