2010-10-13 53 views
9

Tôi nghĩ rằng tôi nhớ nhìn thấy một cái gì đó tương tự như ?: ternary operator trong C# mà chỉ có hai phần cho nó và sẽ trả về giá trị biến nếu nó không phải là null và một giá trị mặc định nếu nó được. Một cái gì đó như thế này:Toán tử kết hợp trong C#?

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default"; 

Về cơ bản tương đương với điều này:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default"; 

Có một điều như vậy tồn tại hoặc đã làm tôi chỉ tưởng tượng nhìn thấy ở đâu đó điều này?

+1

Có thể trùng lặp -> http: // stackoverflow.com/questions/463155/how-does-the-ternary-operator-work –

+3

@Junior nhưng đó là về toán tử bậc ba trong khi đó là về toán tử kết hợp (bất chấp tiêu đề) – Rup

+1

@Junior, trong khi tiêu đề của câu hỏi của tôi là ít gây hiểu lầm nếu bạn đọc câu hỏi của tôi, bạn sẽ thấy nó không có gì để làm với bản sao bạn đề nghị. –

Trả lời

3

Funny bạn sử dụng "?? MỘT SỐ ĐIỀU HÀNH TẠI ĐÂY ??", như các nhà điều hành bạn đang tìm kiếm là "??", ví dụ:

tb_MyTextBox.Text = o.Member ?? "default"; 

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

+1

Heh, chắc phải là tiềm thức của tôi. Biết tôi đã thấy nó ở đâu đó. –

17

Vâng, nó không hoàn toàn giống như các conditional operator, nhưng tôi nghĩ rằng bạn đang nghĩ đến việc các null coalescing operator (??). (Tôi đoán bạn đã nói nó là "tương tự" :) Lưu ý rằng "ternary" chỉ đề cập đến số toán hạng toán tử là - vì vậy trong khi toán tử điều kiện là toán tử bậc ba, toán tử kết hợp null là toán tử nhị phân.

Nó rộng rãi có dạng như sau:

result = first ?? second; 

Đây second sẽ chỉ được đánh giá nếu first là null. Nó không phải là mục tiêu của một nhiệm vụ - bạn có thể sử dụng nó để đánh giá một đối số phương thức, ví dụ.

Lưu ý rằng toán hạng đầu tiên để có thể vô hiệu hóa - nhưng điều thứ hai thì không. Mặc dù có một số chi tiết cụ thể về chuyển đổi, trong trường hợp đơn giản, loại biểu thức tổng thể là loại toán hạng thứ hai. Do associativity, bạn có thể ngăn xếp sử dụng của các nhà điều hành gọn gàng quá:

int? x = GetValueForX(); 
int? y = GetValueForY(); 
int z = GetValueForZ(); 

int result = x ?? y ?? z; 

Lưu ý cách xy là nullable, nhưng zresult thì không. Tất nhiên, zcó thể có thể bị vô hiệu hóa, nhưng sau đó result cũng sẽ phải rỗng.

Về cơ bản toán hạng sẽ được đánh giá theo thứ tự chúng xuất hiện trong mã, với việc đánh giá dừng khi nó tìm thấy giá trị không null.

Ồ, và mặc dù ở trên được thể hiện dưới dạng các loại giá trị, nó cũng hoạt động với các loại tham chiếu (là luôn là không thể sử dụng).