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

decimal precise = 1.234m;

decimal precise = (decimal)1.234;

Значения с плавающей точкой

Значения с плавающей точкой могут быть либо double, либо float. При вычислениях все другие простые типы значений будут неявно преобразовываться, в соответствующий тип с плавающей точкой, если присутствует тип с плавающей точкой. Действительный числовой литерал с правой стороны оператора присваивания интерпретируется как double по умолчанию. Так как не существует неявного преобразования из float в double, может оказаться удивительным возникновение ошибок компиляции. Пример ниже иллюстрирует эту проблему:

float f = 5.6;

Console.WriteLine(x);

Этот пример будет создавать сообщение об ошибке компиляции, показанное ниже.

C:\_wroxc# for java developerscodeSuperEXClass1.cs(15): Literal of type double cannot De implicitly converted to type 'float'; use an 'F' suffix to create a literal of this type

Существует два способа решения этой проблемы. Можно преобразовать литерал во float, но сам компилятор предлагает более разумную альтернативу. Использование суффикса F говорит компилятору, что это литерал типа float, а не double. Хотя и не обязательно, но можно использовать суффикс D, чтобы указать на литерал типа Double.

Типы перечислений

Перечисление является отдельным типом, состоящим из множества именованных констант. В Java можно добиться этого, используя переменные static final. В этом смысле перечислении могут в действительности быть частью класса, который их использует. Другой подход состоит в определении перечисления как интерфейса. Пример ниже иллюстрирует такую концепцию:

interface Color {

 static int RED = 0;

 static int GREEN = 1;

 static int BLUE = 2;

}

Этот подход проблематичен тем, что он не является безопасным в отношении типов данных. Любое считанное или вычисленное целое используется в качестве цвета. Можно, однако, программным путем реализовать перечисление с безопасными типами в Java, используя вариант шаблона (паттерна) Singleton, который ограничивает класс предопределенным числом экземпляров. Приведенный далее код показывает, как это можно сделать:

final class Day {

 // final, поэтому нельзя создавать подклассы этого класса

 private String internal;

 private Day(String Day) {internal = Day;} // закрытый конструктор

 public static final Day MONDAY = new Day('MONDAY');

 public static final Day TUESDAY = new Day('TUESDAY');

 public static final Day WEDNESDAY = new Day('WEDNESDAY');

 public static final Day THURSDAY = new Day('THURSDAY');

 public static final Day FRIDAY = new Day('FRIDAY');

}

Как можно видеть из приведенного выше примера, перечисленные константы связаны не с примитивными типами, а с объектными ссылками. Также, поскольку класс определен как final, то нельзя создать его подклассы, следовательно, никакие другие классы не могут из него создаваться. Конструктор отмечен как закрытый, поэтому другие методы не могут использовать класс для образования новых объектов. Единственные объекты, которые будут созданы для этого класса, это статические объекты, которые класс формирует для себя при первой ссылке на класс.

Можно согласиться с тем, что хотя концепция достаточно простая, обход включает развитую технику и она может не сразу стать понятной новичку, в конце концов нам требуется только список констант; C#, в противоположность, предоставляет встроенную поддержку перечислении, которая обеспечивает также безопасность типов. Чтобы объявить в C# перечисление, используется ключевое слово enum. В своей простейшей форме enum может выглядеть как следующий код:

public enum Status {

 Working,

 Complete,

 BeforeBegin

}

В приведенном выше случае первое значение равно 0 и enum увеличивает значения. Complete будет 1 и т.д. Если по какой-то причине требуется, чтобы enum представлял другие значения, можно сделать это, присваивая такие значения следующим образом:

public enum Status {

 Working = 131,

 Complete = 129,

 BeforeBegin = 132

}

Имеется также возможность использовать другие числовые целые типы 'наследуя' от long, short или byte. int всегда является типом по умолчанию. Эта концепция проиллюстрирована ниже:

public enum Status : int {

 Working,

 Complete,

 BeforeBegin

}

public enum SmallStatus : byte {

 Working,

 Complete,

 BeforeBegin

}

public enum BigStatus : long {

 Working,

 Complete,

 BeforeBegin

}

Обратите внимание, что существует большое различие между этими тремя перечислениями, связанное напрямую с размером типа данных, от которого они наследуют. byte в C#, например, может содержать 1 байт памяти. Это означает, что SmallStatus не может с одержать более 255 констант или задать значение любой своей константы больше 255. Следующий листинг

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату