2010-05-26 12 views
1

La ligne de code suivante dans mon constructeur de classe est de lancer un StackOverflowException:Pourquoi le code d'initialisation de mon tableau provoque-t-il le lancement d'une exception StackOverflowException?

myList = new string[]{}; // myList is a property of type string[] 

Pourquoi est-il ainsi? Et quelle est la bonne façon d'initialiser un tableau vide?


MISE À JOUR: La cause était le poseur, dans lequel je tentais de couper toutes les valeurs:

set 
{ 
    for (int i = 0; i < myList.Length; i++) 
    { 
     if (myList[i] != null) myList[i] = myList[i].Trim(); 
    } 
} 
+0

Pourriez-vous publier l'intégralité de votre devis? Il semble probable que la vraie cause du problème est sur une ligne différente. – Syntactic

Répondre

8

Si myList est une propriété, avez-vous vérifié que le corps de son setter n'attribue pas récursive se place du champ de support, comme dans:

private string[] _myList; 

public string[] myList { 
    get { 
    return _myList; 
    } 
    set { 
    _myList = value; 
    } 

}

+1

+1 pour reconnaître le problème dans ce cas particulier. Serait parfait si vous avez écrit l'utilisation correcte des champs de support. – Simon

2
myList = new string[0] 

Cela devrait créer un tableau avec 0 éléments.

EDIT: Je viens de tester new string[] {} et cela fonctionne pour moi. Peut-être que la raison de votre stackoverflow est ailleurs.

Pouvez-vous poster le reste de votre méthode? Généralement, les flux de pile se produisent spécialement lors de l'exécution d'appels de méthode récursifs à nombre élevé. Comme ceci:

void MyMethod(int i) 
{ 
    MyMethod(i); //!StackOverFlow! 
} 
+0

Non, toujours obtenir StackOverflowException. – MCS

1

Il semble que ce que @Jonas H dit être correct, vous pouvez modifier récursivement la propriété au lieu de son champ de support.

MAL

private String[] _myList; 
public String[] myList 
{ 
    get {return _myList;} 
    set 
    { 
     for (int i = 0; i < myList.Length; i++) 
     { 
      if (myList[i] != null) myList[i] = myList[i].Trim(); 
     } 
    } 
} 

DROIT

private String[] _myList; 
public String[] myList 
{ 
    get {return _myList;} 
    set 
    { 
     for (int i = 0; i < _myList.Length; i++) 
     { 
      if (_myList[i] != null) _myList[i] = _myList[i].Trim(); 
     } 
    } 
} 
2

Votre code set n'attribue pas quoi que ce soit, et fait référence à lui-même. J'ai l'impression que vous ne comprenez pas comment fonctionnent les propriétés. Vous avez besoin d'une variable de support qui la propriété manipule:

private string[] _myList; 

Et vous devez avoir votre travail de code set à cette variable:

public string[] myList 
{ 
    get 
    { 
     return _myList; 
    } 

    set 
    { 
     _myList = value; // you have to assign it manually 
     for (int i = 0; i < _myList.Length; i++) 
     { 
      if (_myList[i] != null) _myList[i] = _myList[i].Trim(); 
     } 
    } 
} 

Si vous essayez et l'accès myList, il est lui-même l'accès, qui puis accède lui-même, etc, conduisant à une récursion infinie et un débordement de pile.

+0

Testé; Je peux dire que c'est la cause la plus probable, sinon la cause. – BoltClock