2010-11-07 2 views
0

hey j'essaie de travailler avec une liste générique en C# et pour une raison quelconque après avoir alloué de la mémoire pour la liste, je reçois unhandeledNullException. J'ai découvert ce qui était mon problème Je n'ai pas utilisé les propriétés de temps en temps. se laisse dire GeoInfo est membre privé de ma classe, comment puis-je faire des propriétés à elle, j'ai essayé:aucune exception avec des listes dans C#

private List<GeoInfo> GEOINFOS { get; set; } // edit i forgot to change it back 
// but i want to have my geoinfos private and my properties public 

Merci d'avance pour votre aide

+6

Est-ce 'UnhandledException' ou' ArgumentNullException' - s'il vous plaît clarifier. En outre, il n'y a rien de fondamentalement mauvais avec ce code * en soi * - Je pense que vous allez devoir ajouter plus de contexte; idéalement un exemple reproductible. –

+0

Cette ligne par elle-même semble bien. Pouvez-vous poster plus de code? C'est probablement quelque chose d'autre qui en est la cause. – eldarerathis

+4

Veuillez poster un programme court mais complet démontrant le problème. C'est probablement quelque chose de simple, mais nous ne pouvons pas le dire à partir de cette ligne. –

Répondre

1

Vous avez rendu les propriétés privées. Si vous voulez qu'ils soient essayer public:

public List<GeoInfo> GeoInfos { get; set; } 

La valeur implémentée automatiquement stocké localement dans l'objet sera privé; mais les propriétés elles-mêmes sont publiques. Parce que ce que vous déclarez il y a les accesseurs de propriété.

Si vous voulez écrire tout explicitement, vous pouvez le faire l'ancien avant 3.0 façon

private List<GeoInfo> geoInfos = new List<GeoInfo>; 
public List<GeoInfo> GeoInfos { 
    get { return geoInfos; } 
    set { geoInfos = value; } 
} 

Ce encore repose sur geoInfos étant initialisés quelque part (comme le constructeur) - ou nullPointerException retournerez.

Vous pourriez faire-évaluation paresseuse à ce droit dans le getter:

private List<GeoInfo> geoInfos = new List<GeoInfo>; 
public List<GeoInfo> GeoInfos { 
    get { if (geoInfos == null) { 
      geoInfos = new List<GeoInfo>; 
     } 
     return geoInfos; 
     } 
    set { geoInfos = value; } 
} 

Cela garantit que vous ne devez pas spécifier un appel dans le constructeur, et vous n'avez pas à vous soucier de la séquence d'exécution définissant explicitement l'élément avant de l'obtenir. Mais si vous utilisez les propriétés auto-générées, vous devrez définir explicitement la référence à un moment donné. Comme suggéré ailleurs, le meilleur pari est le constructeur.

1

Si vous voulez une propriété d'être privée , utilisez

private List<GeoInfo> GEOINFOS { get; set; } 

Cependant, il n'y a pas beaucoup de raison d'utiliser une propriété automatique pour une variable parlementaire (et ne pas oublier d'initialiser cette liste aussi bien). Si vous voulez que la validation soit correcte, vous utilisez simplement cette propriété en tant que variable privée.

Votre problème de référence nulle provient probablement de l'initialisation de la variable de propriété sous-jacente. Cela ne se fait pas automatiquement,

public MyClass() 
{ 
    GEOINFOS = new List<GeoInfo>(); 
} 

Encore une chose: votre convension de nommage pour une propriété est étrange pour C#. Que diriez-vous de garder les choses cohérentes et de chanter GeoInfos?

+1

Pour une propriété auto entièrement privée, vous utiliseriez 'private Liste GeoInfos {get; ensemble; } '. – LukeH

+0

Comme dit @Luke, une propriété publique avec getter + setter privé ne volera pas. Mais +1 pour la suggestion de nommage –

+0

Je ne veux pas que mes propriétés soient privées Je veux qu'elles soient publiques –