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 object
kiể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ư switch
biểu thức.
s
là dứt khoát không null. is {}
là tốc ký is object
và 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 != null
vậ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 BadObjectRequestResult
mộ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
IActionResult
cầ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, if
có kết quả tương tự nhưng invalid
sẽ là một object
vì vậy đây sẽ không biên dịch.