диапазоне значений, которые способен хранить конкретный тип. В дополнение к свойствам
MinValue
и
MaxValue
каждый числовой тип может определять собственные полезные члены. Например, тип
System.Double
позволяет получать значения для бесконечно малой (эпсилон) и бесконечно большой величин (которые интересны тем, кто занимается решением математических задач). В целях иллюстрации рассмотрим следующую вспомогательную функцию:
static void DataTypeFunctionality()
{
Console.WriteLine("=> Data type Functionality:");
Console.WriteLine("Max of int: {0}", int.MaxValue);
Console.WriteLine("Min of int: {0}", int.MinValue);
Console.WriteLine("Max of double: {0}", double.MaxValue);
Console.WriteLine("Min of double: {0}", double.MinValue);
Console.WriteLine("double.Epsilon: {0}", double.Epsilon);
Console.WriteLine("double.PositiveInfinity: {0}",
double.PositiveInfinity);
Console.WriteLine("double.NegativeInfinity: {0}",
double.NegativeInfinity);
Console.WriteLine();
}
В случае определения литерального целого числа (наподобие 500
) исполняющая среда по умолчанию назначит ему тип данных int
. Аналогично литеральное число с плавающей точкой (такое как 55.333
) по умолчанию получит тип double
. Чтобы установить тип данных в long
, используйте суффикс l
или L
(4L
). Для объявления переменной типа float
применяйте с числовым значением суффикс f
или F
(5.3F
), а для объявления десятичного числа используйте со значением с плавающей точкой суффикс m
или М
(300.5М
). Это станет более важным при неявном объявлении переменных, как будет показано позже в главе.
Рассмотрим тип данных System.Boolean
. К допустимым значениям, которые могут присваиваться типу bool
в С#, относятся только true
и false
. С учетом этого должно быть понятно, что System.Boolean
не поддерживает свойства MinValue
и MaxValue
, но вместо них определяет свойства TrueString
и FalseString
(которые выдают, соответственно, строки "True"
и "False"
).
Вот пример:
Console.WriteLine("bool.FalseString: {0}", bool.FalseString);
Console.WriteLine("bool.TrueString: {0}", bool.TrueString);
Текстовые данные в C# представляются посредством ключевых слов string
и char
, которые являются сокращенными обозначениями для типов System.String
и System.Char
(оба основаны на Unicode). Как вам уже может быть известно, string
представляет непрерывное множество символов (например, "Hello"
), a char
— одиночную ячейку в string
(например, 'Н'
).
Помимо возможности хранения одиночного элемента символьных данных тип System.Char
предлагает немало другой функциональности. Используя статические методы System.Char
, можно выяснять, является данный символ цифрой, буквой, знаком пунктуации или чем-то еще. Взгляните на следующий метод:
static void CharFunctionality()
{
Console.WriteLine("=> char type Functionality:");
char myChar = 'a';
Console.WriteLine("char.IsDigit('a'): {0}", char.IsDigit(myChar));
Console.WriteLine("char.IsLetter('a'): {0}", char.IsLetter(myChar));
Console.WriteLine("char.IsWhiteSpace('Hello There', 5): {0}",
char.IsWhiteSpace("Hello There", 5));
Console.WriteLine("char.IsWhiteSpace('Hello There', 6): {0}",
char.IsWhiteSpace("Hello There", 6));
Console.WriteLine("char.IsPunctuation('?'): {0}",
char.IsPunctuation('?'));
Console.WriteLine();
}
В методе CharFunctionality()
было показано, что для многих членов System.Char
предусмотрены два соглашения о вызове: одиночный символ или строка с числовым индексом, указывающим позицию проверяемого символа.
Разбор значений из строковых данных
Типы данных .NET Core предоставляют возможность генерировать переменную лежащего в основе типа, имея текстовый эквивалент (например, путем выполнения разбора) Такой прием может оказаться исключительно удобным, когда вы хотите преобразовывать в числовые значения некоторые вводимые пользователем данные (вроде элемента, выбранного в раскрывающемся списке внутри графического пользовательского интерфейса) Ниже приведен пример метода ParseFromStrings()
, содержащий логику разбора:
static void ParseFromStrings()
{
Console.WriteLine("=> Data type parsing:");
bool b = bool.Parse("True");
Console.WriteLine("Value of b: {0}", b); // Вывод значения b
double d = double.Parse("99.884");
Console.WriteLine("Value of d: {0}", d); // Вывод значения d
int i = int.Parse("8");
Console.WriteLine("Value of i: {0}", i); // Вывод значения i
char c = Char.Parse("w");
Console.WriteLine("Value of c: {0}", c); // Вывод значения с
Console.WriteLine();
}
Использование метода TryParse() для разбора значений из строковых данных
Проблема с предыдущим кодом связана с тем, что если строка не может быть аккуратно преобразована в корректный тип данных, то сгенерируется исключение. Например, следующий код потерпит неудачу во время выполнения:
bool b = bool.Parse("Hello");
Решение предусматривает помещение каждого вызова Parse()
в блок try-catch
(обработка исключений подробно раскрывается в главе 7), что добавит много кода, или применение метода TryParse()
. Метод TryParse()
принимает параметр out
(модификатор out
рассматривается в главе 4) и возвращает значение bool
, которое указывает, успешно ли прошел разбор. Создайте новый метод по имени ParseFromStringWithTryParse()
и поместите в него такой код:
static void ParseFromStringsWithTryParse()
{
Console.WriteLine("=> Data type parsing with TryParse:");
if (bool.TryParse("True", out bool b))
{
Console.WriteLine("Value of b: {0}", b); // Вывод значения b
}
else
{
Console.WriteLine("Default value of b: {0}", b);
// Вывод стандартного значения b
}
string value = "Hello";
if (double.TryParse(value, out double d))
{
Console.WriteLine("Value of d: {0}", d);
}
else
{
// Преобразование входного значения в double потерпело неудачу
// и переменной было присвоено стандартное значение.
Console.WriteLine("Failed to convert the input ({0}) to a double
and
the variable was
assigned the default {1}", value,d);
}
Console.WriteLine();
}
Если вы только начали осваивать программирование и не знаете, как работают операторы if/else
, то они подробно рассматриваются позже в главе. В приведенном выше примере важно отметить, что когда строка может быть преобразована в запрошенный тип данных, метод TryParse()
возвращает true
и присваивает разобранное значение переменной, переданной методу. В случае невозможности разбора значения переменной присваивается стандартное значение, а метод TryParse()
возвращает false
.
Использование типов System.DateTime и System.TimeSpan
В пространстве имен System
определено несколько полезных типов данных, для которых отсутствуют ключевые слова языка С#, в том числе структуры DateTime
и TimeSpan
. (При желании