Câu trả lời:
Đó 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.
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.
!, !!, ?và ??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?
value != nullvậy không?
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 {}là đú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.
is object invalid, khôngis {} invalid
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.