можете самостоятельно ознакомиться с типом
System.Void
, показанным на рис. 3.2.)
Тип DateTime
содержит данные, представляющие специфичное значение даты (месяц, день, год) и времени, которые могут форматироваться разнообразными способами с применением членов этого типа. Структура TimeSpan
позволяет легко определять и трансформировать единицы времени, используя различные ее члены.
static void UseDatesAndTimes()
{
Console.WriteLine("=> Dates and Times:");
// Этот конструктор принимает год, месяц и день.
DateTime dt = new DateTime(2015, 10, 17);
// Какой это день месяца?
Console.WriteLine("The day of {0} is {1}", dt.Date, dt.DayOfWeek);
// Сейчас месяц декабрь.
dt = dt.AddMonths(2);
Console.WriteLine("Daylight savings: {0}", dt.IsDaylightSavingTime());
// Этот конструктор принимает часы, минуты и секунды.
TimeSpan ts = new TimeSpan(4, 30, 0);
Console.WriteLine(ts);
// Вычесть 15 минут из текущего значения TimeSpan и вывести результат.
Console.WriteLine(ts.Subtract(new TimeSpan(0, 15, 0)));
}
Работа с пространством имен System.Numerics
В пространстве имен System.Numerics
определена структура по имени BigInteger
. Тип данных BigInteger
может применяться для представления огромных числовых значений, которые не ограничены фиксированным верхним или нижним пределом.
На заметку! В пространстве имен System.Numerics
также определена вторая структура по имени Complex
, которая позволяет моделировать математически сложные числовые данные (например, мнимые единицы, вещественные данные, гиперболические тангенсы). Дополнительные сведения о структуре Complex
можно найти в документации по .NET Core.
Несмотря на то что во многих приложениях .NET Core потребность в структуре BigInteger
может никогда не возникать, если все-таки необходимо определить большое числовое значение, то в первую очередь понадобится добавить в файл показанную ниже директиву using
:
// Здесь определен тип BigInteger:
using System.Numerics;
Теперь с применением операции new
можно создать переменную BigInteger
. Внутри конструктора можно указать числовое значение, включая данные с плавающей точкой. Однако компилятор C# неявно типизирует числа не с плавающей точкой как int
, а числа с плавающей точкой — как double
. Как же тогда установить для BigInteger
большое значение, не переполнив стандартные типы данных, которые задействуются для неформатированных числовых значений?
Простейший подход предусматривает определение большого числового значения в виде текстового литерала, который затем может быть преобразован в переменную BigInteger
посредством статического метода Parse()
. При желании можно также передавать байтовый массив непосредственно конструктору класса BigInteger
.
На заметку! После того как переменной BigInteger
присвоено значение, модифицировать ее больше нельзя, т.к. это неизменяемые данные. Тем не менее, в классе BigInteger
определено несколько членов, которые возвращают новые объекты BigInteger
на основе модификаций данных (такие как статический метод Multiply()
, используемый в следующем примере кода).
В любом случае после определения переменной BigInteger
вы обнаружите, что в этом классе определены члены, похожие на члены в других внутренних типах данных C# (например, float
либо int
). Вдобавок в классе BigInteger
определен ряд статических членов, которые позволяют применять к переменным BigInteger
базовые математические операции (наподобие сложения и умножения). Взгляните на пример работы с классом BigInteger
:
static void UseBigInteger()
{
Console.WriteLine("=> Use BigInteger:");
BigInteger biggy =
BigInteger.Parse("9999999999999999999999999999999999999999999999");
Console.WriteLine("Value of biggy is {0}", biggy);
Console.WriteLine("Is biggy an even value?: {0}", biggy.IsEven);
Console.WriteLine("Is biggy a power of two?: {0}", biggy.IsPowerOfTwo);
BigInteger reallyBig = BigInteger.Multiply(biggy,
BigInteger.Parse("8888888888888888888888888888888888888888888"));
Console.WriteLine("Value of reallyBig is {0}", reallyBig);
}
Важно отметить, что тип данных BigInteger
реагирует на внутренние математические операции С#, такие как +
, -
и *
. Следовательно, вместо вызова метода BigInteger.Multiply()
для перемножения двух больших чисел можно использовать такой код:
BigInteger reallyBig2 = biggy * reallyBig;
К настоящему моменту вы должны понимать, что ключевые слова С#, представляющие базовые типы данных, имеют соответствующие типы в библиотеках базовых классов .NET Core, каждый из которых предлагает фиксированную функциональность. Хотя абсолютно все члены этих типов данных в книге подробно не рассматриваются, имеет смысл изучить их самостоятельно. Подробные описания разнообразных типов данных .NET Core можно найти в документации по .NET Core — скорее всего, вы будете удивлены объемом их встроенной функциональности.
Использование разделителей групп цифр (нововведение в версии 7.0)
Временами при присваивании числовой переменной крупных чисел цифр оказывается больше, чем способен отслеживать глаз. В версии C# 7.0 был введен разделитель групп цифр в виде символа подчеркивания (_
) для данных int
, long
, decimal
, double
или шестнадцатеричных типов. Версия C# 7.2 позволяет шестнадцатеричным значениям (и рассматриваемым далее новым двоичным литералам) после открывающего объявления начинаться с символа подчеркивания. Ниже представлен пример применения нового разделителя групп цифр:
static void DigitSeparators()
{
Console.WriteLine("=> Use Digit Separators:");
Console.Write("Integer:"); // Целое
Console.WriteLine(123_456);
Console.Write("Long:"); // Длинное целое
Console.WriteLine(123_456_789L);
Console.Write("Float:"); // С плавающей точкой
Console.WriteLine(123_456.1234F);
Console.Write("Double:"); // С плавающей точкой двойной точности
Console.WriteLine(123_456.12);
Console.Write("Decimal:"); // Десятичное
Console.WriteLine(123_456.12M);
// Обновление в версии 7.2: шестнадцатеричное значение
// может начинаться с символа _
Console.Write("Hex:");
Console.WriteLine(0x_00_00_FF); // Шестнадцатеричное
}
Использование двоичных литералов (нововведение в версии 7.0/7.2)
В версии C# 7.0 появился новый литерал для двоичных значений, которые представляют, скажем, битовые маски. Новый разделитель групп цифр работает с двоичными литералами, а в версии C# 7.2 разрешено начинать двоичные и шестнадцатеричные числа начинать с символа подчеркивания. Теперь двоичные числа можно записывать ожидаемым образом, например:
0b_0001_0000
Вот метод, в котором иллюстрируется использование новых литералов с разделителем групп цифр:
static void BinaryLiterals()
{
// Обновление в версии 7.2: двоичное значение может начинаться с символа _
Console.WriteLine("=> Use Binary Literals:");
Console.WriteLine("Sixteen: {0}",0b_0001_0000); // 16
Console.WriteLine("Thirty Two: {0}",0b_0010_0000); // 32
Console.WriteLine("Sixty Four: {0}",0b_0100_0000); // 64
}
Работа со строковыми данными
Класс System.String
предоставляет набор членов, вполне ожидаемый от служебного