2009-01-05 31 views
18

Tôi muốn khởi tạo một bộ sưu tập tĩnh trong lớp C# của tôi - một cái gì đó như thế này:Cách nào đúng để khởi tạo bộ sưu tập tĩnh không trống trong C# 2.0?

public class Foo { 
    private static readonly ICollection<string> g_collection = ??? 
} 

Tôi không chắc chắn về đúng cách để làm điều này; trong Java Tôi có thể làm điều gì đó như:

private static final Collection<String> g_collection = Arrays.asList("A", "B"); 

có cấu trúc tương tự trong C# 2.0 không?

Tôi biết trong các phiên bản sau của C# /. NET bạn có thể làm bộ khởi tạo bộ sưu tập (http://msdn.microsoft.com/en-us/library/bb384062.aspx), nhưng di chuyển không phải là một tùy chọn cho hệ thống của chúng tôi vào lúc này.

Để làm rõ câu hỏi ban đầu của tôi - Tôi đang tìm kiếm một cách để cô đọng tuyên bố một bộ sưu tập tĩnh đơn giản, chẳng hạn như một bộ sưu tập liên tục đơn giản các chuỗi. Cách tạo kiểu khởi tạo tĩnh cũng rất tốt để biết các bộ sưu tập các đối tượng phức tạp hơn.

Cảm ơn!

Trả lời

27

Nếu tôi hoàn toàn hiểu câu hỏi của bạn, có vẻ như một số người khác đã bị mất điểm, bạn đang tìm cách tạo một bộ sưu tập tĩnh theo cách tương tự với Java mà bạn có thể khai báo và điền vào một dòng mã mà không cần phải tạo một phương thức chuyên dụng để thực hiện việc này (theo một số gợi ý khác). Điều này có thể được thực hiện bằng một mảng đen (viết trên hai dòng để ngăn chặn di chuyển):

private static readonly ICollection<string> Strings = 
    new string[] { "Hello", "World" }; 

này cả hai tuyên bố và populates bộ sưu tập readonly mới với mục danh sách trong một đi. Hoạt động trong 2.0 và 3.5, tôi đã thử nghiệm nó chỉ để chắc chắn gấp đôi.

Trong 3,5 mặc dù bạn có thể sử dụng loại suy luận, do đó bạn không còn cần phải sử dụng string [] array mà loại bỏ thậm chí nhiều tổ hợp phím:

private static readonly ICollection<string> Strings = 
    new[] { "Hello", "World" }; 

Thông báo sự mất tích "chuỗi" gõ vào dòng dòng thứ hai. Chuỗi được tự động suy ra từ nội dung của bộ khởi tạo mảng.

Nếu bạn muốn để cư nó như là một danh sách, chỉ cần thay đổi lên các chuỗi mới [] cho danh sách mới a la:

private static readonly ICollection<string> Strings = 
    new List<string>() { "Hello", "World" }; 

Tất nhiên, vì loại của bạn là IEnumerable chứ không phải là một thực hiện cụ thể, nếu bạn muốn truy cập các phương pháp cụ thể để Liệt kê < string> như .ForEach(), bạn sẽ cần phải chuyển nó sang Liệt kê:

((List<string>)Strings).ForEach(Console.WriteLine); 

Nhưng đó là một giá nhỏ để trả cho migratability [là một từ?] .

+0

Vâng, đây là ý định của tôi - tôi sẽ chỉnh sửa câu hỏi để làm rõ hơn. Cảm ơn! –

5

lẽ bạn có thể gọi một phương thức tĩnh:

public class Foo 
{ 
    private static readonly ICollection<string> g_collection = initializeCollection(); 

    private static ICollection<string> initializeCollection() 
    { 
     ... TODO allocate and return something here ... 
    } 
} 

Hoặc, có một constructor tĩnh (như những người khác đề xuất) có thể là tương đương, hoặc thậm chí nhiều thành ngữ.

0

