2009-05-20 25 views
9

Trong another SO question, Tôi đã thấy một số người khuyên tôi luôn sử dụng TryGetValue.Tôi có nên luôn sử dụng TryGetValue để truy cập từ điển .net không?

Trong khi tôi luôn sử dụng TryGetValue trên mẫu Chứa/Truy cập, tôi tránh mẫu này khi có ý định khi tôi mong đợi khóa luôn nằm trong từ điển. Sau đó tôi truy cập trực tiếp vào trình lập chỉ mục, do đó, một ngoại lệ được nêu ra nếu khóa không có ở đó, vì có điều gì đó không mong muốn thực sự xảy ra (tức là khóa không có trong từ điển trong khi tôi mong đợi nó).

Vì dường như có sự đồng thuận chung chống lại "thực hành tốt nhất" của tôi (3 trong số 4 người trên bài đăng mà tôi đã đề cập một cách rõ ràng nên sử dụng TryGetValue mọi lúc), tôi rất sẵn sàng đọc một cuộc thảo luận mở rộng về chủ đề đó ...

Trả lời

13

Không, bạn hoàn toàn đúng IMO.

Không có điểm nào trong thực hiện:

if (dict.TryGetValue(key, out value)) 
{ 
    // whatever 
} 
else 
{ 
    throw new SomeException("key '" + key + "' wasn't in dictionary"); 
} 

Lợi ích duy nhất của rằng hơn:

value = dict[key]; 

là bạn nhận được một thông điệp ngoại lệ rõ ràng hơn ... nhưng phải trả giá bằng khả năng đọc, IMO.

Nó giống như đúc vs sử dụng as - ngoại lệ là kết quả phù hợp khi trạng thái "sai", do đó hãy sử dụng biểu mẫu cung cấp hành vi đó.

+2

Bạn có thể thêm khóa thực vào thông báo ngoại lệ nếu bạn thực hiện TryGetValue/throw, đây là điều mà KeyNotFoundException mặc định không thực hiện được (trừ khi tôi thiếu một thứ gì đó). – Skizz

1

Nếu sự vắng mặt của khóa là ngoại lệ, bạn có thể tăng ngoại lệ, imho.

0

Nếu đó là hành vi ngoại lệ cho khóa không tồn tại trong từ điển của bạn (nó giống như âm thanh), thì tốt hơn là để ngoại lệ được phát hiện nếu khóa không được tìm thấy và cho phép ngoại lệ đó truyền xuống cây rơm. Nếu bạn muốn sử dụng một thực hành lập trình phòng thủ, bạn có thể sử dụng sau đây trước khi bạn truy cập vào chìa khóa từ điển:

Debug.Assert(Dictionary.ContainsKey(Key)); 

Bạn chỉ thực sự cần phải sử dụng TryGetValue nếu bạn mong đợi những tình huống mà chìa khóa có thể không tồn tại, hoặc nếu bạn muốn chạy mã nhất định trong trường hợp khóa không tồn tại.

2

Nếu khóa được mong đợi bị thiếu, sử dụng TryGetValue thường dẫn đến mã sạch hơn và hiệu quả hơn. Nếu khóa được mong đợi là có mặt, thì truy cập lập chỉ mục trực tiếp thường tốt hơn - ngoại lệ cho biết một lỗi.

ContainsKey thường chỉ được sử dụng nếu không cần giá trị tương ứng.

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