9
votes

Comment initialiser la propriété automatique pour NE NULL IN C #?

J'ai une propriété: xxx

Lorsque j'invoque cette propriété pour ajouter un article, je reçois une nullreferenceExceptionException.

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.

merci!


0 commentaires

8 Réponses :


1
votes

Vous devrez utiliser un champ de support explicite, vous ne pouvez pas modifier le getter ou le setter pour les propriétés automatiques.


0 commentaires

2
votes

Initialisez-le dans le constructeur

public MyClass(){  dictionary = new
 Dictionary<string,string>() 
}


0 commentaires

6
votes

Sans une variable privée explicite Le seul autre moyen serait d'ajouter du code au constructeur de la classe: xxx


1 commentaires

Ok je suis allé avec celui-ci, c'est le plus propre.



5
votes

Vous pouvez l'initialiser dans votre constructeur:

public MyClass()
{
  MyProp = new Dictionary<string, string>();
}


0 commentaires

1
votes

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);
    }
}


2 commentaires

Cela semble terriblement hacky et compliqué.


Eh bien, je ne peux pas préciser correctement; Mais c'est est une possibilité.



1
votes

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>();
        }
    }
}


0 commentaires

3
votes

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);


1 commentaires

Pourquoi interne plutôt que privé, à l'abri des intérêts?



2
votes

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: xxx


0 commentaires