2012-05-26 4 views
1

안녕하세요 아래 코드의 목적은 관련 데이터 집합을 보유하는 정적 클래스를 반환하는 것입니다. 내가 더 잘할 수있는 방법을 권할 수 있니?C# 정적 클래스 선언

public class People 
{ 
    //want info to be setup in this class, so it can be accessed elsewhere 
    public static readonly string[] ab = { "ALBERT", "EINSTEIN"};  
    public static readonly string[] dk = { "DONALD", "KNUTH" }; 

    //is this efficient or instantiated once per access? IF SO HOW CAN I DO THIS BETTER? 
    public static readonly Info AB = new Info(ab, 100); 
    public static readonly Info DK = new Info(dk, 80); 

} 

public class Info 
{ 
    private string[] _name; 
    private int _age; 

    public string[] Name { get{ return _name}; } 
    public int Age { get { return _age; } } 

    public Info(string[] n, int a) 
    { 
     _name = n; 
     _age = a; 
    } 
} 
+1

fyi이면 'Name'값을 변경할 수 있습니다. –

답변

3

이 효율적으로 또는 액세스에 한 번 인스턴스화입니까?

Info의 인스턴스가 생성되는 순간을 의미하는 경우 멤버에 처음 액세스하기 전에 빌드됩니다. 따라서 아무리 많은 시간에 People.AB이라고 부르는 경우에도 객체는 동일합니다. 정적 멤버가 처음으로 액세스하고 정적 생성자 전에 존재하는 경우, 호출되기 전에

정적 멤버가 초기화됩니다 Static Classes and Static Class Members에 대한 MSDN에서

. 당신의 인스턴스를 확인하려면

Info 완전히 불변, 당신은 _name의 유형과 속성 accesor을 변경할 수 있습니다 (단 말씀대로 배열에 대한 참조를 일단, _name의 값이 변경 될 수 있습니다) 받는 사람 :

private List<string> _name; 

public IList<string> Name { get { return _name.AsReadOnly(); } } 

희망 귀하의 필요를 이해했습니다.

+0

왜 getter에서 IList 을 사용하기로 선택 했습니까? 개인 변수 _name이 콘크리트 목록 유형을 이미 사용하고 있기 때문에? – River

+0

'AsReadOnly()'메소드가'ILoy '인터페이스를 구현하는'ReadOnlyCollection '인스턴스를 반환하기 때문에'List '클래스를 확장하지 않기 때문에 변환 될 수 없습니다. – Chopin