Страница 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 ("В методе GetZeroBalO.");</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 содержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ?? содержит конкретное значение, то выражение в правой его части не вычисляется.
Обнуляемые объекты, операторы отношения и логические операторы
Обнуляемые объекты могут использоваться в выражениях отношения таким же образом, как и соответствующие объекты необнуляемого типа. Но они должны подчиняться следующему дополнительному правилу: когда два обнуляемых объекта сравниваются в операциях сравнения <, >, <= или >=, то их результат будет ложным, если любой из обнуляемых объектов оказывается пустым, т.е. содержит значение null. В качестве примера рассмотрим следующий фрагмент кода.
<b>byte? lower = 16;</b>
<b>byte? upper = null;</b>
<b>// Здесь переменная lower определена, а переменная upper не определена,</b>
<b>if(lower < upper) // ложно %</b>
В данном случае проверка того, что значение одной переменой меньше значения другой, дает ложный результат. Хотя это и не совсем очевидно, как, впрочем, и следующая проверка противоположного характера.
<b>if(lower > upper) // .. также ложно!</b>
Следовательно, если один или оба сравниваемых обнуляемых объекта оказываются пустыми, то результат их сравнения всегда будет ложным. Это фактически означает, что пустое значение (null) не участвует в отношении порядка.
Тем не менее с помощью операторов == и != можно проверить, содержит ли обнуляемый объект пустое значение. Например, следующая проверка вполне допустима и дает истинный результат.
<b>if(upper == null) // ...</b>
Если в логическом выражении участвуют два объекта типа bool?, то его результат может иметь одно из трех следующих значений: true (истинное), false (ложное) или null (неопределенное). Ниже приведены результаты применения логических операторов & и | к объектам типа bool?.
И наконец, если логический оператор ! применяется к значению типа bool?, которое является пустым (null), то результат этой операции будет неопределенным (null).
Частичные типы
Начиная с версии 2.0, в C# появилась возможность разделять определение класса, структуры или интерфейса на две или более части с сохранением каждой из них в отдельном файле. Это делается с помощью контекстного ключевого слова partial. Все эти части объединяются вместе во время компиляции программы.
Если модификатор partial используется для создания частичного типа, то он принимает следующую общую форму: