2011-03-04 4 views
1

C#의 제네릭에 대해 배우고 있는데 제네릭 배열을 만들고 일부 문자열을 추가하려고합니다. 나는 쉽게 int 값을 추가 할 수 있지만, strings과 작동시키는 방법을 이해할 수는 없습니다. 문자열을 사용하려고하면 NullReferenceException이됩니다.일반 문자열에 데이터 추가 Array C#

나는 myArray라는 클래스가 있고, 그것은 다음과 같습니다

내 mainform에서
class MyArray<T> : IComparable<T>, IEnumerable<T>, IEnumerator<T> 
{ 
    T[] data = new T[10]; 
    int current = -1; 

    public T[] Data 
    { 
     get { return data; } 
    } 

    public void Add(T value) 
    { 
     for (int i = 0; i < data.Length; i++) 
     { 
      if (data[i].Equals(default(T))) 
      { 
       data[i] = value; 
       return; 
      } 
     } 
     T[] tmp = new T[data.Length + 10]; 
     data.CopyTo(tmp, 0); 
     Add(value); 
    } 

나는이 같은 데이터를 추가 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyArray<string> StringArray = new MyArray<string>(); 

     StringArray.Add("ONE"); 
     StringArray.Add("TWO"); 
    } 
} 
+3

이유를 기본값으로 비교 (티)? 왜 당신이 얼마나 많은지 추적하지 않는 이유는 무엇입니까? 또는 ... 그냥'List '을 사용하십시오 ... –

+0

모두가 너무 빠릅니다. 나는 모든 사람들이 제안한대로 코드와 그 for 루프를 디버깅했습니다. 새로운 T [10] 배열은 T 배열이지만 배열 [0]은 null입니다. 아직 아무것도 추가하지 않았기 때문입니다. – adt

답변

0

if (data[i].Equals(default(T)))이 문제의 원인입니다. 새로운 캐릭터 (또는 다른 참조 타입) 배열에서

var array = new String[10]; 

어레이의 각 요소는 기본적으로 null이다. 당신이

data[i].Equals(default(T) 

data[i]을 말할 때 그래서 당신이 이렇게 던져 질 예외를 일으키는 Null 참조에 메소드를 호출하고, null입니다.

배열은 값 유형이 무엇이든간에 기본값으로 초기화되기 때문에 값 유형에는 해당되지 않습니다.

제네릭의 문제 중 일부입니다. 참조 유형과 값 유형을 항상 동일하게 취급 할 수는 없습니다.

default을 피하기 위해 대신보십시오 :

private int _currentIndex = 0; 
public void Add(T value) 
{ 
    data[_currentIndex] = value; 
    _currentIndex++; 
    if(_currentIndex == data.Length) 
    { 
     T[] tmp = new T[data.Length + 10]; 
     data.CopyTo(tmp, 0); 
     data = tmp; 
     _currentIndex = 0; 
    }   
} 
+0

[같음]은 여기서 문제가되지 않습니다 - [msdn] (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx)에 따르면 '평등'은 전혀 던지지 말아야합니다 (관습에 따라)). – Femaref

+0

@Fem 미안하지만, 나는 명확하지 않았습니다. 내 편집이 더 의미가 있기를 바랍니다. – Will

+0

은 당신에 대한 공격으로 의도 된 것이 아니 었습니다. 나는 처음에 그것을 쓰러 뜨 렸습니다. 제 텍스트는 너무 애매했기 때문에 어쩔 수 없었습니다. 인덱스 카운터를 사용하는 것이 더 좋습니다. – Femaref

3

그대로 stringdefaultnull입니다 값 유형이 아닌 참조 유형. T[] 유형의 새 배열을 구성하면 배열의 기본값은 T (이 경우 null)이 채워집니다.

그 다음 을 호출 할 때 data[i].Equals(default(T))이 NRE를 throw합니다.

1

귀하의 배열이 라인에서 NRE을 받고있어, 그래서 널 (null) 값으로 초기화되고 :

if (data[i].Equals(default(T)))