J'ai une propriété: Lorsque j'invoque cette propriété pour ajouter un article, je reçois une nullreferenceExceptionException. p> Comment ferais-je le chèque null dans le la propriété elle-même donc ça me donne un nouveau si c'est null? Tout en gardant dans le modèle de propriété automatique. P> merci! p> p>
8 Réponses :
Vous devrez utiliser un champ de support explicite, vous ne pouvez pas modifier le getter ou le setter pour les propriétés automatiques. P>
Initialisez-le dans le constructeur
public MyClass(){ dictionary = new Dictionary<string,string>() }
Sans une variable privée explicite Le seul autre moyen serait d'ajouter du code au constructeur de la classe:
Ok je suis allé avec celui-ci, c'est le plus propre.
Vous pouvez l'initialiser dans votre constructeur:
public MyClass() { MyProp = new Dictionary<string, string>(); }
Il y a un Classe d'attribut nommée DefaultValueAttribute code> qui vous permet de spécifier la valeur par défaut souhaitée d'un membre, mais elle ne définit pas automatiquement l'élément sur la valeur spécifiée; Cependant, l'espoir n'est pas perdu, car vous pouvez utiliser la réflexion pour récupérer cette valeur au moment de l'exécution et l'appliquer, comme indiqué dans Ce coin d'Internet :
static public void ApplyDefaultValues(object self)
{
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(self))
{
DefaultValueAttribute attr = prop.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
if (attr == null) continue;
prop.SetValue(self, attr.Value);
}
}
Cela semble terriblement hacky et compliqué.
Eh bien, je ne peux pas préciser correctement; Mais c'est est i> une possibilité.
Si vous deviez exécuter ce code, vous obtiendrez une nullreferenceException, car le champ n'est jamais initialisé.
class Program { static void Main(string[] args) { Person sergio = new Person(); sergio.Items.Add("test", "test"); Console.ReadKey(); } public class Person { public Dictionary<string, string> Items { get; set; } public Person() { Items = new Dictionary<string, string>(); } } }
Je ne pense pas que vous voudriez un séchoir, car cela fera toujours un nouveau dictionnaire, car d'autres ont souligné en appelant le setter dans le constructeur. Une meilleure approche est la suivante:
InstanceOfMyClass.MyProp.Add(blah, blah);
Pourquoi interne plutôt que privé, à l'abri des intérêts?
Pour d'autres personnes tombant sur cette ancienne question, il existe une nouvelle fonctionnalité en C # 6.0.
in C # 6.0, vous pouvez également initialiser cette propriété à une valeur constante dans la même déclaration, comme celle-ci: P>