2009-06-03 71 views
33

Chúng ta đều biết rằng trong C# chúng ta không thể cast bool thành int. Tôi muốn xem đại diện nhị phân của sự thật với bitmask là gì, nhưng tôi không thể sử dụng (bool & int) .. Tôi nghĩ rằng vấn đề là kiến ​​trúc desicion "true là true, không phải bất kỳ số nào! = 0" (C++) và tôi đã tự hỏi những lợi ích của kiến ​​trúc như thế là gì? Điều gì là xấu với khái niệm C true/false?C# không thể bool bool để int

+2

Xin xem (http://meta.stackexchange.com/questions [ "nên câu hỏi bao gồm‘thẻ’trong tiêu đề của họ?"]/19190/nên-câu hỏi-bao gồm-thẻ-trong-danh hiệu của họ), nơi mà sự đồng thuận là "không, họ không nên"! –

Trả lời

26

Rõ ràng hơn đối với người lập trình khi không thể sử dụng số nguyên cho true hoặc false.

if (5 > 0) là dễ hiểu hơn là if(5)

Đó là lý do tương tự tại sao họ không cho phép giảm thông qua các điều kiện trong báo cáo chuyển đổi. Thật dễ dàng để phạm sai lầm.

+10

Tôi thực sự không thích cách họ thực hiện với các câu lệnh chuyển đổi trong C# a LOT. Có rất nhiều trường hợp rơi qua là rất hữu ích để có. – Joseph

+5

@Joseph: Trường hợp ít xảy ra lỗi nhất vẫn được cho phép - bạn có thể bị cắt ngang miễn là bạn không thực hiện bất kỳ công việc nào trước tiên. Nhưng có một trường hợp rơi qua sau khi làm "công việc" khác không phải là dễ dàng duy trì. –

+1

@Joseph: rằng nó hữu ích không có nghĩa là nó không dễ xảy ra lỗi, hay không dễ mắc lỗi. –

15

Chỉ cần cung cấp thông tin, Convert.ToInt32(fooBool) nên nói với bạn rằng true được thể hiện bằng 1, và false bằng 0. (Đây là một đại diện tùy ý trong BCL, và không nhất thiết là một sự sử dụng nó nhớ, tuy nhiên.)

Vấn đề ở đây là, sự biểu diễn bit thực sự phải là vô nghĩa đối với bất kỳ lập trình viên nào. Booleans có nghĩa là để được sử dụng cho các mục đích cụ thể (ví dụ: cờ), và không nên được trộn lẫn với ints, khác sử dụng các biến có khả năng trở nên khá khó hiểu.

-2

số! = 0, quá dễ bị lỗi.

C# thực hiện rất nhiều quyết định thiết kế để loại bỏ các lỗi phổ biến như thế này có thể dẫn đến.

+0

Không chắc điểm của bạn là gì. Có lẽ bạn có thể xây dựng thêm một chút. – jpierson

+0

Bằng cách không cho phép những thứ như if (27) ngôn ngữ buộc mọi người hướng tới cú pháp đáng tin cậy hơn như: if (27 > 0)

+0

Ah, bây giờ tôi thấy "số 1 = 0" là đoạn mã trực tiếp từ bài đăng gốc. Có lẽ đặt bối cảnh nhiều hơn một chút trong câu trả lời của bạn sẽ giúp người đọc hiểu được quan điểm của bạn. Trong hình thức hiện tại của nó nó không có ý nghĩa của chính nó. Nói chung tốt nhất là có một số hình thức của câu hỏi gốc trong câu trả lời của bạn, nó không cần phải là một câu trích dẫn trực tiếp mà thay vào đó là một câu trả lời của câu hỏi gốc. – jpierson

3

Không ai thích tất cả các quyết định bất kỳ tổ chức nào khác của ... chỉ cần viết Chuyển đổi riêng của bạn (Xóa nhanh & -dirty-like)

21

Trong số nguyên C thường xuyên gấp đôi sử dụng như một số bình thường và một boolean, chẳng hạn như cho các vòng chạy trong khi một số nhất định không phải là số không. Đó là một sử dụng trong đó có rõ ràng giá trị của nó cho mã ngắn gọn, giống như một ngây thơ strlen thói quen:

const char *s; 
for (s = str; *s; ++s) 
    ; 
return (s - str); 

nhưng trong khi đó mặt nạ ngắn với mục đích thực sự của đoạn đó, mà chủ yếu nói "vòng lặp trong khi nhân vật tôi đang xem xét là không phải là ký tự rỗng ". Nhưng viết xuống nó chỉ nói "đối xử với nó như là một boolean khi tôi cảm thấy thích nó, và như một số trong một số trường hợp khác".

Loại bản chất kép này thường xuyên dẫn đến sự cố và làm cho mã trở nên dễ đọc hơn (vì bạn phải đánh giá từ ngữ cảnh cho dù sử dụng intint hoặc bool).

Nếu bạn hoàn toàn cần phải sử dụng một boolean là một số nguyên bạn có thể sử dụng

Convert.ToInt32(someBool) 

như Noldorin mentioned hoặc cuộn của riêng bạn với

someBool ? 1 : 0 

Cả trong đó nói rõ rằng bạn đang sử dụng một int (và không phải là bool).

5

Tôi không nghĩ rằng vấn đề là một số nhiều về đúng/sai hoặc 1/0 vì nó là về quyết định để làm cho C# một ngôn ngữ gõ mạnh mẽ hơn là một ngôn ngữ đánh máy yếu. Có nhiều lợi ích (và một số nhược điểm) đối với một ngôn ngữ được đánh máy mạnh mẽ.Một trong những lợi ích là nó giảm lỗi do sử dụng sai (hoặc sử dụng sai) các biểu thức.

Ví dụ,

int i = 0; 
if (i = 1) { 
    ... 
} 

thậm chí sẽ không biên dịch trong C#, nhưng nó sẽ cả biên dịch và thực hiện không đúng trong C.

Chọn để làm cho C# một ngôn ngữ mạnh mẽ-gõ suy luận những lợi ích cho Lập trình viên C#. Mặc dù vậy, họ có thể đã giới thiệu một chuyển đổi từ bool sang int (và ngược lại) nếu họ chọn. Tôi nghi ngờ rằng họ đã không làm như vậy do tiềm năng cho các lỗi như trên được giới thiệu.

+1

điều này không có gì để làm cho "kiểu chữ mạnh". nếu (i = 1) có thể trong C vì toán tử gán trả về giá trị (hữu ích nếu bạn muốn thực hiện a = b = c = 5) ví dụ, Python được gõ mạnh và gán nó là một câu lệnh, và không "trả lại" gì cả. Vì vậy, làm một cái gì đó như "nếu a = 3:" đó là một lỗi. Nhưng bản thân python có quy tắc nói "bất cứ điều gì có giải thích boolean": bộ sưu tập trống, 0, chuỗi rỗng là False, bất kỳ điều gì khác Đúng, vì vậy bạn có thể làm mylist = [] nếu danh sách của tôi: something – ZeD

+1

Có, nhưng lý do nó cho phép kết quả của nhiệm vụ được sử dụng trong ngữ cảnh này là vì nó được đánh máy yếu. Gần như chắc chắn mục đích là i == 1, là một kết quả boolean và trong C# sẽ được cho phép trong ngữ cảnh đó. Nếu C được đánh máy mạnh, kết quả của nhiệm vụ sẽ không được phép trong ngữ cảnh này, vì nó nằm trong C#. Vì nó là, kết quả của nhiệm vụ là (sai, trong trường hợp này) tình cờ được đánh giá là boolean và do đó một lỗi được sinh ra. – tvanfosson

-2

int n = (bBool)? 1: 0

+2

Đây không phải là một diễn viên –

+8

Tôi ĐÁNH GIÁ phải bỏ phiếu cho bạn để sử dụng ký hiệu Hungary, yuk! – jpierson

-1

Bạn thực hiện một điểm tốt về những điều này. Tuy nhiên nó loại bỏ một phím tắt.

Với c, toggles có thể dễ dàng thực hiện bằng mã "bBool = 1 - bBool".

Nếu bBool là đúng (1), thì 1 - 1 = 0. bBool thay đổi thành false.

Nếu bBool là false (0), thì 1 - 0 = 1. bBool thay đổi thành true.

Thay vào đó trong C# Tôi bắt buộc phải thực hiện điều kiện để kiểm tra trạng thái và sau đó đặt nó sang trạng thái ngược lại, điều này gây ra nhiều việc hơn cho máy và tôi.

+16

Tôi có thiếu gì đó không? 'bBool =! bBool;' làm những gì bạn mô tả, không? – MarqueIV

4

chúng ta có thể sử dụng Convert.ToInt32, định nghĩa của nó là ở đây:

public static int ToInt32(bool value); 
Các vấn đề liên quan