2012-01-25 18 views
11

tôi không bao giờ sử dụng Hạn chế mới vì việc sử dụng không rõ ràng đối với tôi. ở đây tôi tìm thấy một mẫu nhưng tôi chỉ không hiểu việc sử dụng. ở đây là mã sốliên quan đến việc sử dụng Hạn chế mới trong C#

class ItemFactory<T> where T : new() 
{ 
    public T GetNewItem() 
    { 
     return new T(); 
    } 
} 

public class ItemFactory2<T> where T : IComparable, new() 

{ 
} 

vì vậy bất cứ ai hãy làm cho tôi hiểu việc sử dụng Hạn chế mới với số lượng nhỏ &. thanks

Trả lời

6

Ngoài Darin's answer, một cái gì đó như thế này sẽ không thành công vì Bar không có một constructor parameterless

class ItemFactory<T> where T : new() 
    { 
     public T GetNewItem() 
     { 
     return new T(); 
     } 
    } 

    class Foo : ItemFactory<Bar> 
    { 

    } 

    class Bar 
    { 
     public Bar(int a) 
     { 

     } 
    } 

lỗi thực tế là: 'Bar' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'ItemFactory<T>'

Sau đây cũng sẽ thất bại:

class ItemFactory<T> 
{ 
    public T GetNewItem() 
    { 
     return new T(); 
    } 
} 

Lỗi thực tế là: Cannot create an instance of the variable type 'T' because it does not have the new() constraint

+0

tôi chỉ cần biết rằng ... new() sẽ luôn được sử dụng cho tham số ít constructor. nếu constructor lấy tham số thì chúng ta không thể sử dụng cú pháp như ở đâu T: new()? Hãy thảo luận. cảm ơn – Thomas

11

Ràng buộc này yêu cầu loại chung được sử dụng không trừu tượng và nó có một hàm tạo mặc định (không tham số) cho phép bạn gọi nó.

dụ làm việc:

class ItemFactory<T> where T : new() 
{ 
    public T GetNewItem() 
    { 
     return new T(); 
    } 
} 

mà rõ ràng là bây giờ sẽ buộc bạn phải có một constructor parameterless cho các loại đó là thông qua như là đối số chung:

var factory1 = new ItemFactory<Guid>(); // OK 
var factory2 = new ItemFactory<FileInfo>(); // doesn't compile because FileInfo doesn't have a default constructor 
var factory3 = new ItemFactory<Stream>(); // doesn't compile because Stream is an abstract class 

không làm việc Ví dụ:

class ItemFactory<T> 
{ 
    public T GetNewItem() 
    { 
     return new T(); // error here => you cannot call the constructor because you don't know if T possess such constructor 
    } 
} 
+0

ctor mặc định là ctor trống;) – Novakov

+3

@Novakov: Không chính xác. Ctor mặc định là một ctor không có tham số. Nhưng cơ thể của nó không cần phải trống rỗng, nó rất tốt có thể chứa mã. –

+0

@Daniel: Tôi luôn luôn nghĩ rằng ctor mặc định là ctor được tạo ra bởi trình biên dịch nếu không có ctor được định nghĩa và 'mặc định' có nghĩa là có hành vi mặc định (gọi cơ sở lớp ctor). – Novakov

0

Thông số ràng buộc mới rằng bất kỳ đối số kiểu nào trong khai báo lớp chung đều phải có một hàm tạo tham số công khai.

trích dẫn từ các quan chức website

-1

Bạn có thể đọc new() như thể nó là một giao diện với một constructor. Cũng giống như IComparable đó quy định rằng kiểu T có một phương thức CompareTo, ràng buộc mới xác định rằng kiểu T có một hàm tạo công khai.

0

Trong ví dụ của bạn, ràng buộc hoạt động trên <T> trong tuyên bố lớp học. Trong trường hợp đầu tiên, nó yêu cầu đối tượng T chung có một hàm tạo mặc định (không tham số). Trong ví dụ thứ hai, yêu cầu rằng T phải có hàm tạo mặc định, không có tham số và phải triển khai giao diện IComparable.

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