Hãy xem xét điều này:.NET có được hưởng lợi từ các loại "có tên nặc danh" không?
var me = new { FirstName = "John", LastName = "Smith" };
Điều này là tốt như chúng tôi sau đó có thể làm điều này:
Console.WriteLine("{0} {1}", me.FirstName, me.LastName);
Tuy nhiên chúng ta không thể làm điều này:
public T GetMe()
{
return new { FirstName = "John", LastName = "Smith" };
}
vì chúng ta không biết loại T.
Chúng tôi có thể thực hiện việc này:
public object GetMe()
{
return new { FirstName = "John", LastName = "Smith" };
}
nhưng sau đó chúng tôi sẽ phải kiểm tra các thuộc tính của đối tượng sử dụng phản ánh để truy cập chúng:
var p = new Prog();
object o = p.GetMe();
Type t = o.GetType();
foreach (var prop in t.GetProperties())
{
Console.WriteLine(prop.Name + ": " + prop.GetValue(o, null));
}
Tuy nhiên những gì về nếu chúng ta có thể đặt tên cho một loại vô danh như chúng ta định nghĩa nó? Tất nhiên nó sẽ không còn là vô danh, tuy nhiên nó sẽ gọn gàng hơn và có thể duy trì hơn một định nghĩa lớp bình thường.
Hãy xem xét điều này:
public Person GetMe()
{
return new public class Person { FirstName = "John", LastName = "Smith" };
}
Lợi ích là sau đó nó sẽ có thể để trả lại kết quả của một truy vấn LINQ phức tạp từ một phương pháp mà không cần phải xác định các lớp một cách rõ ràng.
Xem xét việc này tương đối phức tạp truy vấn LINQ:
List<int> list = new List<int>();
var query = from number in list
select
new
{
Number = number,
Square = number*number,
Absolute = Math.Abs(number),
Range = Enumerable.Range(0, number)
};
Thay vì xác định một lớp học như vậy:
public class MyNumbers
{
public int Number { get; set; }
public int Square { get; set; }
public int Absolute { get; set; }
public IEnumerable<int> Range { get; set; }
}
để trả lại biến truy vấn từ một phương pháp chúng ta có thể thay vì chỉ làm điều này:
List<int> list = new List<int>();
return from number in list
select new public class MyNumbers
{
Number = number,
Square = number*number,
Absolute = Math.Abs(number),
Range = Enumerable.Range(0, number)
};
Điều đó sẽ rất xấu khi bạn bắt đầu sử dụng MyNumbers trong các ngữ cảnh khác. Nếu bạn đang sử dụng một kiểu trên các đường biên của phương thức, nó sẽ dễ bảo trì và dễ đọc hơn nếu kiểu đó không được khai báo nội dòng như bạn đề xuất. –
+1 nhận xét của spoon16. – strager
Điểm công bằng mặc dù tôi nghĩ bạn có thể đặt một số thông minh vào trình biên dịch để giảm thiểu những vấn đề này. –