2012-05-09 31 views
10

thể trùng lặp:
Why are there no ||= or &&= operators?&& = trong C#? (Boolean expression)

Bởi tai nạn thuần túy tôi phát hiện ra ngày hôm nay rằng

a &= GetBool(); 

là không giống như

a = a && GetBool(); 

Tôi phải hiểu lầm rằng trong nhiều năm. Trong ví dụ đầu tiên, "GetBool()" được thực hiện ngay cả khi "a" là sai. Trong lần thứ hai, nó không phải là.

Có bất kỳ điều gì để đạt được điều gì đó như "& & =" trong C# không?

+1

'a & = a? getBool(): true; ' –

+3

@Soohjun: Đó phải là' false' thay vì 'true'. – leppie

+5

Tôi tin rằng Eric đã viết blog về lý do tại sao '&& =' không có sẵn ..... Ahh đây là http://blogs.msdn.com/b/ericlippert/archive/2012/04/19/null-is-not -false-part-three.aspx – V4Vendetta

Trả lời

4

Từ documentation sự:

Một biểu thức sử dụng toán tử & = chuyển nhượng, như

x & = y

tương đương với

x = x & y

ngoại trừ x chỉ được đánh giá một lần. Toán tử & thực hiện thao tác logic AND logic trên các toán hạng tách rời và logic AND trên toán hạng bool.

Tôi xin nói, để tránh đánh giá của y khi không cần thiết, sử dụng

x = x && y 

và để tránh đánh giá của x hai lần (bất kể điều này có nghĩa), sử dụng

x &= y 

Bạn có thể không kết hợp cả hai.

Micro được tối ưu hóa (ít nhất là cho một trường hợp lý thuyết), nó sẽ là:

if (x) x = y; 

Bạn không cần phải làm bất cứ điều gì nếu x đã là false.

+3

"được đánh giá một lần" có nghĩa là cho các trường hợp phức tạp hơn, ví dụ nếu bạn có 'x [i + 3] = x [i + 3] & y;' Sau đó, 'i + 3' được tính hai lần, hiển nhiên! –

+0

@Mr Lister: Điều này có ý nghĩa, tôi đã không xem xét điều này. Ngoài ra còn có các thuộc tính, nơi bạn có thể sử dụng toán tử & =, có thể có một triển khai phức tạp tùy ý (nếu đây là một thiết kế tốt sang một bên). –

6

Có bất kỳ điều gì để đạt được điều gì đó như "& & =" trong C#?

Vâng, bạn có thể viết

a = a && getBool(); 

thay vì ... Tôi không thể nghĩ ra nhiều tình huống mà tôi thực sự muốn để làm bất cứ điều gì khác, phải trung thực. Ngay cả ở trên là khá hiếm, IME.

Không có toán tử gán gán nào được xác định cho &&, || hoặc ?? (đây là các toán tử "ngắn mạch" rõ ràng). Xem phần 7.17 của thông số C# 4 để biết danh sách đầy đủ các toán tử gán phân tách và phần 7.17.2 để biết thêm chi tiết về việc gán chính xác nào.