Cách duy nhất tôi có thể nghĩ là sẽ có một hàm tạo tĩnh. Vì vậy, đầu tiên bạn mới lên một bộ sưu tập mới ở cấp lớp, sau đó trong constructor tĩnh của bạn, thêm tất cả các giá trị cho nó.

0

bạn có thể khai báo một lớp bộ sưu tập tùy chỉnh và thêm ctor của riêng bạn để nó ...

public class MyFooCollection: Collection<string> 
    { 
     public MyFooCollection(string[] values) 
     { 
      foreach (string s in values) base.Add(s); 
     } 
    } 

sau đó trong mã khách hàng của bạn, bạn có thể viết

private static final MyFooCollection g_collection = 
     new MyFooCollection(new string[] {"A", "B"}); 
9

xây dựng tĩnh:

public class Foo 
{ 
    private static readonly ICollection<string> _collection; 

    static Foo() 
    { 
     _collection = new List<string>(); 
     _collection.Add("One"); 
     _collection.Add("Two"); 
    } 
} 

Nhưng lưu ý rằng trong trường hợp này, bạn chỉ có thể khởi tạo tập hợp nội tuyến (được đề xuất cho performance reasons):

private static readonly ICollection<string> _collection = new List<string>(new string[] { "One", "Two" }); 

Nó thực sự phụ thuộc vào độ phức tạp mã khởi tạo của bạn.

+0

Bạn có thể tăng cường khả năng đọc của mã bằng cách tinh chỉnh việc khởi tạo thêm một chút: ... = danh sách mới () {"một", "hai"}; – BenAlabaster

+2

+1 cho đề xuất thứ hai. – Quibblesome

0

Tôi thích sử dụng IEnumerable<T>.ToList().
Ngoài ra, nếu bộ sưu tập của bạn phải là chỉ đọc, bạn có thể sử dụng System.Collections.ObjectModel.ReadOnlyCollection.

private readonly ICollection<string> collection = new string[] { "a", "b", "c" }.ToList(); 

private readonly ReadOnlyCollection<string> collection2 = new ReadOnlyCollection<string>(new string[] { "a", "b", "c" }); 

EDIT:
Sau đó, một lần nữa, nếu bạn đang sử dụng nó như một ICollection, bạn có thể chỉ cần sử dụng các nhà xây dựng mảng (vì T[] là một IList<T> và một ICollection<T>). Hãy ghi nhớ rằng trong trường hợp này nhiều phương pháp alterring như Add sẽ thất bại:

private readonly ICollection<string> = new string[] { "a", "b", "c" }; 

EDIT # 2: ToList Tôi chỉ nhận ra là một chức năng gia hạn và chỉ có thể được sử dụng trong C# 3.0.Bạn vẫn có thể sử dụng hàm tạo Danh sách mặc dù:

private readonly IList<string> = new List<string>(new string[] { "a", "b", "c" }); 

Tuy nhiên, tôi thích ReadOnlyCollection cho danh sách chỉ đọc.

0

Sử dụng một constructor tĩnh như sau:

public class Foo 
{ 
    static readonly ICollection<string> g_collection; 

    // Static constructor 
    static Foo() 
    { 
     g_collection = new List<string>(); 
     g_collection.Add("Hello"); 
     g_collection.Add("World!"); 
    } 
} 
1

ngoài của constructor tĩnh, điều này cũng sẽ làm việc

public class Foo 
    { 
     private static readonly ICollection<string> _collection = 
       new List<string>(new string[] { "elem1", "elem2", "...", "elemn" }); 
    } 
0

Bạn có hai lựa chọn:

  1. Sử dụng giá trị trả về của một phương pháp tĩnh để khởi tạo bộ sưu tập.

  2. Sử dụng một hàm tạo tĩnh để tạo bộ sưu tập, điền nó và khởi tạo nó vào biến tĩnh.

Từ góc độ tùy chọn hiệu suất 1 là tốt hơn, vì trong trường hợp nhà xây dựng tĩnh, thời gian chạy có để kiểm tra xem các nhà xây dựng tĩnh được gọi là trước mỗi truy cập vào các lớp.

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