it-swarm.com.ru

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

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

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

public bool BatchValuation { get; set; }
24
slandau

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

Это не.

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

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

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

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

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

47
Eric Lippert

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

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

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

24
BrokenGlass

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

bool something; // something is false
3
Joe

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

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
   }
}
2
Anthony Pegram

Как сказал 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; }
    }
}
0
JKhuang

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

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

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

0
Konstantin