Giá trị boolean mặc định trong C # là gì?


82

Một boolean ( bool) không được rỗng. Và:

bool foo; if(foo){} // Use of unassigned local variable 'foo'

Tại sao giá trị mặc định không phải là false? Vì vậy, giá trị là gì nếu nó không phải là null? Lý do là gì?

Chỉnh sửa 1 - Giá trị mặc định thực sự là sai - nhưng tất cả các biến phải được khởi tạo, tại sao? đây là cho một câu hỏi khác;)

Chỉnh sửa 2 - với Resharper: private bool foo = false; // Initializing field by default value is redundant???


1

Câu trả lời:


101

http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx

Hãy nhớ rằng không được phép sử dụng các biến chưa được khởi tạo trong C #.

Với

bool foo = new bool();

foo sẽ có giá trị mặc định.

Boolean mặc định là sai


1
Xin lỗi, đã thêm: Hãy nhớ rằng không được phép sử dụng các biến chưa khởi tạo trong C #. Như đã thấy trong bài viết liên quan
— Destructor

1
Cảm ơn! và vì vậy làm thế nào bạn có thể giải thích của tôi "Chỉnh sửa 2" :)
— JohnJohnGa

1
giá trị mặc định sẽ được đặt nếu hàm tạo mặc định được gọi. Bạn vừa khởi tạo một biến mới với một giá trị. "int i" sẽ ném ra cùng một lỗi -Sử dụng biến cục bộ chưa được gán-. Đặt giá trị lúc khởi tạo hoặc gọi hàm tạo mặc định. vì vậy bạn sẽ không có bất kỳ vấn đề :)
— Destructor

1
@Destructor Tôi nghĩ nhận xét của bạn hơi khó hiểu. Lý do mà resharper gợi ý rằng OP không phải khởi tạo trường boolean là vì các trường trong một lớp được tự động gán giá trị mặc định của chúng, những biến cục bộ thì không. Hãy xem câu trả lời từ Hasan dưới đây.
— Alex

25

Về cơ bản, các biến cục bộ không được khởi tạo tự động. Do đó, sử dụng chúng mà không khởi tạo sẽ dẫn đến một ngoại lệ.

Chỉ các biến sau đây được tự động khởi tạo thành giá trị mặc định của chúng:

  • Biến tĩnh
  • Các biến phiên bản của cá thể lớp và cấu trúc
  • Phần tử mảng

Các giá trị mặc định như sau (được gán trong hàm tạo mặc định của một lớp):

  • Giá trị mặc định của một biến kiểu tham chiếu là null.
  • Đối với kiểu số nguyên, giá trị mặc định là 0
  • Đối với char, giá trị mặc định là `\ u0000 '
  • Đối với float, giá trị mặc định là 0.0f
  • Đối với double, giá trị mặc định là 0.0d
  • Đối với số thập phân, giá trị mặc định là 0,0m
  • Đối với bool, giá trị mặc định là false
  • Đối với kiểu enum, giá trị mặc định là 0
  • Đối với loại cấu trúc, giá trị mặc định được lấy bằng cách đặt tất cả các trường loại giá trị thành giá trị mặc định của chúng

Cho đến khi các phần sau của câu hỏi của bạn được tổng hợp:

  • Lý do tại sao tất cả các biến không được tự động khởi tạo thành giá trị mặc định nên được khởi tạo là một hạn chế do trình biên dịch áp đặt.
  • bool foo riêng tư = false; Điều này thực sự là thừa vì đây là một biến thể hiện của một lớp. Do đó, điều này sẽ được khởi tạo thành false trong hàm tạo mặc định. Do đó, không cần phải tự đặt điều này thành sai.

4
Để đầy đủ, bảng giá trị mặc định tại MSDN cho biết rằng các giá trị mặc định cho kiểu cấu trúc cũng bao gồm việc đặt "tất cả các trường kiểu tham chiếu thành null."
— Carl Walsh

10

Giá trị mặc định thực sự là sai.

Tuy nhiên, bạn không thể sử dụng một biến cục bộ vì nó chưa được gán trước.

Bạn có thể sử dụng từ khóa mặc định để xác minh:

bool foo = default(bool);
if (!foo) { Console.WriteLine("Default is false"); }

4

Giá trị mặc định cho bool là false. Xem bảng này để tham khảo nhiều về các giá trị mặc định. Lý do duy nhất khiến nó không bị false khi bạn kiểm tra là nếu bạn khởi tạo / đặt nó thành true.


0

Hãy thử điều này (sử dụng từ khóa mặc định)

 bool foo = default(bool); if (foo) { } 

0

Nó có thể được coi là cách tiếp cận lập trình phòng thủ từ trình biên dịch - các biến phải được gán trước khi nó có thể được sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.