lớp vô danh và một thể hiện của lớp đó bằng initializers đối tượng. Ví dụ, chúng ta có thể khởi tạo một đối tượng địa chỉ của khách hàng vô danh:
mới {khách hàng = khách hàng, địa chỉ = địa chỉ} này khai báo một lớp vô danh với hai tài sản, khách hàng và địa chỉ, và khởi tạo nó với một thể hiện của lớp khách hàng và một thể hiện của địa chỉ lớp. Các trình biên dịch C # có thể suy ra các loại bất động sản với các loại giá trị được giao, vì vậy ở đây, các loại tài sản của khách hàng là tầng lớp khách hàng, và các loại bất động sản Địa chỉ là lớp địa chỉ. Là một, đặt tên lớp học bình thường, các lớp học vô danh có thể có các thuộc tính của bất kỳ loại. Đằng sau hậu trường, C # biên dịch tạo ra một tên duy nhất cho các loại hình mới. Tên này không thể được tham chiếu trong mã ứng dụng; . Do đó, nó được coi là không tên
Mặc nhiên Typed Local Variables Bây giờ, chúng ta hãy quay trở lại với tuyên bố kết quả truy vấn mà bạn khai báo các kết quả như loại var:
Kết quả var = ... Bởi vì mệnh đề select trả về một thể hiện của một loại vô danh, bạn không thể xác định một loại rõ ràng IEnumerable. May mắn thay, C # 3.0 cung cấp một biến-mà địa phương tính năng ngầm gõ giải quyết vấn đề này. Bạn có thể khai báo một biến địa phương mặc nhiên đánh máy bằng cách xác định loại hình của nó như var:
var id = 1; var name = "Keith"; var khách hàng = Danh sách mới(); var người = new {FirstName = "Donna", LastName = "Gates", điện thoại = "123-456-7890"}; Các trình biên dịch C # suy luận kiểu của một biến địa phương ngầm gõ từ giá trị khởi tạo của nó. Vì vậy, bạn phải khởi tạo một biến như vậy khi bạn khai báo nó. Trong đoạn mã trên, các loại id sẽ được thiết lập như là một số nguyên, các loại tên như là một chuỗi, và các loại khách hàng như một danh sách kiểu mạnhcủa các đối tượng khách hàng. Các loại cuối cùng biến, người, là một loại vô danh có chứa ba đặc tính: FirstName, LastName, và điện thoại. Mặc dù loại này không có tên trong mã của chúng tôi, # C
biên dịch bí mật gán cho nó một và theo dõi trường hợp của nó. Trong thực tế, Visual Studio IDE IntelliSense cũng là nhận thức của các loại vô danh, như thể hiện trong hình 13-1.
Trở lại trong Ví dụ 13-3, kết quả là một thể hiện của xây dựng IEnumerablecó chứa kết quả truy vấn, nơi mà các loại của các đối số T là loại vô danh có chứa hai đặc tính: Khách hàng và Địa chỉ. Bây giờ các truy vấn được xác định, các câu lệnh tiếp theo thực hiện nó bằng cách sử dụng vòng lặp foreach:
foreach (var ca trong kết quả) {Console.WriteLine (string.Format ( "{0} đường nAddress: {1}", ca.Customer, ca .Địa chỉ nhà)); } Kết quả là một ngầm gõ IEnumerablecủa lớp ẩn danh {khách hàng, Địa chỉ}, biến lặp cũng là ngầm gõ vào cùng một lớp. Đối với mỗi đối tượng trong danh sách kết quả, ví dụ này chỉ đơn giản in thuộc tính của nó.
Mở rộng phương pháp Nếu bạn đã biết một chút SQL, các biểu thức truy vấn giới thiệu trong phần trước là khá trực quan và dễ hiểu vì LINQ cũng tương tự như SQL. Như C # mã là cuối cùng thực thi bởi CLR .NET, C # biên dịch đã dịch biểu thức truy vấn đến các định dạng dễ hiểu bởi .NET. Bởi vì thời gian chạy .NET hiểu các cuộc gọi phương pháp có thể được thực hiện, các truy vấn LINQ biểu thức viết bằng C # được chuyển thành một loạt các cuộc gọi phương pháp. Những phương pháp này được gọi là phương pháp mở rộng, và chúng được định nghĩa theo một cách hơi khác so với các phương pháp thông thường. Ví dụ 13-5 là giống hệt nhau để dụ 13-1 trừ nó sử dụng phương pháp mở rộng điều hành truy vấn, thay biểu thức truy vấn. Các bộ phận của mã mà không thay đổi được bỏ qua cho ngắn gọn.
Hình 13-1. Visual Studio IntelliSense nhận loại vô danh
Ví dụ 13-5. Sử dụng phương pháp mở rộng điều hành truy vấn
sử dụng hệ thống; using System; sử dụng System.Linq; không gian tên Programming_CSharp
Ví dụ 13-5. Sử dụng phương pháp mở rộng điều hành truy vấn (tiếp theo)
{// Simple lớp khách hàng public class Customer {// Tương tự như trong Ví dụ 13-1}
// Main chương trình public class Tester {static void Main () {Danh sáchkhách hàng = CreateCustomerList ();
// Tìm khách hàng bằng tên IEnumerablekết quả = customers.Where (khách hàng => customer.FirstName == "Donna"); Console.WriteLine ( "FirstName == " Donna ""); foreach (khách hàng khách hàng trong kết quả) Console.WriteLine (customer.ToString ()); }
đang được dịch, vui lòng đợi..
