GurdeepS
GurdeepS

Reputation: 67233

Should I fill collections in ctor or private static method?

If I have a collection object which is empty but needs to be filled and is going to be used by a class (say class Foo), then is it best to do the filling in the constructor?

Something like:

List<string> strings = new List<string();
strings.Add("sjsjhsj");
 // So on...

Or should it be in a static private ctor? State is not being changed of the containing class so this can be static, right?

BTW, if I write this.Name = name; or:

john.Name = name;
// Instance method passing in john as a Person object.

Are these both known to be changing state and thus should not be static? Or is it only with instance?

If I need a collection which I want to be able to change the contents of without a recompile, I should use a txt file or xml as the source. Which is faster when using for collections? Txt file will use ReadAllLines(); and XML will use a NodeNavigator (not sure of exact method/object names).

Thanks

Upvotes: 1

Views: 171

Answers (3)

Jesse C. Slicer
Jesse C. Slicer

Reputation: 20157

If the collection has a static, known set of values at compile time, you may, in C# 3.0 (VS 2008), use collection initializer syntax in your class definition:

private static readonly IList<string> strings = new ReadOnlyCollection<string>(
    new List<string>(5)
    {
        "sjsjhsj",
        "string 2",
        "string 3",
        "string 4",
        "string 5"
    });

ReadOnlyCollection lives in the System.Collections.ObjectModel namespace. The 5 in the List<string> constructor refers to its capacity and, if you know the number in advance, will result in runtime optimization.

Upvotes: 0

Reed Copsey
Reed Copsey

Reputation: 564641

I think you have a misunderstanding of the meaning of "static".

"static", in C#, does not mean that the state does not change. You can have static variables that have changing state.

In C#, "static" refers to the scope of the variable - not its mutability. When you define a variable as static (and use a static ctor), you're working at the class level instead of the instance level.

If your variable is specific to the class, and not an instance of the class, then it may be appropriate to make it static.

Upvotes: 2

user47589
user47589

Reputation:

First, static constructors cannot be public / private. They simply exist.

If the same instance of your collection is going to be shared amongst all instances of the owning class, then it can be static.

Static doesn't mean it doesn't change state. It can still change. The difference is static fields are shared between all instances of the class, so mutable operations on that field need to be coordinated. If all instances of the class will always use the same data, make it static.

Whether a text file or an xml file is faster for you depends on the data.

Upvotes: 3

Related Questions