2012-01-21 17 views
6

Tôi có một chức năng với nhiều nếu nhân (NÀY KHÔNG PHẢI LÀ BỘ LUẬT THỰC TẾ)C#: Biểu

if(n == 1) 
    m = 1; 
if(n == 2) 
    m = 2; 
if(n == 3) 
    m = 3; 

Thay vì rằng tôi muốn làm làm cho họ tất cả vào: biểu hiện:

(n == 1) ? m = 1; 

Nhưng nó nói rằng họ sẽ có nó một ':'

tôi quen với: biểu hiện từ C++ mà bạn chỉ có thể viết:

0.123.
(n == 1) ? m = 1 : 0; 

Nhưng 0 không thực hiện ở đây. Đây là một câu hỏi vô lý và tôi thậm chí không thể tìm thấy câu trả lời trong google vì nó bỏ qua '?' Như một từ.

TRẢ LỜI: câu trả lời quá xấu trong nhận xét. Không có cách nào để "không làm gì" trong biểu thức này và tôi nên sử dụng if-else hoặc switch. cảm ơn.

+5

Tại sao không phải 'm = n'? – Pubby

+0

Vâng, thật khó để Google có dấu hỏi. Điều này được gọi là toán tử bậc ba. – DOK

+8

Câu lệnh "if" * thực thi câu lệnh nếu đáp ứng điều kiện *. Một biểu thức có điều kiện * chọn một biểu thức để đánh giá nếu một điều kiện được đáp ứng *, và trong C# nó * phải làm điều gì đó với biểu thức đó *. (Không giống như trong C++, nơi biểu thức có thể được thực hiện cho các hiệu ứng phụ của nó.) Bạn đang trộn lẫn hai phong cách lại với nhau theo một cách kỳ lạ; đừng làm thế. Nó thường là không thể, và khi có thể, nó rất khó hiểu. Sử dụng công tắc hoặc nếu có; điều đó dễ đọc hơn nhiều. –

Trả lời

2

tìm kiếm toán tử bậc ba trong C# sẽ cho bạn kết quả có liên quan.

một cách sử dụng ví dụ sẽ là

var m = n == 1 ? 1 : 0 
+2

Toán tử điều kiện '?:' Là toán tử bậc ba, vì nó lấy ba tham số. Tôi sẽ không gọi nó là toán tử * ternary, ngay cả khi C# hiện chỉ có một trong số chúng. – CodesInChaos

+1

Tôi nghĩ rằng đây phải là một bình luận. – CodesInChaos

+0

Tôi đề nghị * toán tử điều kiện bậc ba *. – Pubby

14

Dường như bạn đang tìm kiếm:

m = (n == 1) ? 1 : 0; 

mà bạn có thể sau đó thác để:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0; 

Một quan trọng (với tôi, dù sao), sang một bên:

Tại sao bạn có hỏi điều này không? Nếu đó là vì bạn cho rằng biểu mẫu này sẽ hiệu quả hơn một loạt các tuyên bố if hoặc switch, không. Trình biên dịch C# và trình biên dịch JIT .net thực sự khá thông minh và chúng sẽ biến đổi mã của bạn (hy vọng!) Thành dạng tối ưu nhất của nó. Viết mã của bạn sao cho mã số của mình là dễ hiểu, hoặc nhà phát triển phải duy trì mã này sau khi bạn vì nó có thể. Nếu hiệu suất bạn nhận được không được chấp nhận, hãy thử thay đổi nó xung quanh nhưng đo để xác định điều gì hoạt động tốt nhất (lưu ý rằng các trình biên dịch/.net mới hơn cũng có thể thay đổi điều gì xảy ra).

+0

Chà, tôi không nhận ra rằng bạn có thể xích chúng lại với nhau. – DOK

+7

@DOK - bạn có thể, không có nghĩa là nó làm cho bất cứ điều gì khác hơn là mã khủng khiếp không thể đọc được mặc dù! ; =) – Rob

+0

@Rob [Nó không phải là] (http://pastebin.com/0kHXD1Hd). Không chắc chắn nếu C# có '# define', nhưng đó là những gì tôi làm trong C/C++. – Pubby

1

Bạn có thể viết:

m = (n==1) ? 1 : m; 

Nhưng IMO đó là khó khăn hơn để đọc và xấu xí hơn mã gốc.

(n == 1) ? m = 1 : 0; 

Điều này không được phép vì C# không cho phép biểu thức tùy ý làm tuyên bố. Cuộc gọi phương thức và nhiệm vụ được cho phép, hầu hết các biểu thức khác thì không.

Tuyên bố được thực hiện cho các tác dụng phụ của nó, một biểu thức cho giá trị của nó. Vì vậy, nó chỉ là tự nhiên mà phần ngoài cùng của một tuyên bố có một tác dụng phụ. ?: không bao giờ có tác dụng phụ, vì vậy nó không được cho phép như một tuyên bố.

1

Bạn muốn điều này:

m = (n == 1) ? 1 : 0;

Để lồng ghép tất cả nó sẽ trông như thế này:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0;

Nhưng như bạn có thể thấy, đây thực sự là rất nhiều ít dễ đọc và hiểu. Nó có thể giúp bổ sung thêm dấu ngoặc đơn, nhưng tôi nghĩ bạn nên sử dụng cây nếu có.

1
m = (n == 1) ? 1 : m 

Phương tiện

M bằng 1 nếu n == 1, khác m

FYI các ? được gọi là các nhà điều hành Ternery. Tìm việc sử dụng on MSDN

Trân trọng,

0

Hãy thử điều này:

m = (n == 1) ? 1 : 0; 
2

Có thể:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : m; 

hoặc

m = n 

Ed nó: Giản:

variable2 = (variable1 == value) ? 
      variable1 : 
      variable2; 
+0

+1 cho 'm = n'. Mã số tối ưu: P –

+0

Nghiêm túc? Đó là một ví dụ – user779444

+0

@ user779444 Không phải là một ví dụ thực sự tốt. Và nó khá dễ hiểu làm thế nào để làm điều đó từ câu trả lời của tôi. –

0

Đây không phải là một vấn đề cần được giải quyết với một ternary if/else điều hành - nó rõ ràng là một ứng cử viên lý tưởng cho một câu lệnh switch (và sử dụng một switch có khả năng là nhiều hơn nữa hiệu quả hơn là sử dụng một chuỗi các nhà khai thác ternary)

Nếu bạn muốn transliterate một câu lệnh if vào:?, sau đó nó khá đơn giản:

if ({condition}) {then-code}; else {else-code}; 

trở thành

{condition} ? {then-code} : {else-code}; 

Hạn chế duy nhất là mã sau đó/khác là một câu lệnh duy nhất.

Lợi ích chính của?: (Với trình biên dịch hiện đại) là nó có thể được nhúng trong một tuyên bố để nén mã nguồn một cách đáng kể - đôi khi điều này có thể hỗ trợ khả năng đọc, và đôi khi nó chỉ phục vụ cho ý nghĩa của mã - sử dụng nó cẩn thận.