2012-03-06 13 views
17

Trong săn của tôi đối với một số giúp đỡ để một vấn đề tôi đã có tôi đi qua này:trong C# 'bool = bool! = True' nghĩa là gì?

p.Enabled = p.Enabled != true; 

chính xác điều này có ý nghĩa gì? Ive không bao giờ nhìn thấy nó trước,

nb: dòng preceeding là var p = this.PageRepository.GetPage(id);

+5

Đã một thời gian kể từ khi tôi viết C#, nhưng có vẻ như nó tương đương với 'p.Enabled =! P.Enabled;'. – JasonFruit

+0

p.Enabled = p.Enabled đây là nơi bạn nói rằng p.Enabled sẽ lấy giá trị p.Enabled (không tạo ra sence). Thế thì bạn đang nói nó không nên bằng tue; do đó, sai – Andrew

+0

Ồ, mười câu trả lời trùng lặp cho câu hỏi này (bao gồm cả hai câu trả lời "nhận xét" ở trên). Tôi nghĩ một số người nên xóa câu trả lời của họ. –

Trả lời

32

Khi p.Enabled là một bình thường bool, như tài sản Enabled thường là,

p.Enabled = p.Enabled != true; 

cũng giống như

p.Enabled = ! p.Enabled; 

nói cách khác: nó lật hoặc bật tắt p.Enabled.

Bây giờ khi Bật bây giờ là một bool?, viết tắt cho Nullable<bool>, kết quả là khác nhau:

! ((bool?) null)   -> null 
((bool?) null) != true  -> true 

Vì vậy p.Enabled = p.Enabled != true sẽ thiết lập true khi giá trị cũ là false hoặc null.

+2

Chỉ đúng nếu 'p.Enabled' được đặt. Mã của bạn sẽ không hoạt động nếu 'p.Enabled = null'. – kba

+0

@KristianAntonsen - Tôi không biết lớp Trang này nhưng nhìn chung các thuộc tính IsEnabled không thể rỗng. –

+0

OK, tôi không phải là một anh chàng C#, vì vậy có lẽ bạn đã đúng. – kba

10

Giống như p.Enabled = !p.Enabled;, đối diện với p.Enabled.

31

Đó là công tắc chuyển đổi bool được viết lố bịch. Mỗi cuộc gọi chuyển đổi trạng thái từ true sang false. Tôi đã viết nó:

p.Enabled = !p.Enabled; 

Chỉnh sửa - Tôi cho rằng tôi nên nói, lúng túng viết trong ý kiến ​​của tôi mà thôi.

+21

Đừng lo lắng, nó * là * lúng túng bằng văn bản. – zmbq

+5

Tôi nghĩ rằng vụng về được viết là một cách nói. Đó là một ví dụ hoàn hảo của một người nào đó thêm sự phức tạp vì lợi ích của việc làm cho mình cảm thấy thông minh HOẶC không biết phủ định là gì. Dù bằng cách nào dấu hiệu xấu. –

9

Bài kiểm tra p.Enabled != true được đánh giá. Kết quả của điều đó (là boolean) được gán cho p.Enabled. Vì vậy, nếu p.Enabled là đúng, thì p.Enabled sẽ được đặt thành false. Một cách khác để nói điều này là p.Enabled = !p.Enabled. Nghĩa là, về cơ bản nó đảo ngược giá trị của p.Enabled.

3

nghĩ về nó theo cách này:

p.Enabled = (p.Enabled != true); 

Bây giờ, (p.Enabled != true) để đánh giá một bool, mà sau đó có thể được gán cho một biến khác bool.

8

nếu p.Enabled là đồng bằng bool tương đương với p.Enabled = !p.Enabled. tức là nó chuyển sang số p.Enabled.

Nhưng nếu p.Enabled là một bool nullable, nó sẽ vạch nullfalse để true, và bản đồ true để false. Nhưng tôi muốn viết p.Enabled = !(p.Enabled ?? true) trong trường hợp đó.

Nếu p.Enabled là loại tùy chỉnh có toán tử chuyển đổi ngầm bị quá tải, mọi thứ có thể xảy ra.

4

Về cơ bản, điều này sẽ làm giảm giá trị của p.Enabled.Vì vậy, nếu nó là đúng thì p.Enabled != true đánh giá sai, và sau đó giá trị giả được gán cho p.Enabled = false. Và nó sẽ làm việc theo cách khác xung quanh nếu p.Enabled là sai.

Nó có thể có ý nghĩa hơn nếu nó được viết như sau:

p.Enabled = !(p.Enabled); 
3

Dòng đánh giá p.Enabled != true, đó là false nếu p.Enabled là đúng và true nếu p.Enabled là sai. Nói cách khác, một cách rất vụng về viết

p.Enabled = !p.Enabled 
1

Sử dụng chức năng này:

bool cond = (p.Enabled != true); 
if (cond == true) 
{ 
    p.Enabled = cond; // = true 
} 
else 
{ 
    p.Enabled = cond; // = false 
} 
19

Vì vậy, nhiều câu trả lời ... Tôi chỉ muốn phá vỡ nó xuống hơn một chút:

p.Enabled = p.Enabled != true; 

là ngữ nghĩa tương đương với:

var IN = p.Enabled; 
var OUT = IN != true; 
p.Enabled = OUT; 

Vì vậy:

p.Enabled -> IN  IN != true  OUT -> p.Enabled 
---------------  ------------- ---------------- 
true    true != true false 
false    false != true true 
(if nullable) null null != true true 

Như vậy, từ Truth Table, nó có thể được nhìn thấy nó là như nhau * như logical not (!) operator và có thể được viết lại như sau:

p.Enabled = !p.Enabled; 

(Tôi tưởng tượng rằng hầu hết [kinh nghiệm] các lập trình viên thích hình thức sau này vì nó là một thành ngữ khá phổ biến.)

Chúc mừng mã hóa.


* Lưu ý việc bổ sung các null như trạng thái đầu vào thứ ba trong trường hợp bool? (aka Nullable<bool>) các loại. (Cảm ơn, Thomas Mayfield ;-)