Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Страница 57

Использование типов 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(&quot;The day of {0} is {1}&quot;, dt.Date, dt.DayOfWeek);

<b>  // Сейчас месяц декабрь.</b>

  dt = dt.AddMonths(2);

  Console.WriteLine(&quot;Daylight savings: {0}&quot;, 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
большое значение, не переполнив стандартные типы данных, которые задействуются для неформатированных числовых значений?

Простейший подход предусматривает определение большого числового значения в виде текстового литерала, который затем может быть преобразован в переменную

BigInteger
посредством статического метода
Parse()
. При желании можно также передавать байтовый массив непосредственно конструктору класса
BigInteger
.

На заметку! После того как переменной

BigInteger
присвоено значение, модифицировать ее больше нельзя, т.к. это неизменяемые данные. Тем не менее, в классе
BigInteger
определено несколько членов, которые возвращают новые объекты
BigInteger
на основе модификаций данных (такие как статический метод
Multiply()
, используемый в следующем примере кода).

В любом случае после определения переменной

BigInteger
вы обнаружите, что в этом классе определены члены, похожие на члены в других внутренних типах данных C# (например,
float
либо
int
). Вдобавок в классе
BigInteger
определен ряд статических членов, которые позволяют применять к переменным
BigInteger
базовые математические операции (наподобие сложения и умножения). Взгляните на пример работы с классом
BigInteger
:

static void UseBigInteger()

{

  Console.WriteLine(&quot;=&gt; Use BigInteger:&quot;);

  BigInteger biggy =

    BigInteger.Parse(&quot;9999999999999999999999999999999999999999999999&quot;);

  Console.WriteLine(&quot;Value of biggy is {0}&quot;, biggy);

  Console.WriteLine(&quot;Is biggy an even value?: {0}&quot;, biggy.IsEven);

  Console.WriteLine(&quot;Is biggy a power of two?: {0}&quot;, biggy.IsPowerOfTwo);

  BigInteger reallyBig = BigInteger.Multiply(biggy,

    BigInteger.Parse(&quot;8888888888888888888888888888888888888888888&quot;));

  Console.WriteLine(&quot;Value of reallyBig is {0}&quot;, reallyBig);

}

Важно отметить, что тип данных

BigInteger
реагирует на внутренние математические операции С#, такие как
+
,
-
и
*
. Следовательно, вместо вызова метода
BigInteger.Multiply()
для перемножения двух больших чисел можно использовать такой код: