2013-06-10 1 views
1

get의 목적을 오해하고 있다고 생각합니다. 세트; C#에서. 나는 두배의 목록을 채우려 고 노력하고 다음 코드를 사용하고 있습니다 ...이 두 클래스가 동일한 클래스에 있으며이 실행하려고하면 목록 채우기를 시도 할 때 Null 참조 예외가 발생합니다. . 나는 정확히 무엇을 오해하고 있는가?Null 참조 예외 C# get set

public List<double> NewData 
{ get; set; } 

public InfoFile(String fileName, String groupName) 
{ 

    this.group = groupName; 
    test = File.ReadAllLines(fileName); 
    FileInfo label = new FileInfo(fileName); 
    this.name = Path.GetFileName(fileName); 
    isDrawn = false; 

    for (int t = 2; t < test.Length; t++) 
    { 
     NewData.Add(double.Parse(test[t].Substring(6, 4))); 
    } 
} 
+3

참고. 클래스의 사용자가 전체 목록을 다른 목록 *으로 대체 할 수 있습니까? 목록의 * identity *를 변경하지 않고 * 목록을 수정할 수있게하려고합니까? 아니면 위의 중 하나도? –

답변

10

당신은 초기화 할 수/ 목록을 인스턴스화해야합니다.

public List<double> NewData 
{ 
    get; 
    set; 
} 

public InfoFile(String fileName, String groupName) 
{ 
    // initialize NewData to a new instance of List<double> 
    NewData = new List<double>(); 

    this.group = groupName; 
    test = File.ReadAllLines(fileName); 
    FileInfo label = new FileInfo(fileName); 
    this.name = Path.GetFileName(fileName); 
    isDrawn = false; 
    for (int t = 2; t < test.Length; t++) 
    { 
     NewData.Add(double.Parse(test[t].Substring(6, 4))); 

    } 

} 

문서 : 추가 로직이 속성 접근에 필요하지 않을 경우

3.0 C#에서 이상에서는 자동 구현 속성은 특성 선언은보다 간결합니다. 또한 클라이언트 코드에서 개체를 만들 수 있습니다. 예제와 같이 속성을 선언하면 컴파일러에서 에 액세스 할 수있는 비공개 익명 지원 필드를 속성의 get 및 set 접근 자로 만 만들 수 있습니다. 목록/컬렉션을 노출 할 때 영업 이익에 대한 자신의 의견에 @EricLippert에 의해 명시된 바와 같이


시나리오에 따라

http://msdn.microsoft.com/en-us/library/bb384054.aspx

는, 세터는 거의 사용되지 않는다. "Lazy Load"는 List/Collection이라고도합니다.

public List<double> _newData; 
public List<double> NewData 
{ 
    get 
    { 
     if(_newData == null) 
      _newData = new List<double>(); 

     return _newData; 
    } 
} 
+1

이것은 다음과 같이 설정해야 함을 의미합니다. NewData = new List (); 전에 메서드를 추가하십시오. –

+0

감사합니다! 커피가 너무 적 으면 긴 하루였습니다! – Bubo

+0

C#의 최신 버전으로'public virtual List NewData {get; 세트; } = new List ();'이것은 새로운 데이터를 채울 수 있는지 여부에 관계없이 null 목록을 피할 수 있는지 여부와 새 목록 을 수행해야하는 필요성에 관계없이 새 목록을 설정합니다.();'실제로 데이터로 채우기 전에. –

0

나는 다음과 같은 작업을 수행하려고합니다.

List<double> doubleList = new List<double>(); 
for (int t = 2; t < test.Length; t++) 
{ 
    doubleList.Add(double.Parse(test[t].Substring(6, 4)));  
} 

편집 : 입력 데이터에 자신감이 있는지에 따라 TryParse와 Parse 방법을 사용하는 것이 좋습니다.

0

자동 속성은 해당 데이터 형식의 기본값으로 속성을 초기화하며 모든 참조 형식의 기본값은 null입니다. 그래서 기본적으로 NewData 속성의 값은 무언가를 지정하지 않으면 null입니다. 컬렉션을 위해 나는 차라리 setter가 필요없는 것처럼 접근자를 얻는다. 그래서 내 재산이 보일 것 같은 :

private List<double> newData = new List<double>();는 * A * 공공 세터로 수집 유형의 속성을 드문 것을

public List<double> NewData { get{return newDate;} }