2011-01-24 26 views
59

Có thể thêm phương thức mở rộng hàm tạo không? Tôi muốn thêm một danh sách < T> constructor để nhận số tiền cụ thể của byte trong một bộ đệm cho phần điền (nếu không có sự cần thiết của việc sao chép chỉ các byte liên quan và vân vân):Có thể tạo phương thức khởi tạo-mở rộng không? làm sao?

... 
public static List<T>(this List<T> l, T[] a, int n) 
{ 
    for (int i = 0; i < n; i++) 
     l.Add(a[i]); 
} 
... 

nên sử dụng sẽ :

List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes); 

tôi đã thêm một phương pháp khuyến nông AddRange:

public static void AddRange<T>(this List<T> l, T[] a, int n) 
{ 
    for (int i = 0; i < n; i++) 
     l.Add(a[i]); 
} 

tôi muốn làm điều đó như một constructor quá. Có thể không? nếu có - làm thế nào?

Trả lời

42

Không, nhưng nếu bạn đã thay đổi chữ ký AddRange của bạn để trả lại ví dụ danh sách, sau đó bạn ít nhất có thể làm

var list = new List<int>().AddRange(array, n); 

mà IMHO có lẽ là rõ ràng hơn so với quá tải constructor anyway.

+0

Tuyệt vời! Tôi đã bỏ lỡ khả năng đó - đó chính xác là những gì tôi đang tìm kiếm! – Tar

+0

Thay thế tuyệt vời! Tôi đã sử dụng ví dụ của bạn để thêm một phương thức Initialize vào một đối tượng DataColumn. Tôi cho rằng .AnEvenBetterConstructor (...) sẽ là quá nhiều. –

19

Trong một từ - không. Hãy xem this để được giải thích.

Chúng được cắt từ danh sách tính năng C# 3, sau đó chúng được cắt từ danh sách tính năng C# 4, và chúng tôi chỉ có thể hy vọng rằng chúng có thể tạo ra các tính năng C# 5, nhưng tôi không lạc quan lắm.

+36

thiếu của bạn lạc quan là hợp lý. –

+3

Nhưng Swift có nó>. < –

27

Câu trả lời của SWeko về cơ bản là chính xác, mặc dù tất nhiên bài viết mà anh ấy liên kết là về các thuộc tính mở rộng chứ không phải là các hàm tạo mở rộng.

Chúng tôi cũng đã thiết kế thô cho các nhà thầu mở rộng cùng lúc với các thuộc tính mở rộng của chúng tôi; họ sẽ là một đường cú pháp đẹp cho mẫu nhà máy. Tuy nhiên, họ không bao giờ vượt qua giai đoạn thiết kế; tính năng, mặc dù tốt đẹp, không thực sự cần thiết và không cho phép bất kỳ kịch bản mới tuyệt vời nào.

Nếu bạn có một vấn đề thực sự tuyệt vời mà các nhà thầu mở rộng sẽ giải quyết, tôi rất sẵn lòng nghe thêm chi tiết. Chúng tôi nhận được nhiều phản hồi thực tế hơn, chúng tôi càng có khả năng đánh giá những thành tích tương đối của hàng trăm đề xuất tính năng khác nhau mà chúng tôi nhận được hàng năm.

+0

Xin chào Eric. Có một ví dụ ở đây mà tôi có. Không biết nếu tis tốt nhưng ... Tôi có hơn 50 lớp học từ Silverlight 2.0 mà tôi phải chuyển đổi sang WPF 4.0. Lớp WriteableBitmap có một hàm khởi tạo thực sự khác. Rất phức tạp hơn trong WPF nhưng chúng ta có thể sửa 4 thông số mới. Bằng cách có khả năng tạo (ghi đè) một hàm tạo mới, sau đó chúng ta có thể lưu lại cho chúng ta rất nhiều mã viết lại. Cảm ơn. –

+0

Nó sẽ thực sự hữu ích đối với constructor mở rộng 'string' để nó có thể làm việc với' default (string) '. Hoặc là hoặc cung cấp một hàm tạo mặc định cho 'chuỗi'. –

+4

Tôi nhận ra rằng tôi đang mang một zombie trở lại cuộc sống, nhưng một nơi mà nó sẽ rất hữu ích để có xây dựng phần mở rộng là cho trường hợp ngoại lệ.Tôi muốn thay thế các thông số tin nhắn trong hầu hết các phần mở rộng với một quá tải mà mất một định dạng và params đối tượng [] đối số, vì vậy mà tôi không cần phải explicatly gọi string.Format() để tạo ra các tin nhắn. –

8

Tôi biết đây là một vết sưng, chỉ muốn chỉ ra bạn có thể kế thừa lớp Danh sách và làm điều gì đó như thế này:

class List<T> : System.Collections.Generic.List<T> 
    { 
     public List(T[] a, int n) 
      : base() 
     { 
       AddRange(a, n); 
     } 
    } 
Các vấn đề liên quan