2010-11-21 47 views
13

Có một lớp học AuthenticationBase trong WCF RIA Services. Định nghĩa lớp học như sau:Tính năng mới() có nghĩa là gì?

// assume using System.ServiceModel.DomainServices.Server.ApplicationServices 

public abstract class AuthenticationBase<T> 
    : DomainService, IAuthentication<T> 
    where T : IUser, new() 

new() có nghĩa là gì trong mã này?

Trả lời

21

Đó là new constraint.

Nó xác định rằng T không phải abstract và phải vạch trần một public parameterless constructor để được sử dụng như một generic type argument cho lớp AuthenticationBase<T>.

+2

Chỉnh sửa chúng tôi phải sửa đổi: loại phải có các tính năng này để được sử dụng làm đối số chung * 'T' là kiểu tham số * chung loại *, nhưng loại thực sự được sử dụng, (ví dụ' đối tượng', 'int') là đối số kiểu. –

+1

@Jon, ghi chú hợp lệ, cảm ơn :) –

7

Sử dụng từ khóa mới() yêu cầu hàm tạo mặc định được định nghĩa cho lớp đã nói. Nếu không có từ khóa, cố gắng để lớp mới() sẽ không biên dịch.

Ví dụ: đoạn mã sau sẽ không biên dịch. Hàm sẽ cố gắng trả về một cá thể mới của tham số.

public T Foo <T>() 
// Compile error without the next line 
// where T: new() 
{ 
    T newInstance = new T(); 
    return newInstance; 
} 

Đây là ràng buộc loại chung. Xem này MSDN article.

5

Điều này có nghĩa là loại được sử dụng để điền thông số chung T phải có hàm tạo công khai và không tham số. Nếu kiểu không thực hiện một hàm tạo như vậy, điều này sẽ dẫn đến lỗi biên dịch.

Nếu áp dụng ràng buộc chung new(), như trong ví dụ này, cho phép lớp hoặc phương pháp (lớp AuthenticationBase<T> trong trường hợp này) gọi new T(); để tạo phiên bản mới của loại được chỉ định. Không có cách nào khác, thiếu phản ánh (điều này bao gồm việc sử dụng System.Activator, để xây dựng một đối tượng mới thuộc loại chung chung.