Những gì bạn đang nhìn là một thành viên thể hiện không phải là một biểu hiện lambda.
Khi trình biên dịch gặp một thành viên thuộc tính biểu thức , về cơ bản nó sẽ chuyển đổi nó thành một getter như thế này:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Bạn có thể tự xác minh điều này bằng cách bơm mã vào một công cụ có tên là TryRoslyn .)
Các thành viên thân thể biểu hiện - giống như hầu hết các tính năng C # 6 - chỉ là đường cú pháp . Điều này có nghĩa là họ không cung cấp chức năng mà không thể đạt được thông qua các tính năng hiện có. Thay vào đó, các tính năng mới này cho phép sử dụng cú pháp ngắn gọn và biểu cảm hơn
Như bạn có thể thấy, các thành viên thể hiện có một số phím tắt giúp các thành viên thuộc tính gọn hơn:
- Không cần sử dụng
return
câu lệnh vì trình biên dịch có thể suy ra rằng bạn muốn trả về kết quả của biểu thức
- Không cần tạo khối lệnh vì cơ thể chỉ có một biểu thức
- Không cần sử dụng
get
từ khóa vì nó được ngụ ý bởi việc sử dụng cú pháp thành viên biểu thức.
Tôi đã làm cho điểm cuối cùng được in đậm vì nó có liên quan đến câu hỏi thực tế của bạn, mà tôi sẽ trả lời ngay bây giờ.
Sự khác biệt giữa ...
// expression-bodied member property
public int MaxHealth => x ? y:z;
Và ...
// field with field initializer
public int MaxHealth = x ? y:z;
Có giống như sự khác biệt giữa ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
Và ...
public int MaxHealth = x ? y:z;
Mà - nếu bạn hiểu thuộc tính - nên rõ ràng.
Mặc dù vậy, chỉ cần rõ ràng: danh sách đầu tiên là một tài sản với một getter dưới mui xe sẽ được gọi mỗi khi bạn truy cập nó. Danh sách thứ hai là một trường có trình khởi tạo trường, biểu thức chỉ được ước tính một lần, khi kiểu được khởi tạo.
Sự khác biệt về cú pháp này thực sự khá tinh tế và có thể dẫn đến một "gotcha" được Bill Wagner mô tả trong một bài đăng có tựa đề "AC # 6 gotcha: Khởi tạo so với các thành viên thân thể biểu hiện" .
Mặc dù các thành viên thân biểu hiện giống như biểu thức lambda , nhưng chúng không phải là biểu thức lambda. Sự khác biệt cơ bản là biểu thức lambda dẫn đến một thể hiện ủy nhiệm hoặc cây biểu thức. Các thành viên thể hiện chỉ là một chỉ thị cho trình biên dịch để tạo ra một thuộc tính đằng sau hậu trường. Sự giống nhau (nhiều hơn hoặc ít hơn) bắt đầu và kết thúc bằng mũi tên ( =>
).
Tôi cũng sẽ thêm rằng các thành viên thân thể biểu hiện không giới hạn đối với các thành viên tài sản. Họ làm việc trên tất cả các thành viên này:
- Tính chất
- Người lập chỉ mục
- Phương pháp
- Người vận hành
Đã thêm vào C # 7.0
Tuy nhiên, họ không làm việc trên các thành viên này:
- Các loại lồng nhau
- Sự kiện
- Lĩnh vực