2013-03-01 21 views
5

Khi tôi hiểu và đọc bạn có thể sử dụng mạch ngắn trong câu lệnh if (& & hoặc ||) để điều kiện thứ hai không kích hoạt. và nếu bạn muốn cả hai điều kiện để bắn bạn sẽ sử dụng toán hạng đơn (& hoặc |).Inline If statement - short-circuiting

Vì vậy, nói nếu tôi có inline lệnh if như sau:

var test = (MyObject != null || string.IsNullOrEmpty(MyObject.Property)) ? string.Empty : MyObject.Property; 

này sẽ ném object reference lỗi nếu MyObject là null, mà theo ý kiến ​​của tôi nên không phải là tôi đang sử dụng mạch ngắn. Ai đó có thể giải thích điều này.

+3

Bạn' lại thiếu dấu ngoặc đơn trước dấu '?'. – Corak

+0

@Corak yes đã bỏ lỡ khung cuối cùng ...chỉnh sửa ngay bây giờ – Zaki

Trả lời

13

Bạn đang sử dụng sai điều kiện. Phần này:

MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

nên là:

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

Các RHS của một || chỉ thực hiện nếu tay trái là sai. Bạn chỉ muốn thực thi nếu MyObjectkhông phải không.

EDIT: Nếu bạn thực sự muốn phần MyObject != null, bạn có thể thay đổi toàn bộ điều để:

var test = MyObject != null && !string.IsNullOrEmpty(MyObject.Property) 
     ? MyObject.Property : ""; 

Lưu ý sự đảo ngược của 2 và toán hạng thứ 3 của các nhà điều hành có điều kiện quá mặc dù.

+0

ah tôi thấy vậy nếu tôi làm && cho cùng một điều kiện thay vì || nó sẽ là tốt – Zaki

+0

@ Sam1: Vâng, bạn cũng cần phải đảo ngược các bit khác của nó. –

+0

cảm ơn bây giờ là rõ ràng: P – Zaki

3

Bạn nên có một == không phải là một =

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) ? string.Empty : MyObject.Property 
2

Hãy thử điều này:

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) 
      ? string.Empty : MyObject.Property 
2
MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

Ở đây bạn nói.

Nếu đối tượng của tôi không rỗng. hoặc string.IsNullOrEmpty (MyObject.Property)

Điều đó có nghĩa là nếu MyObject là null, anh ta sẽ cố thực hiện phần thứ hai.

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

này sẽ không ném rỗng ngoại lệ

2

Điều đó xảy ra vì MyObjectnull và do đó điều kiện đầu tiên là false nên phần thứ hai phải được đánh giá để biết toàn bộ tình trạng này. Thay đổi dòng này:

MyObject != null && string.IsNullOrEmpty(MyObject.Property) 
1

Bạn nên thích đọc thay vì dòng đếm, ví dụ:

string prop = string.Empty; 
if(MyObject != null && MyObject.Property != null) 
    prop = MyObject.Property; 

(lý do ngoại trừ của bạn đã được giải thích trong câu trả lời khác)

+0

số lượng dòng không phải lúc nào cũng là mục tiêu. Ví dụ, trong một Lamda/predicate, buộc việc sử dụng '{' & '}' và cũng là một sự trả về rõ ràng có thể không đọc được. – JoeBrockhaus