2009-12-14 6 views
55

Tại sao quyết định khi phân tích cú pháp boolean, 0/1 không được chấp nhận?Chuyển đổi.ToBoolean và Boolean.Parse không chấp nhận 0 và 1

Khi phân tích cú pháp bất kỳ giá trị loại số nguyên nào, nó chấp nhận các chuỗi số được phân tích cú pháp. (Và nếu .NET có thể phân tích chuỗi "Một trăm triệu hai trăm sáu mươi lăm nghìn tám trăm sáu mươi lăm" tôi sẽ ngạc nhiên).

Điều gì làm cho booleans trở nên đặc biệt? Chúng chủ yếu là 0 là sai, và khác không đúng theo kinh nghiệm của tôi ...

Có phương pháp bcl để phân tích chuỗi như thế này không, và nếu không, tại sao?

Lưu ý: Tôi quên chỉ định trong chuỗi "0" và "1". Tò mò mặc dù nếu đã là một int nó hoạt động như tôi dự đoán. Có lẽ điều này gây ra sự nhầm lẫn.

Trả lời

58

0 và (không-zero) không bằng nhau là "false" và "true" , họ chỉ là đại diện được lựa chọn bởi C. Các ngôn ngữ khác sử dụng 0 cho đúng và -1 cho sai, hoặc các chương trình khác hoàn toàn. Một boolean là không phải một số 0 hoặc số 1, đó là giá trị đúng hoặc sai.

Nếu nó cũng xử lý "có" và "không", "tắt" và "bật" và tất cả những thứ khác tương tự với boolean thì sao? Bạn muôn ve đương thẳng ở đâu?

+2

Cảm ơn! Đây là những gì tôi đang tìm kiếm, giải thích tại sao. Nếu một số ngôn ngữ thực sự sử dụng 0 cho đúng, và -1 cho sai, tôi thành thật nghĩ rằng chúng bị hỏng, nhưng đó là một lý do tuyệt vời không tự động giả định thông qua phân tích cú pháp mà một số nhà phát triển có thể sử dụng một cách mù quáng. –

+48

Tại sao, có. Có, nó sẽ xử lý có/không có off/on. – WEFX

+2

Để giải thích thêm lý do tại sao một số ngôn ngữ sử dụng 0 cho đúng và -1 cho sai, hãy xem xét biểu diễn nhị phân của chúng: '00000000' và' 11111111'. – MCattle

22

Điều gì làm cho booleans trở nên đặc biệt? Về bản chất, chúng thực chất là 0 là sai và không khác với trải nghiệm của tôi ...

Đó là chi tiết triển khai và không có liên quan.

true là giá trị boolean. false là giá trị boolean. Còn gì nữa thì không.

Nếu bạn muốn phân tích một cái gì đó mà chuỗi "0" đánh giá false trong khi bất cứ điều gì khác đánh giá true, bạn có thể sử dụng:

!mystr.Equals("0"); 
+0

Giải pháp ngắn gọn ở đó, tôi thích giống chó con! – RemarkLima

+6

Và chuỗi "true" và chuỗi "false" là các chuỗi chứ không phải là boolean. Tuy nhiên, không ai có vẻ có một vấn đề nhận ra ý nghĩa của họ khi chuyển đổi chúng thành boolean. Nếu chúng ta đủ thông minh để nhận ra rằng "true" có nghĩa là đúng thì tôi nghĩ chúng ta đủ thông minh để nhận ra rằng "1" và 1 có nghĩa là đúng. Và chúng tôi đủ thông minh để nhận ra rằng "trên" và "có" là các xác nhận cũng có thể được chuyển đổi thành sự thật nếu người lập trình yêu cầu chuyển đổi cụ thể .. – Rikaelus

3

Bạn muốn Convert.ToBoolean(int value) không chắc chắn những gì với các phương pháp Parse :-)

Mã cho không có mục đích hữu ích:

 int falseInt = 0; 
     int trueInt = 1; 

     bool falseBool; 
     bool trueBool; 

     if (bool.TryParse(falseInt.ToString(), out falseBool)) 
     { 
      if (!falseBool) 
      { 
       MessageBox.Show("TryParse: False"); 
      } 
     } 

     if (bool.TryParse(trueInt.ToString(), out trueBool)) 
     { 
      if (!trueBool) 
      { 
       MessageBox.Show("TryParse: True"); 
      } 
     } 

     falseBool = Convert.ToBoolean(falseInt); 
     trueBool = Convert.ToBoolean(trueInt); 

     if (!falseBool) 
     { 
      MessageBox.Show("Convert: False"); 
     } 

     if (trueBool) 
     { 
      MessageBox.Show("Convert: True"); 
     } 
