2013-04-08 59 views
8

Vì vậy, tôi nghe nói rằng việc chứng thực một giá trị trong một tài sản như thế này:Xác nhận giá trị tài sản

//dummy example, let's assume that I want my value without dots 
public string MyProp 
{ 
    set 
    { 
     if(value.Contains('.')) 
      throw new ArgumentException("Must not contain '.'", "value"); 
    } 
} 

là sai và tôi nên tránh nó.

Nhưng trong những ngày trước đó, tôi được thông báo rằng đây là cách tốt. Chúng tôi có thể sử dụng đóng gói, chỉ có một nơi để kiểm tra, DRY, v.v.

Có gì sai với ví dụ nhỏ của tôi?

+0

không có gì sai với nó, nhưng a) Tôi muốn ném 'ArgumentException', b) bạn quên đặt giá trị thực sự! –

+0

Bạn không thể chỉ ném một chuỗi. Bạn cần phải ném một ngoại lệ. – Dan

+1

có thể trùng lặp của [C# thêm xác thực trên phương thức setter] (http://stackoverflow.com/questions/6127290/c-sharp-add-validation-on-a-setter-method) – jrummell

Trả lời

10

Không có gì sai với ném ngoại lệ trong một setter tài sản là. Nhưng bạn nên ném một số ArgumentException và cũng thực sự đặt giá trị của thuộc tính!

private string _myprop; 
public string MyProp{ 
    set{ 
     if(value.Contains('.')) throw new ArgumentException("Must not contain ."); 
     this._myprop=value; 
    } 
    get { return this._myprop; } 
} 

Từ một article on best practices in MSDN:

getters tài sản nên hoạt động đơn giản mà không cần bất kỳ điều kiện tiên quyết.Nếu một getter có thể ném một ngoại lệ, hãy xem xét việc thiết kế lại thuộc tính là một phương thức. Đề xuất này không áp dụng cho người lập chỉ mục. Người lập chỉ mục có thể ném ngoại lệ vì các đối số không hợp lệ.

Đó là hợp lệ và có thể chấp nhận để ném ngoại lệ từ trình thiết lập thuộc tính.

+0

Cảm ơn! Trên thực tế là ví dụ đơn giản cho trình diễn. –

-2

Xin xem: Best practices: throwing exceptions from properties cho một lời giải thích và thảo luận về lý do tại sao ném ngoại lệ từ tính là xấu.

Phải thừa nhận rằng bài đăng đó nói về getters tài sản. Những người định cư thường được nhìn thấy bởi người tiêu dùng chỉ đơn giản là thiết lập một lĩnh vực tư nhân ẩn bởi tài sản và có thể làm một số công cụ bổ sung theo yêu cầu, ngoại lệ là hành vi bất ngờ và bạn có thể tưởng tượng phải kèm theo mỗi câu lệnh set bên trong khối thử không? Không.

Mặc dù hành vi có thể được chấp nhận theo hướng dẫn, nhưng đó là một cơn ác mộng đối với nhà phát triển và logic hợp lệ phải được chứa trong một phương thức riêng và sau đó được gọi từ thuộc tính nếu cần.

Nếu bạn cần xác thực hoặc hành vi đặc biệt khi đặt thuộc tính, bạn nên sử dụng phương pháp đã đặt, ví dụ: SetMyProp(string value) vì nó mang lại một sự khác biệt với nó mà nó có thể dẫn đến một ngoại lệ, vv.

Nếu bạn đang sử dụng các thuộc tính cho mô hình WPF thì bạn nên sử dụng xác thực tích hợp của WPF cho dữ liệu thay thế.

+1

-1 bài viết bạn liên kết để nói rằng ngoại lệ trong ** setters ** là ok. Từ MSDN: "Nó là hợp lệ và chấp nhận được để ném ngoại lệ từ một trình thiết lập thuộc tính." –

+0

Bạn có thấy một vấn đề với một setter làm xác nhận (và ném một ngoại lệ) để thực thi hợp đồng của nó (ví dụ không cho phép một giá trị null được thiết lập)? – hatchet

+0

@hatchet có, tôi nghĩ rằng giá trị null là chấp nhận được hoặc cho các trường hợp cạnh mà giá trị * thực sự * không được đưa vào một biểu mẫu nhất định, nhưng nếu đó là giá trị "sai" trong ngữ cảnh sử dụng tiếp, các ngoại lệ nên diễn ra khi chúng được cố gắng sử dụng. – Clint

0

Có một số câu hỏi tương tự về SO.

Mức độ phù hợp của bạn phải nhẹ nhất có thể. Và nếu setters ném một lỗi này là ok nhưng một lần nữa bạn có thể xem xét di chuyển nó đến một chức năng. Mọi thứ có thể dễ dàng lộn xộn.

TRÁCH NHIỆM ném ngoại lệ từ getters tài sản. Bất động sản getters nên được hoạt động đơn giản và không nên có điều kiện tiên quyết. Nếu số getter có thể ném một ngoại lệ, nó có thể được thiết kế lại thành một phương pháp.

Best practices: throwing exceptions from properties

What exception to throw from a property setter?

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