2014-07-24 19 views
5

Tôi sử dụng C#? nhà điều hành khi tôi có các câu lệnh if ảnh hưởng đến một hàng và tất cả đều tốt. Nhưng cho phép nói rằng tôi có mã này (sử dụng if-báo cáo cổ điển):? nhà điều hành không có phần khác

if(someStatement) 
{ 
    someBool = true; //someBools value is unknown 
} 
else 
{ 
    //Do nothing 
} 

này có thể đạt được trên một lớp lót bằng cách thực hiện:

someBool = (someStatement) ? true : someBool; 

Nhưng tại sao tôi không thể làm điều gì đó như này:

someBool = (someStatement) ? true : ; 
//or possibly 
someBool = (someStatement) ? true; 

Điều này có thể theo một cách nào đó không? Nếu có, liệu có lợi ích gì khi sử dụng một phương pháp so với phương pháp khác không? Và nếu không, tại sao bạn không thể làm điều đó?

+0

Bạn mong đợi những biểu thức gì? (SomeStatement)? true: 'và' (someStatement)? true' để đánh giá? –

+0

@ O.R.Mapper đúng nếu someStatement là đúng và không thay đổi nếu someStatement là sai (câu hỏi này hoàn toàn là giả thuyết, không phải là một vấn đề actuall tôi có) –

+0

* không thay đổi * là gì? Biểu thức phải đánh giá một giá trị cụ thể, trong trường hợp này là kiểu 'bool' - nghĩa là' true' hoặc 'false'. –

Trả lời

7

Bạn có thể làm:

someBool = (someStatement) ? true : someBool; 

Tôi không nghĩ rằng giành cho bạn rất nhiều rõ ràng hơn:

if (someStatement) 
{ 
    someBool = true; 
} 

Nhưng nó thực sự có vẻ là một vấn đề của hương vị. Tôi sẽ không nói hoặc là rõ ràng là xấu, nhưng trước đây là không phổ biến, vì vậy tôi có lẽ sẽ tránh nó.


Bạn hỏi tại sao bạn không thể sử dụng toán tử như thế này:

someBool = (someStatement) ? true : ; 

Đây sẽ là một sự thay đổi ngôn ngữ rất lớn! Lưu ý rằng bài tập có dạng như sau:

<location> = <expression>; 

Biểu thức được đánh giá để cung cấp một số giá trị và giá trị đó được lưu trữ tại vị trí. (Tùy thuộc vào việc vị trí là biến, thuộc tính, trường hoặc biểu thức lập chỉ mục hoạt động "lưu trữ" có thể hoàn toàn khác nhau.)

Tại đây bạn đang đề xuất giá trị của biểu thức ở bên phải, ngoài thông thường các giá trị, có thể là một giá trị "không thay đổi", có hành vi đặc biệt khi bạn sử dụng nó trong một câu lệnh gán nó không làm cho hoạt động lưu trữ xảy ra. Đó là khác với bất kỳ giá trị bình thường nào khác, và có khả năng gây ngạc nhiên.Nhưng điều đó có nghĩa là gì nếu bạn sử dụng nó ở những nơi khác?

// Does this call DoSomething when cond is false? 
// If so, what value is passed to it? 
someObject.DoSomething(cond?x:); 

// What happens here if cond is false? Does it cancel 
// the entire assignment? 
int x = 77 + (cond?2:) * 3 - 4; 

// If cond is false, are methods F1 and F2 called or not called? 
int x = F1() + (cond?2:) + F2(); 

// What does this do? Does it skip the return if cond is false? 
return (cond?2:); 

Tôi nghĩ rằng bạn sẽ tìm thấy nó rất khó để đưa ra hành vi hợp lý, trực quan và phù hợp cho các nhà điều hành trong tất cả những trường hợp này, và tôi không nghĩ rằng nó sẽ có ích bất cứ nơi nào khác hơn là một cách đơn giản bài tập. Nó không phù hợp với phần còn lại của ngôn ngữ - bao gồm nó sẽ làm cho ngôn ngữ khó học, đọc, hiểu, thực hiện và giải thích. Nó chỉ là không có giá trị nó cho một chút nhỏ gọn của conciseness.

+0

Câu trả lời hay! Vâng, tôi thậm chí còn không nghĩ về cách nó sẽ được thực hiện bằng ngôn ngữ –

10

Về cơ bản, bạn đang cố gắng sử dụng toán tử có điều kiện cho điều gì đó mà nó không được thiết kế cho.

Nó không có nghĩa là tùy chọn thực hiện một số hành động ... nó có nghĩa là để đánh giá một biểu thức hoặc cách khác, và đó là kết quả của biểu thức.

Nếu bạn chỉ muốn thực hiện một hành động khi một số điều kiện được đáp ứng, hãy sử dụng câu lệnh if - đó chính xác là những gì nó có.

Trong ví dụ của bạn, bạn có thể sử dụng:

// Renamed someStatement to someCondition for clarity 
someBool |= someCondition; 

hoặc

someBool = someCondition ? true : someBool; 

... hay nói cách khác "sử dụng giá trị hiện tại trừ khi someCondition là đúng ... nhưng cá nhân tôi, Tôi nghĩ rằng tuyên bố gốc if rõ ràng hơn.

+0

bummer:/Cá nhân tôi nghĩ rằng toán tử có điều kiện đẹp hơn. –

+0

@JohanHjalmarsson: Xem bản chỉnh sửa của tôi về cách bạn * có thể * sử dụng nó - nhưng thực sự, nó có nghĩa là để đánh giá một biểu thức. Hãy nhớ rằng nó chỉ là một biểu thức, * không * một câu lệnh. –

+0

vâng, tôi biết, tùy chọn seccond là những gì tôi sử dụng. Đã được chỉ tò mò nếu có một số cách khác bên cạnh đó và bình thường nếu tuyên bố –