Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Шрифт:
Интервал:
Закладка:
Использование типов System.DateTime и System.TimeSpan
В пространстве имен System определено несколько полезных типов данных, для которых отсутствуют ключевые слова языка С#, в том числе структуры DateTime и TimeSpan. (При желании можете самостоятельно ознакомиться с типом System.Void, показанным на рис. 3.2.)
Тип DateTime содержит данные, представляющие специфичное значение даты (месяц, день, год) и времени, которые могут форматироваться разнообразными способами с применением членов этого типа. Структура TimeSpan позволяет легко определять и трансформировать единицы времени, используя различные ее члены.
static void UseDatesAndTimes()
{
Console.WriteLine("=> Dates and Times:");
<b> // Этот конструктор принимает год, месяц и день.</b>
DateTime dt = new DateTime(2015, 10, 17);
<b> // Какой это день месяца?</b>
Console.WriteLine("The day of {0} is {1}", dt.Date, dt.DayOfWeek);
<b> // Сейчас месяц декабрь.</b>
dt = dt.AddMonths(2);
Console.WriteLine("Daylight savings: {0}", dt.IsDaylightSavingTime());
<b> // Этот конструктор принимает часы, минуты и секунды.</b>
TimeSpan ts = new TimeSpan(4, 30, 0);
Console.WriteLine(ts);
<b> // Вычесть 15 минут из текущего значения TimeSpan и вывести результат.</b>
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 большое значение, не переполнив стандартные типы данных, которые задействуются для неформатированных числовых значений?
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})Простейший подход предусматривает определение большого числового значения в виде текстового литерала, который затем может быть преобразован в переменную 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() для перемножения двух больших чисел можно использовать такой код: