Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Тип 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 предоставляет набор членов, вполне ожидаемый от служебного