8

Thật không may, điều này xảy ra rất nhiều trong .NET. Ví dụ, tôi không thể nhớ nếu nó là XML Serializer hoặc XmlConvert nhưng một trong số chúng bị lỗi nếu vỏ của True/False không chính xác.

Bạn có thể thực hiện chuyến đi khứ hồi qua số nguyên để nhận được những gì bạn muốn.

string s = "2"; 
int i = Convert.ToInt32(s); 
bool b = Convert.ToBoolean(i); 

Trong trường hợp trên, mọi giá trị khác sẽ được đánh giá là đúng. Vì lý do này, tôi đã tạo một lớp mà tôi sử dụng trên toàn bộ gọi là ConversionStrategy, có tính đến loại nguồn và loại đích và chọn chiến lược chuyển đổi lý tưởng (và linh hoạt) nhất để thực hiện chuyển đổi.

+2

Câu trả lời được chấp nhận có vẻ tốt về mặt lý thuyết, nhưng khi bạn thấy những thứ như thế này thì thực sự không có sự hợp lý hóa nào có thể làm cho điều này có ý nghĩa. – Kyle

3

Làm thế nào về điều này?

byte i = 1; //or 0 
    bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0) 
16

Lớp được chia sẻ dưới đây cung cấp giải pháp đơn giản sử dụng hai phương pháp quá tải được gọi là StringToBoolean.

FormatHelper.StringToBoolean(String value) 
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault) 

Cả hai biến thể cung cấp một trường insentive chuỗi trận

1) Các chuyển đổi bình thường từ chuỗi để boolean mặc định chuỗi rỗng hoặc null để false

Các ví dụ sau sẽ cho kết quả a boolean giá trị của false: -

Boolean myBool = FormatHelper.StringToBoolean(""); 
Boolean myBool = FormatHelper.StringToBoolean("0"); 
Boolean myBool = FormatHelper.StringToBoolean("false"); 
Boolean myBool = FormatHelper.StringToBoolean("False"); 
Boolean myBool = FormatHelper.StringToBoolean("no"); 
Boolean myBool = FormatHelper.StringToBoolean("off"); 

Tất cả các giá trị chuỗi khác sẽ dẫn đến một giá trị Boolean của true như: -

Boolean myBool = FormatHelper.StringToBoolean("1"); 
Boolean myBool = FormatHelper.StringToBoolean("true"); 
Boolean myBool = FormatHelper.StringToBoolean("True"); 
Boolean myBool = FormatHelper.StringToBoolean("yes"); 
Boolean myBool = FormatHelper.StringToBoolean("xyz blah"); 

Lưu ý: Chỉnh sửa giá trị của BooleanStringOff trong lớp bên dưới để bao gồm nhiều (hoặc ít hơn) giá trị cho sai/off

2) Theo cùng các quy tắc như 1) ở trên nhưng cho phép giá trị mặc định là true được cung cấp làm đối số thứ 2 cho chuyển đổi.

Giá trị mặc định được sử dụng khi giá trị String trống hoặc null. Điều này hữu ích nếu giá trị chuỗi bị thiếu cần biểu thị trạng thái true.

Ví dụ mã sau sẽ trở lại true

Boolean myBool = FormatHelper.StringToBoolean("",true); 

sau Ví dụ mã sẽ trở false

Boolean myBool = FormatHelper.StringToBoolean("false",true); 

Đây là mã cho lớp FormatHelper

public class FormatHelper 
{ 
    public static Boolean StringToBoolean(String str) 
    { 
     return StringToBoolean(str, false); 
    } 

    public static Boolean StringToBoolean(String str, Boolean bDefault) 
    { 
     String[] BooleanStringOff = { "0", "off", "no" }; 

     if (String.IsNullOrEmpty(str)) 
      return bDefault; 
     else if(BooleanStringOff.Contains(str,StringComparer.InvariantCultureIgnoreCase)) 
      return false; 

     Boolean result; 
     if (!Boolean.TryParse(str, out result)) 
      result = true; 

     return result; 
    } 
}