C# 4.0 полное руководство - 2011
Шрифт:
}
static void Main {
double? balance = 123.75; double currentBalance;
// Здесь метод GetZeroBalO не вызывается, поскольку // переменная balance содержит конкретное значение. currentBalance = balance ?? GetZeroBalO;
Console.WriteLine(currentBalance);
}
}
В этой программе метод GetZeroBal не вызывается, поскольку переменная balance содержит конкретное значение. Как пояснялось
Обнуляемые объекты, операторы отношения и логические операторы
Обнуляемые объекты могут использоваться в выражениях отношения таким же образом, как и соответствующие объекты необнуляемого типа. Но они должны подчиняться следующему дополнительному правилу: когда два обнуляемых объекта сравниваются в операциях сравнения <, >, <= или >=, то их результат будет ложным, если любой из обнуляемых объектов оказывается пустым, т.е. содержит значение null. В качестве примера рассмотрим следующий фрагмент кода.
byte? lower = 16; byte? upper = null;
// Здесь переменная lower определена, а переменная upper не определена, if(lower < upper) // ложно %
В данном случае проверка того, что значение одной переменой меньше значения другой, дает ложный результат. Хотя это и не совсем очевидно, как, впрочем, и следующая проверка противоположного характера.
if(lower > upper) // .. также ложно!
Следовательно, если один или оба сравниваемых обнуляемых объекта оказываются пустыми, то результат их сравнения всегда будет ложным. Это фактически означает, что пустое значение (null) не участвует в отношении порядка.
Тем не менее с помощью операторов == и ! = можно проверить, содержит ли обнуляемый объект пустое значение. Например, следующая проверка вполне допустима и дает истинный результат.
if(upper == null) // ...
Если в логическом выражении участвуют два объекта типа bool?, то его результат может иметь одно из трех следующих значений: true (истинное), false (ложное) или null (неопределенное). Ниже приведены результаты применения логических операторов & и | к объектам типа bool?.
р
Q
P 1 Q
P&Q
true
null
true
null
false
null
null
false
null
true
true
null
null
false
null
false
null
null
null
null
И
Частичные типы
Начиная с версии 2.0, в C# появилась возможность разделять определение класса, структуры или интерфейса на две или более части с сохранением каждой из них в отдельном файле. Это делается с помощью контекстного ключевого слова partial. Все эти части объединяются вместе во время компиляции программы.
Если модификатор partial используется для создания частичного типа, то он принимает следующую общую форму:
partial тип имя_типа {//...
где имя_типа обозначает имя класса, структуры или интерфейса, разделяемого на части. Каждая часть получающегося частичного типа должна указываться вместе с модификатором partial.
Рассмотрим пример разделения простого класса, содержащего координаты ХУ, на три отдельных файла. Ниже приведено содержимое первого файла.
partial class XY {
public XY(int a, int b) {
X =• a;
Y = b;
}
}
Далее следует содержимое второго файла.
partial class XY {
public int X { get; set; }
}
И наконец, содержимое третьего файла.
partial class XY {
public int Y { get; set; }
}
В приведенном ниже файле исходного текста программы демонстрируется применение класса XY.
// Продемонстрировать определения частичного класса.
using System;
class Test {
static void Main {
XY xy = new XY (1, 2);
Console.WriteLine(xy.X + + xy.Y);
}
}
Для того чтобы воспользоваться классом XY, необходимо включить в компиляцию все его файлы. Так, если файлы класса XY называются xyl. cs, ху2 . cs и хуЗ . cs, а класс Test содержится в файле test. cs, то для его компиляции достаточно ввести в командной строке следующее.