2011-08-28 29 views
8

Tôi muốn biết các câu lệnh dưới đây có bao giờ trả về một kết quả khác nhau cho các loại tham chiếu hay chúng giống nhau không?mặc định (T) so với Activator.CreateInstance (T)

  1. default(T)
  2. Activator.CreateInstance(T)

Nếu họ là giống hệt nhau, bạn có thể luôn luôn sử dụng mặc định (T), trong ví dụ này, nếu mục đích là để sản xuất các giá trị mặc định của T ?:

if (typeof(T).IsValueType || typeof(T) == typeof(String)) 
{ 
    return default(T); 
} 
else 
{ 
    return Activator.CreateInstance<T>(); 
} 

Best way to test if a generic type is a string? (c#)

ta!

+2

Không, mặc định (T) cho kiểu tham chiếu trả về null, CreateInstance() không phải vì nó tạo đối tượng kiểu T. Khó đoán mã này thực sự cố gắng làm gì làm. –

+2

Không phải là 'mặc định (chuỗi)' null quá? – BoltClock

+0

Cảm ơn bạn đã xóa bỏ sự nhầm lẫn! Các mẫu mã là một phần của sự nhầm lẫn, tôi thấy nó tại stackoverflow bài liên kết dưới đây nó .. – Cel

Trả lời

14

Chúng hoàn toàn khác nhau.

  1. default(T), khi T là một loại tài liệu tham khảo, sẽ luôn luôn được null.
  2. Activator.CreateInstance<T>() sẽ tạo phiên bản mới của loại đó bằng cách sử dụng hàm tạo mặc định nếu có, nếu không, hãy ném MissingMethodException.
3

Chúng sẽ luôn trả lại kết quả khác khi T là loại tham chiếu. default(T) sẽ trả về null, trong khi Activator.CreateInstance<T>() sẽ trả lại phiên bản mới T, được tạo bằng cách sử dụng hàm tạo công khai không cần tham số của T.

+3

Hoặc ném một ngoại lệ nếu nó không thể tìm thấy một constructor như vậy. – BoltClock

+0

Tất nhiên. Đó là một trường hợp đặc biệt, nơi nó sẽ không thực sự trở lại bất cứ điều gì cả. – cdhowie

2

default(T) sẽ trả lại null cho các loại tham chiếu. Activator.CreateInstance<T>() sẽ không. A string là loại tham chiếu trong .NET.

+0

+1 cho dòng cuối cùng cho OP – nawfal

5

Đối với loại tham chiếu, default(T) sẽ là rỗng, trong khi CreateInstance thực sự trả về đối tượng mới loại T (hoặc không thành công nếu không có hàm tạo phù hợp), do đó kết quả sẽ không bao giờ giống nhau.

2

Không chắc whate bạn đang yêu cầu nhưng chúng khác nhau:

default(T) lợi nhuận null nếu T không phải là một loại giá trị ... cuộc gọi CreateInstance tạo ra một thể hiện và kêu gọi các nhà xây dựng mặc định nếu có một (nếu không một ngoại lệ được ném) ...

Các vấn đề liên quan