Làm việc thông qua một hướng dẫn (Professional ASP.NET MVC - Nerd Dinner), tôi tình cờ gặp đoạn mã này:sử dụng Thú vị của C# suất từ khóa trong Nerd Dinner hướng dẫn
public IEnumerable<RuleViolation> GetRuleViolations() {
if (String.IsNullOrEmpty(Title))
yield return new RuleViolation("Title required", "Title");
if (String.IsNullOrEmpty(Description))
yield return new RuleViolation("Description required","Description");
if (String.IsNullOrEmpty(HostedBy))
yield return new RuleViolation("HostedBy required", "HostedBy");
if (String.IsNullOrEmpty(Address))
yield return new RuleViolation("Address required", "Address");
if (String.IsNullOrEmpty(Country))
yield return new RuleViolation("Country required", "Country");
if (String.IsNullOrEmpty(ContactPhone))
yield return new RuleViolation("Phone# required", "ContactPhone");
if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
yield return new RuleViolation("Phone# does not match country", "ContactPhone");
yield break;
}
Tôi đã đọc lên trên yield
, nhưng tôi đoán sự hiểu biết của tôi vẫn còn hơi mờ. Điều có vẻ như là tạo một đối tượng mà cho phép đi xe đạp qua các mục trong bộ sưu tập mà không thực sự thực hiện thao tác đi xe đạp trừ khi và cho đến khi cần thiết.
Ví dụ này hơi lạ với tôi. Những gì tôi nghĩ nó đang làm là trì hoãn việc tạo ra bất kỳ trường hợp RuleViolation
nào cho đến khi lập trình viên thực sự yêu cầu một mục cụ thể trong bộ sưu tập bằng cách sử dụng for each
hoặc phương pháp mở rộng LINQ như .ElementAt(2)
.
Ngoài này, tuy nhiên, tôi có một số câu hỏi sau:
Khi nào những phần điều kiện của
if
báo cáo nhận được đánh giá? KhiGetRuleViolations()
được gọi hoặc khi số đếm thực sự được lặp lại? Nói cách khác, nếu giá trị củaTitle
thay đổi từnull
đếnReally Geeky Dinner
giữa thời gian tôi gọiGetRuleViolations()
và thời gian tôi cố gắng thực sự lặp lại, thìRuleViolation("Title required", "Title")
có được tạo hay không?Tại sao cần
yield break;
? Nó thực sự làm gì ở đây?Giả sử
Title
là rỗng hoặc trống. Nếu tôi gọiGetRuleViolations()
sau đó lặp lại kết quả hai lần trong một hàng, số lầnnew RuleViolation("Title required", "Title")
sẽ được gọi là bao nhiêu?
Trình biên dịch .Net biến đường cú pháp này thành dạng bastardized hơn. Biên dịch mẫu và sau đó tải IL trong phản xạ. Bạn nên được abe để hiểu chính xác những gì đang xảy ra ở đó. –