web-dev-qa-db-fra.com

Propriétés booléennes en c #

Ce pourrait être une question stupide, mais la propriété ci-dessous, y aura-t-il jamais une situation où le simple fait de l'obtenir provoquera une exception?

Comme si j’avais fait quelque chose comme bool value = this.BatchValuation; - mais je n’avais pas encore défini BatchValuation, sera-t-il simplement défini value sur null ou provoquera-t-il une exception?

public bool BatchValuation { get; set; }
24
slandau

Cela pourrait être une question stupide

Ce n'est pas.

dans la propriété ci-dessous, y-aura-t-il un jour où l'obtenir provoquera une exception?

Éventuellement, oui. Par exemple, un autre thread pourrait abandonner votre thread alors qu'il était en train d'extraire cette propriété; cela semblerait être une exception levée par le getter de propriété. Ou bien, vous pourriez manquer d'espace de pile juste au moment où la propriété est appelée et une exception de pile épuisée pourrait être levée. Ou bien, lorsque vous appelez la propriété pour la première fois, la gigue peut démarrer et essayer d'allouer de la mémoire virtuelle pour le code généré, mais vous n'avez plus d'espace d'adressage virtuel, vous pouvez donc générer une exception.

Ce sont tous extraordinairement improbables, mais ils sont tous possible . Vous avez demandé s'il y aurait jamais une telle situation, pas s'il s'agissait de probable

Si je n'avais pas encore défini BatchValuation, va-t-il simplement définir la valeur sur null ou provoquera-t-il une exception?

Ni; il sera par défaut à false . Les booléens ne sont pas nullables. 

47
Eric Lippert

les valeurs booléennes sont définies par défaut sur false si vous ne les avez pas définies spécifiquement. Donc non, il n'y aura pas d'exception, la propriété retournera simplement false.

N'oubliez pas qu'il s'agit d'un type de valeur dont nous parlons. Seules les variables pour les types de référence peuvent être définies sur null. Les types de valeur ont une valeur par défaut, qui est zéro pour les types numériques et false pour les booléens.

Voir aussi Tableau des valeurs par défaut

24
BrokenGlass

non, la valeur par défaut est Boolean. Alors 

bool something; // something is false
3
Joe

Dans le contexte de propriétés de classe ou champs membre , chaque champ est initialisé à une valeur par défaut pour le type lors de la création de la classe prior pour le constructeur en cours d'exécution. Dans la classe 

class Foo
{
    bool bar;
    string s;
    int item;
    public double Baz { get; set; } 
}

Les trois premiers champs sont définis sur leurs valeurs initiales (false, null et 0, respectivement), et le champ de sauvegarde généré automatiquement pour Baz est également défini sur 0.0d. Ce n’est pas une erreur d’accéder à ces champs/propriétés sans initialisation explicite de l’utilisateur, contrairement à l’accès à des variables locales non initialisées. C'est pour les sections locales que le compilateur nécessite une initialisation explicite.

class Foo
{
   int bar;

   void M()
   {
       Console.WriteLine(bar); // not an error, bar is 0;
       bool someBool;
       Console.WriteLine(someBool); // use of uninitialized local variable
   }
}
2
Anthony Pegram

Comme l'a dit BrokenGlass, les valeurs booléennes par défaut sont false,

vous pouvez le tester vous-même, je fournis un exemple ci-dessous.

    static void Main()
    {
        // Create an object, but don't set attribute.
        Foo foo = new Foo();

        if (!foo.BatchValuation)
            Console.WriteLine("BatchValuation is False");

        else
            Console.WriteLine("BatchValuation is True");

        Console.ReadKey();

    }

}


// Test class.
public class Foo
{
    private bool _batchValuation;
    public Foo() { }
    public bool BatchValuation 
    {
        get { return _batchValuation; }
        set { _batchValuation = value; }
    }
}
0
JKhuang

Une fois, j’ai eu une situation très étrange, quand une propriété implémentée automatiquement comme celle-ci a déclenché une exception NullReferenceException. La raison en était la bibliothèque Emit Mappper (http://emitmapper.codeplex.com/). 

Cette bibliothèque (qui est très bien sinon) utilise Refleciton.Emit et, quand elle ne voit aucun constructeur public pour le type, elle émet des sites d’appel de mappage, qui transmettent une référence null comme premier implicite de propriété/méthode ( "dans toutes les méthodes d'instance). 

Donc, la propriété essayait de changer la valeur du champ d'une référence null (c'est-à-dire que j'avais this==null situation)!

0
Konstantin