Использование типов 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
большое значение, не переполнив стандартные типы данных, которые задействуются для неформатированных числовых значений?
Простейший подход предусматривает определение большого числового значения в виде текстового литерала, который затем может быть преобразован в переменную
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()
для перемножения двух больших чисел можно использовать такой код: