Добавить в цитаты Настройки чтения

Страница 335 из 502

Ниже приведена общая форма оператора ??.

<b>обнуляемый_объект ?? значение_по_умолчанию</b>

Если обнуляемый_объект содержит конкретное значение, то результатом операции ?? будет именно это значение. В противном случае результатом операции ?? окажется значение_по_умолчанию.

Например, в приведенном ниже фрагменте кода переменная balance содержит пустое значение. Вследствие этого переменной currentBalance присваивается значение 0.0, используемое по умолчанию, и тем самым устраняется причина для генерирования исключения.

<b>double? balance = null; double currentBalance;</b>

<b>currentBalance = balance ?? 0.0;</b>

В следующем фрагменте кода переменной balance присваивается значение 123.75.

<b>double? balance = 123.75; double currentBalance;</b>

<b>currentBalance = balance ?? 0.0;</b>

Теперь переменная currentBalance содержит значение 123.75 переменной balance.

И еще одно замечание: выражение в правой части оператора ?? вычисляется только в том случае, если выражение в левой его части не содержит значение. Этот факт демонстрируется в приведенной ниже программе.

<b>// Применение оператора ??</b>

<b>using System;</b>

<b>class NullableDemo2 {</b>

<b>  // Возвратить нулевой остаток,</b>

<b>  static double GetZeroBal() {</b>

<b>    Console. WriteLine (&quot;В методе GetZeroBalO.&quot;);</b>

<b>    return 0.0;</b>

<b>  }</b>

<b>  static void Main() {</b>

<b>    double? balance = 123.75;</b>

<b>    double currentBalance;</b>

<b>    // Здесь метод GetZeroBal() не вызывается, поскольку</b>

<b>    // переменная balance содержит конкретное значение.</b>

<b>    currentBalance = balance ?? GetZeroBal();</b>

<b>    Console.WriteLine(currentBalance);</b>

<b>  }</b>

<b>}</b>

В этой программе метод GetZeroBal() не вызывается, поскольку переменная balance содержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ?? содержит конкретное значение, то выражение в правой его части не вычисляется.

Обнуляемые объекты, операторы отношения и логические операторы

Обнуляемые объекты могут использоваться в выражениях отношения таким же образом, как и соответствующие объекты необнуляемого типа. Но они должны подчиняться следующему дополнительному правилу: когда два обнуляемых объекта сравниваются в операциях сравнения &lt;, &gt;, &lt;= или &gt;=, то их результат будет ложным, если любой из обнуляемых объектов оказывается пустым, т.е. содержит значение null. В качестве примера рассмотрим следующий фрагмент кода.

<b>byte? lower = 16;</b>

<b>byte? upper = null;</b>

<b>// Здесь переменная lower определена, а переменная upper не определена,</b>

<b>if(lower &lt; upper) // ложно %</b>

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

<b>if(lower &gt; upper) // .. также ложно!</b>

Следовательно, если один или оба сравниваемых обнуляемых объекта оказываются пустыми, то результат их сравнения всегда будет ложным. Это фактически означает, что пустое значение (null) не участвует в отношении порядка.

Тем не менее с помощью операторов == и != можно проверить, содержит ли обнуляемый объект пустое значение. Например, следующая проверка вполне допустима и дает истинный результат.

<b>if(upper == null) // ...</b>

Если в логическом выражении участвуют два объекта типа bool?, то его результат может иметь одно из трех следующих значений: true (истинное), false (ложное) или null (неопределенное). Ниже приведены результаты применения логических операторов &amp; и | к объектам типа bool?.

И наконец, если логический оператор ! применяется к значению типа bool?, которое является пустым (null), то результат этой операции будет неопределенным (null).

Частичные типы

Начиная с версии 2.0, в C# появилась возможность разделять определение класса, структуры или интерфейса на две или более части с сохранением каждой из них в отдельном файле. Это делается с помощью контекстного ключевого слова partial. Все эти части объединяются вместе во время компиляции программы.

Если модификатор partial используется для создания частичного типа, то он принимает следующую общую форму: