2010-01-13 4 views
1

비어 있지만 채워질 필요가있는 클래스 (Foo 클래스)가 사용할 컬렉션 개체가있는 경우 생성자에서 채우기를 수행하는 것이 가장 좋습니다. 같은ctor 또는 개인 정적 메서드로 컬렉션을 채워야합니까?

뭔가 :

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

또는 그것은 정적 개인의 ctor에서해야 하는가? 상태가 포함 된 클래스에서 변경되지 않으므로 정적 일 수 있습니다.

여기에 쓰면 this.Name = name; 또는 :

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

이 둘 모두 상태가 변경되는 것으로 알려져 있으며 정적이어서는 안됩니까? 아니면 단지 인스턴스와 함께 무엇입니까?

다시 컴파일하지 않고 내용을 변경할 수있는 컬렉션이 필요한 경우 원본으로 txt 파일이나 xml을 사용해야합니다. 콜렉션을 사용할 때 어느 것이 더 빠릅니까? Txt 파일은 ReadAllLines()를 사용합니다. XML은 NodeNavigator (정확한 메소드/객체 이름이 확실하지 않음)를 사용합니다.

감사합니다.

+2

적어도 여기에는 3 가지 질문이 있다고 생각합니다. 세 가지 다른 질문으로 제안 할 수 있습니까? –

답변

3

먼저 정적 생성자는 공개/비공개 일 수 없습니다. 그들은 단순히 존재합니다.

컬렉션의 동일한 인스턴스가 소유 클래스의 모든 인스턴스간에 공유되는 경우 정적 일 수 있습니다.

정적은 상태를 변경하지 않는다는 것을 의미하지 않습니다. 그것은 여전히 ​​변할 수 있습니다. 차이점은 정적 필드는 클래스의 모든 인스턴스간에 공유되므로 해당 필드에 대한 변경 가능한 작업을 조정해야한다는 것입니다. 클래스의 모든 인스턴스가 인 경우 항상은 동일한 데이터를 사용하므로 정적으로 만듭니다.

텍스트 파일이나 XML 파일이 더 빠른지 여부는 데이터에 따라 다릅니다.

2

"정적"의 의미를 오해 한 것 같습니다.

"static"은 C#에서 상태가 변경되지 않는다는 것을 의미하지 않습니다. 상태가 변화하는 정적 변수를 가질 수 있습니다.

C#에서 "정적"은 가변성 범위가 아니라 변수의 범위를 나타냅니다. 변수를 정적 변수로 정의하고 정적 변수 (static ctor)를 사용하면 인스턴스 수준이 아닌 클래스 수준에서 작업하게됩니다.

변수가 클래스의 인스턴스가 아닌 클래스에만 해당되는 경우 변수를 정적으로 만드는 것이 적절할 수 있습니다.

0

컬렉션은 컴파일시 값의 알려진 고정 세트가있는 경우, 수도, C#을 3.0 (VS 2008), 클래스 정의에 사용되는 컬렉션 초기화 구문 다음에

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

ReadOnlyCollectionSystem.Collections.ObjectModel 네임 스페이스 List<string> 생성자의 5는 용량을 나타내며 미리 숫자를 알고 있으면 런타임 최적화가 발생합니다.

관련 문제