Nó có nghĩa gì?


36

Đôi khi tôi thấy đoạn mã sau đây và không biết biểu thức nào đang thực sự kiểm tra.

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

Câu trả lời:


28

Đó chỉ là mẫu thuộc tính trống trong C # 8, có nghĩa là giá trị không null. Nó phù hợp với bất kỳ loại giá trị hoặc loại tham chiếu. Như Panagiotis Kanavos ghi chú trong các bình luận, điều này tương đương với value is objectkiểm tra cũ đã có trong C # trong một thời gian dài.

Nói chung nếu bạn chỉ định một thuộc tính, thì nó sẽ khớp hoặc không. Ví dụ bí truyền này minh họa rằng:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

Các mẫu thuộc tính hoạt động tốt nhất và rõ ràng nhất khi so sánh với các mẫu khác trong các trường hợp như switchbiểu thức.


1
không có nghĩa là đối tượng trống trong trường hợp này là gì? Chuỗi trống, khoảng trắng?
OlegI

3
@OlegI không, không phải vậy. slà dứt khoát không null. is {}là tốc ký is objectvà chuỗi có thể được truyền tới đối tượng.
Panagiotis Kanavos

6
@OlegI làm sao vậy? nó là một tài liệu tham khảo hợp lệ để nó phù hợp.
Daniel A. White

3
Đó là một thế giới mới, nơi cấu trúc có thể được null và tài liệu tham khảo không thể được null, báo cáo chuyển đổi được đảo ngược và khác nhau !, !!, ???trước và sau khi tính có nghĩa là những thứ khác nhau. Khi nào thì cú pháp đường cao cấp?
ja72

3
Có giống như value != nullvậy không?
ca9163d9

7

Mặc dù câu trả lời của Daniel là đúng, tôi nghĩ có thể hữu ích khi thêm một số bối cảnh về lý do tại sao bạn có thể thấy mẫu thuộc tính trống đang sử dụng. Xem xét phương pháp điều khiển ví dụ này cần thực hiện một số xác nhận:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

Ở trên, ValidateId() có thể trả về null hoặc một thể hiện của BadObjectRequestResult. Nếu cái trước được trả về, xác nhận thành công và chuyển sang phần còn lại của cơ thể Update. Nếu cái sau được trả về, is {}đúng (dĩ nhiên là một thể hiện của BadObjectRequestResultmột object) và xác nhận thất bại.

Đặc biệt, trong số này, chúng tôi cũng đã cung cấp một tên biến invalid, mà chúng tôi có thể trả lại ngay lập tức. Không có điều đó, chúng ta sẽ cần mã dài hơn một chút.

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

Cho dù cái này dễ đọc hơn hay cái kia tùy thuộc vào người đọc, tôi vừa trình bày một cách có thể sử dụng mẫu thuộc tính trống.


Trong trường hợp đó, người ta nên sử dụng is object invalid, khôngis {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos sẽ không hoạt động trong trường hợp này bởi vì IActionResultcần phải trả lại (về mặt kỹ thuật Task<IActionResult>). Nếu chúng ta đi với phong cách của bạn, ifcó kết quả tương tự nhưng invalidsẽ là một objectvì vậy đây sẽ không biên dịch.
Bộ

0

Tôi nghĩ rằng nó là để kiểm tra nếu giá trị là một đối tượng trống

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.