2010-09-22 48 views
8

thể trùng lặp:
What do two question marks together mean in C#?'??' có nghĩa là trong C#?

Tôi đang cố gắng để hiểu những gì Statment này không: những gì hiện "??" nghĩa là? là loại som này nếu if-statment?

string cookieKey = "SearchDisplayType" + key ?? ""; 
+4

Nếu có thể tìm kiếm "??" trên SO này sẽ đủ điều kiện làm bản sao của ví dụ: [this] (http://stackoverflow.com/questions/770186/null-coalescing-operator-what-does-coalescing-mean). :-( –

+5

1. Bắt đầu C#. 2. '??' 3. LỢI NHUẬN! – leppie

+0

xem ra vì các toán tử ưu tiên http://msdn.microsoft.com/en-us/library/6a71f45d.aspx – tom3k

Trả lời

14

Đây là toán tử Null Coalescing. Nó có nghĩa là nếu phần đầu tiên có giá trị thì giá trị đó được trả về, ngược lại nó trả về phần thứ hai.

ví dụ .:

object foo = null; 
object rar = "Hello"; 

object something = foo ?? rar; 
something == "Hello"; // true 

Hoặc một số mã thực tế:

IEnumerable<Customer> customers = GetCustomers(); 
IList<Customer> customerList = customers as IList<Customer> ?? 
    customers.ToList(); 

gì ví dụ này đang làm được đúc khách hàng là một IList<Customer>. Nếu kết quả này được tính bằng một giá trị rỗng, nó sẽ gọi phương thức LINQ ToList trên IEnumerable của khách hàng.

Các so sánh câu lệnh if sẽ là:

IEnumerable<Customer> customers = GetCustomers(); 
IList<Customer> customersList = customers as IList<Customer>; 
if (customersList == null) 
{ 
    customersList = customers.ToList(); 
} 

Đó là rất nhiều mã so với làm việc đó trong một dòng duy nhất sử dụng toán tử null-coalescing.

+2

chỉ một điểm -> bạn không thể làm 'var foo = null; ' – nothrow

+0

@Yossarian - Vâng, điểm tốt, nhưng nó chỉ là mã giả. Tôi đã thay đổi nó để tránh nhầm lẫn. – GenericTypeTea

+0

@Yossarian - Bạn có thể làm' var foo = (object) null; ' hoặc 'var foo = (SomeClass) null;' sẽ giúp ke ep biến tên xếp hàng và mã dễ đọc. – Enigmativity

5

Đó là this. Vâng, không thực sự.

Thực tế, đó là this. Và this, this, thisthis, để đặt tên một vài. Tôi đã sử dụng Google toàn năng để tìm chúng, vì SO không có chức năng tìm kiếm trong các câu trả lời (đúng?), Do đó làm cho việc tìm kiếm các bản sao trùng lặp với loại câu hỏi này trở nên khó khăn. Vâng, trong tương lai, hãy sử dụng nó làm tài liệu tham khảo. ;-)

Nó được gọi là toán tử kết hợp null. Về cơ bản, nó giống với số

int? nullableDemoInteger; 
// ... 
int someValue = nullableDemoInteger ?? -1; 
// basically same as 
int someValue = nullableDemoInteger.HasValue ? nullableDemoInteger.Value : -1; 
// basically same as 
int someValue; 
if(nullableDemoInteger.HasValue) 
    someValue = nullableDemoInteger.Value; 
else 
    someValue = -1; 
+0

+1 cách sử dụng tốt nhất của ?? là các loại vô hiệu imo – abatishchev

1

Toán tử kết hợp không hoạt động của nó.

Điều này có nghĩa là nếu key không phải là rỗng, nó sử dụng giá trị của khóa, Nếu khóa là null, nó sử dụng giá trị "".

4

Đó là null-coalescing operator.Trong trường hợp này nó tương đương với:

string cookieKey; 
string temp = "SearchDisplayType" + key; 
if (temp == null) 
    cookieKey = ""; 
else 
    cookieKey = temp; 

Và, kể từ "SearchDisplayType" + key bao giờ có thể null, đây chính là tương đương với:

string cookieKey = "SearchDisplayType" + key; 
+0

+1. Đánh tôi đi. Chỉ có câu trả lời cho đến nay đề cập đến sự ưu tiên của '??' vs '+' và nó là thừa trong ví dụ của OP. – Ani

+0

Sai. Nếu (key == null) không nếu ("SearchDisplayType" + key) == null). – Goran

+0

@Goran: Không, LukeH là chính xác. Có lẽ nó không trực quan, nhưng kiểm tra nó ra. – Ani

1

?? là null-coalescing.

Từ MSDN:

Các ?? toán tử được gọi là toán tử kết hợp rỗng và được sử dụng để xác định giá trị mặc định cho các loại giá trị có thể loại có thể vô hiệu cũng như các loại tham chiếu . Nó trả về toán hạng bên trái nếu nó không phải là rỗng; nếu không, nó sẽ trả về toán hạng đúng.

Lưu ý, tuy nhiên, trong trường hợp của bạn, phần bên trái của biểu thức không thể rỗng, beacuse nó là một nối chuỗi liên tục với một biến. Nếu khóa là null, thì phím "SearchDisplayType" + sẽ được đánh giá là "SearchDisplayType".

Tôi đoán mục đích của tuyên bố của bạn có thể được thực hiện với:

string cookieKey = key==null ? "" : "SearchDisplayType"+key; 

sử dụng mã này, cookieKey được thiết lập để chuỗi rỗng nếu chính là null, nếu không được thiết lập để nối của "SearchDisplayType" + phím