2009-07-25 58 views
47

Tôi sử dụng kiểu "bool" cho các biến như tôi đã từng sử dụng trong C++, và tôi cố gắng đặt các giá trị của hàm hoặc thuộc tính mà tôi mong đợi là boolean vào biến của tôi. Tuy nhiên tôi thường gặp phải trường hợp loại kết quả là "bool"? và không phải là "bool" và quá trình truyền ngầm không thành công.Sự khác nhau giữa "bool" và "bool" là gì?

Sự khác nhau giữa hai và thời điểm nào được sử dụng? Ngoài ra, tôi nên sử dụng "bool?" làm loại cho biến của tôi? Đây có phải là phương pháp hay nhất không?

+0

có thể trùng lặp của [DateTime là gì? " có nghĩa là trong C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) – nawfal

Trả lời

79

Biểu tượng ? sau một loại chỉ là lối tắt đến Nullable type, bool? tương đương với Nullable<bool>.

bool là một value type, điều này có nghĩa rằng nó không thể là null, vì vậy các loại Nullable về cơ bản cho phép bạn quấn các loại giá trị, và có thể gán null đối với họ.

bool? có thể chứa ba giá trị khác nhau: true, falsenull.

Ngoài ra, không có nhà khai thác ngắn mạch (& & ||) định nghĩa cho bool?

Chỉ có logic AND, bao gồm OR, các nhà khai thác được định nghĩa và họ cư xử như thế này:

x  y  x & y x | y 
true true true true 
true false false true 
true null null true 
false true false true 
false false false false 
false null false null 
null true null true 
null false false null 
null null null null 

Loại Nullable về cơ bản là cấu trúc chung, có các thuộc tính công khai sau:

public struct Nullable<T> where T: struct 
{ 
    public bool HasValue { get; } 
    public T Value { get; } 
} 

Thuộc tính HasValue cho biết đối tượng hiện tại có giá trị không và thuộc tính Value sẽ nhận giá trị hiện tại của đối tượng hoặc nếu HasValue là sai, nó sẽ ném InvalidOperationException.

Bây giờ bạn phải tự hỏi điều gì đó, Nullable là một cấu trúc, một loại giá trị không thể rỗng, vậy tại sao câu lệnh sau đây là hợp lệ?

int? a = null; 

Đó dụ sẽ biên dịch thành này:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) 
IL_0000: ldloca.s V_0 
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

Một cuộc gọi đến initobj, khởi tạo từng lĩnh vực của các loại giá trị tại một địa chỉ cụ thể để một tham chiếu null hoặc 0 của các loại nguyên thủy thích hợp .

Vậy đó, những gì đang xảy ra ở đây là mặc định struct initialization.

int? a = null; 

Tương đương với:

Nullable<int> a = new Nullable<int>(); 
+2

Đó là một câu trả lời hay nhưng tôi có thể đề nghị bạn làm rõ rằng bool? cũng là một loại giá trị, nó thực sự là một cấu trúc có chứa somethng như {T value; bool _hasValue} – AnthonyWJones

+0

Cảm ơn Anthony, tôi đã mở rộng bài đăng của mình một chút. – CMS

+0

Và '! ((Bool?) Null)' kết quả bằng 'null'. –

14

bool? là nullable khi bool thì không.

bool? first; 
bool second; 

Trong đoạn mã trên, first sẽ null khi second sẽ false.

Một cách sử dụng điển hình là nếu bạn muốn biết liệu có một bài tập được gán cho biến hay không. Kể từ bool là một loại giá trị (cũng giống như int, long, double, DateTime và một số loại khác), nó sẽ luôn luôn được khởi tạo một giá trị mặc định (false trong trường hợp của một bool, 0 trong trường hợp của một int) . Điều này có nghĩa là bạn không thể dễ dàng biết được đó là false vì một số mã được gán false cho nó hay nếu nó là false vì chưa được gán. Trong trường hợp đó, bool? có ích.

+7

Lưu ý rằng các giá trị mặc định này chỉ hợp lệ đối với các biến mẫu/tĩnh, chứ không phải biến cục bộ. –

5

Bất cứ khi nào bạn nhìn thấy? ký tự theo tên loại, nó viết tắt cho Nullable<TypeName>. Nullable là một kiểu đặc biệt cho phép các kiểu giá trị hoạt động như một giá trị null. Đó là cách thể hiện rõ ràng một loại giá trị có thể có giá trị không có giá trị.

Đối bool nó có hiệu quả chuyển biến thành một giá trị tri-state

  • Với Giá trị: True
  • Với giá trị gia tăng: False
  • Nếu không có giá trị gia tăng
2

bool có thể chứa chỉ truefalse giá trị trong khi bool? cũng có thể có giá trị null.

3

bool? có nghĩa là boolean là nullable và là cú pháp đường cho một cấu trúc Nullable<bool>. Bởi vì boolean là một kiểu giá trị, bạn không thể đặt nó thành null, nhưng có một số trường hợp bạn muốn trong lớp truy cập dữ liệu vì các trường cơ sở dữ liệu có thể có giá trị null.

4

Thêm ? làm cho loại không thể thực hiện được. Điều này có nghĩa là bạn có thể làm điều này:

bool? x = null; 

Và nó sẽ hoàn toàn OK.

0

bool nghĩa là bạn có thể có giá trị đúng và sai. bool? có nghĩa là bạn có thể có giá trị true, false và null.

Nó hoạt động cho datetime và booleans.

1

Một nơi tốt khác để sử dụng bool? là phương pháp để thêm kiểm tra null

public bool? IsTurkeyStillInFridge(Turkey turkey) 
{ 
    if (turkey == null) 
    return null; 
    else if (fridge.Contains(turkey)) 
    return true; 
    else 
    return false; 
} 

bool? canStayAtDesk = IsTurkeyStillInFridge(turkey); 

if (canStayAtDesk == null) 
    MessageBox.Show("No turkey this year, check for ham."); 
else if (canStayAtDesk == true) 
    MessageBox.Show("Turkey for lunch. Stay at desk."); 
else 
    MessageBox.Show("Turkey's gone, go out to lunch."); 
Các vấn đề liên quan