Подтвердить что ты не робот

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

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

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

public bool BatchValuation { get; set; }
4b9b3361

Ответ 1

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

Это не так.

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

нет, Boolean по умолчанию - false. Итак,

bool something; // something is false

Ответ 4

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

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

Ответ 5

Как сказал BrokenGlass, значения boolean по умолчанию равны 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; }
    }
}

Ответ 6

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

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

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