Булевы свойства в c # - PullRequest
       43

Булевы свойства в c #

26 голосов
/ 11 ноября 2011

Это может быть глупый вопрос, но свойство ниже, будет ли когда-нибудь ситуация, когда простое получение вызовет исключение?

Например, если бы я сделал что-то вроде bool value = this.BatchValuation; - но я еще не установил BatchValuation, он просто установит value на null или это вызовет исключение?

public bool BatchValuation { get; set; }

Ответы [ 6 ]

48 голосов
/ 11 ноября 2011

Это может быть глупый вопрос

Это не так.

в приведенном ниже свойстве, будет ли когда-нибудь ситуация, когда простое получение приведет к исключению?

Возможно, да. Например, другой поток может прервать ваш поток, пока он находился в процессе извлечения этого свойства; казалось бы, это исключение, выданное получателем свойства. Или вы можете исчерпать пространство стека в тот момент, когда вызывается свойство, и может возникнуть исключение вне стека. Или, когда вы вызываете свойство в первый раз, джиттер может запуститься и попытаться выделить виртуальную память для сгенерированного кода, но у вас нет виртуального адресного пространства, поэтому может возникнуть исключение нехватки памяти.

Все это чрезвычайно маловероятно, но все они возможны . Вы спросили, будет ли когда-либо такой ситуацией, а не если бы это было вероятным .

Если я еще не установил BatchValuation, он просто установит значение на ноль или вызовет исключение?

Ни; по умолчанию будет false . Булевы значения не обнуляются.

25 голосов
/ 11 ноября 2011

логические значения по умолчанию ложно, если вы не установили их специально.Таким образом, никаких исключений не будет, свойство просто вернет false.

Помните, что это тип значения, о котором мы говорим, только переменные для ссылочных типов могут быть установлены на null.Типы значений имеют значение по умолчанию, которое равно нулю для числовых типов и false для логического значения.

Также см. Таблица значений по умолчанию

3 голосов
/ 11 ноября 2011

нет, логическое значение по умолчанию равно false.Итак

bool something; // something is false
2 голосов
/ 11 ноября 2011

В контексте свойств класса или полей-членов каждое поле инициализируется значением по умолчанию для типа, когда класс создается до для запускаемого конструктора. В классе

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

Первые три поля установлены в свои начальные значения (false, null и 0 соответственно), а автоматически сгенерированное поле поддержки для Baz также установлено в 0.0d. Доступ к этим полям / свойствам без явной инициализации пользователя не является ошибкой, в отличие от доступа к неинициализированным локальным объектам. Для локальных систем компилятор требует явной инициализации.

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
   }
}
0 голосов
/ 11 ноября 2011

Однажды у меня возникла очень странная ситуация, когда автоматически реализованное свойство, подобное этому, выдало исключение NullReferenceException. Причиной была библиотека Emit Mappper (http://emitmapper.codeplex.com/).

Эта библиотека (что очень хорошо в противном случае) использует Refleciton.Emit и, когда она не видит общедоступного конструктора для типа, она испускает сайты вызовов сопоставления, которые передают пустую ссылку как подразумеваемый первый аргумент свойства / метода (который заканчивается как "это" во всех методах экземпляра).

Таким образом, свойство пыталось изменить значение поля нулевой ссылки (то есть у меня была this==null ситуация)!

0 голосов
/ 11 ноября 2011

Как сказал BrokenGlass, логические значения по умолчанию равны false,

Вы можете проверить это самостоятельно, приведу пример, как показано ниже.

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