Рубріки: Теория

Типы данных для C#: минимум, который необходимо знать

Ольга Змерзла

C# является строго типизированным языком. В языках такого типа каждая переменная и константа имеет свой тип, результатом вычисления которого является некое значение. В стандартной библиотеке классов .NET определены встроенные числовые типы и комплексные типы. Об особенностях применения этих разных типов данных мы и поговорим в этой обзорной статье.

Содержание статьи:

1 Введение
1.1 Подразделение типов значения
1.2 Подразделение ссылочных типов
2. Использование суффиксов float, decimal, double
2.1 С# decimal VS double
2.2 Литералы
3. Decimal и float
4. C# convert to decimal
5. C# decimal to int
6. C# decimal round
7. Таблица некоторых типов C# и их сочетание с системными типами
8. Неявная типизация
9. Double или decimal?
9.1 Таблица различий между double и decimal
10 Итог

Введение

Типы данных используются для управления переменными. Каждый из типов данных обрабатывается в соответствии с определенными правилами. Поскольку C# — язык со строгой типизацией, то абсолютно все выполняемые операции проверяются на соответствие типов (во избежание ошибок производится их предварительный контроль). Если какая-либо операция с типами недопустима, итоговая программа не будет скомпилирована. По сути, разработка программного обеспечения на C# представляет собой создание и организацию взаимодействия между различными типами данных.

В языке C# типы данных имеют две категории:

  1. Типы значений — это тип данных, содержащий значения данных в собственном пространстве памяти. Хранятся в стеке, а потому их можно быстро создавать и удалять.
  2. Ссылочные типы — хранят ссылку на значения и указывают на другую ячейку памяти, в которой хранятся данные. Хранятся в управляемой куче.

Подразделение типов значения

  • Целочисленные типы (byte, sbyte, short, ushort, int, uint, long, ulong);
  • Типы с плавающей запятой (float, double);
  • C# decimal;
  • Bool;
  • Char;
  • Перечисления enum;
  • Struct.

Подразделение ссылочных типов

  • Object;
  • String;
  • Class;
  • Interface;
  • Delegate.

Использование суффиксов float, decimal, double

У некоторых числовых типов имеются суффиксы, позволяющие записывать значение типа в переменную.

Числовые типы с плавающей запятой — это действительные числа. Они принадлежат к категории Типы значения. Это простые типы, которые могут быть инициализированы литералами. Они поддерживают операторы сравнения, равенства и арифметические операторы.

Тип C# Диапазон Точность/Знаков после запятой Размер/байт Системный тип
float ±1,5 x 10-45…±3,4 x 1038 6-9 4 System.Single
double ±5,0 × 10-324…±1,7 × 10308 15-17 8 System.Double
decimal ±1,0 x 10-28…±7,9228 x 1028 28-29 16 System.Decimal

Ключевые слова из колонки Тип C# взаимозаменяемы с системными типами.

Пример:

double a = 12.3;
System.Double b = 12.3;

Все типы с плавающей запятой имеют свои константы MaxValue и MinValue. Типы float и double в дополнение имеют константы, которые обозначают нечисловые и бесконечные значения.

С# decimal format подходит тогда, когда необходима точность, определяемая числом цифр справа от запятой. Числа с точностью до одной десятичной цифры наиболее точно обрабатывают тип decimal. В double или float в десятичных данных могут возникать ошибки.

С# decimal VS double

В случаях, когда производительность важнее точности, тип decimal (c# format decimal) можно заменить типом double.

Литералы

Тип определяется суффиксом:

  • double имеет суффиксы D или d;
  • float имеет суффиксы F или f;
  • decimal имеет суффиксы M или m.

Пример:

double d = 3D;
d = 4d;
d = 3.934_001;

float f = 3_000.5F;
f = 5.4f;

decimal myMoney = 3_000.5m;
myMoney = 400.75M;

Decimal и float

Decimal и float используются для хранения числовых значений:

  • Float является 32-битным типом данных с приблизительным числом. Не все значения в диапазоне типов данных могут быть точными, значения округляются;
  • Decimal является 128-битным типом данных с фиксированной точностью. Все значения в диапазоне типов данных представлены с точностью и масштабом, значения не округляются;
  • Decimal чаще всего используется в финансовых приложениях, требующих высокой точности без ошибок округления, а float используется для хранения чисел и повышения производительности.

C# convert to decimal

Класс convert создан для того, чтобы преобразовывать широкий спектр типов. С его помощью можно преобразовывать в десятичное число больше типов. Метод Convert.ToDecimal используется для преобразования строкового представления числа в эквивалентное десятичное число с информацией о форматировании.

Пример:

// C# program to demonstrate the
// Convert.ToDecimal() Method
using System;
using System.Globalization;
 
class GFG {
 
// Main Method
public static void Main()
{
    try {
         
        // creating object of CultureInfo
        CultureInfo cultures = new CultureInfo("en-US");
 
        // declaring and initializing String array
        string[] values = {"123456789", "12345.6789",
                                 "123,456,789.0123"};
 
        // calling get() Method
        Console.WriteLine("Converted decimal value "+
                           "of specified strings: ");
                            
        for (int j = 0; j < values.Length; j++) {
            get(values[j], cultures);
        }
    }
     
    catch (FormatException e) {
         
        Console.WriteLine("\n");
        Console.Write("Exception Thrown: ");
        Console.Write("{0}", e.GetType(), e.Message);
    }
     
    catch (OverflowException e) {
         
        Console.WriteLine("\n");
        Console.Write("Exception Thrown: ");
        Console.Write("{0}", e.GetType(), e.Message);
    }
}
 
// Defining get() method
public static void get(string s,
           CultureInfo cultures)
{
 
    // converting string to specified char
    decimal val = Convert.ToDecimal(s, cultures);
 
    // display the converted char value
    Console.Write(" {0}, ", val);
}
}

Вывод: преобразование в десятичное значение указанных строк:

123456789, 12345.6789, 123456789.0123.

C# decimal to int

Метод Decimal.ToInt32() создан для преобразования decimal значения в эквивалентное 32-разрядное целое число со знаком.

Пример:

/ C# program to demonstrate the
// Decimal.ToInt32(Decimal) Method
using System;
  
class GFG {
  
    // Main Method
    public static void Main()
    {
        try {
  
            // Taking decimal variables
            Decimal dec1 = 2147483647M;
            Decimal dec2 = 21458565.2996m;
  
            // using Decimal.ToInt32(Decimal) Method
            // Here int means Int32
            int val1 = Decimal.ToInt32(dec1);
              
            // using Decimal.ToInt32(Decimal) Method
            // Here int means Int32
            int val2 = Decimal.ToInt32(dec2);
              
  
            // Printing the Int32 value
            Console.WriteLine("The Int32 value "
                            + "is : {0}", val1);
                                  
            // Printing the Int32 value
            Console.WriteLine("The Int32 value "
                            + "is : {0}", val2);
                          
        }
  
        catch (OverflowException e) 
        {
            Console.Write("Exception Thrown: ");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

Вывод: Int32: 2147483647 и Int32: 21458565.

C# decimal round

Decimal.Round() или С# round decimal представляет собой метод округления к ближайшему целому числу или указанному количеству десятичных знаков.

Существует 4 способа округления:
1Decimal round С# , то есть десятичный метод — Round(Decimal) Method — округление десятичного значения до ближайшего целого числа;

Пример:

// C# program to demonstrate the
// Decimal.Round(Decimal) Method
using System;
  
class GFG {
  
    // Main Method
    public static void Main()
    {
        try {
  
            // Declaring and initializing value
            decimal value = 184467440737095.51615M;
  
            // getting rounded decimal
            // using Round() method
            decimal round = Decimal.Round(value);
  
            // Display the value
            Console.WriteLine("Rounded value is {0}", round);
        }
  
        catch (OverflowException e) 
        {
            Console.WriteLine("Value must not be out of bound");
            Console.Write("Exception Thrown: ");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

Вывод: округленное значение 184467440737096.

2Round(Decimal, Int32) Method — округление значения Decimal до указанного количества десятичных знаков;

Пример:

// C# program to demonstrate the
// Decimal.Round(Decimal) Method
using System;
  
class GFG {
  
    // Main Method
    public static void Main()
    {
        try {
  
            // Declaring and initializing value
            decimal value = 7922816251426433759354.39503305M;
  
            // getting rounded decimal
            // using Round() method
            decimal round = Decimal.Round(value, 4);
  
            // Display the value
            Console.WriteLine("Rounded value is {0}", round);
        }
  
        catch (ArgumentOutOfRangeException e) 
        {
            Console.WriteLine("decimal place is not within bound");
            Console.Write("Exception Thrown: ");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

Вывод: округленное значение 7922816251426433759354,3950.

3Round(Decimal, Int32, MidpointRounding) Method;

4Round(Decimal, MidpointRounding) Method.

Таблица некоторых типов C# и их сочетание с системными типами

Название встроенного типа (столбец Ключевое слово) — и есть сокращенное обозначение системного типа (столбец Системный тип).

Ключевое слово Системный тип Описание и диапазон значений Размер
byte System.Byte Структура. Целое число 0…255. 1 байт
sbyte System.SByte Структура. Целое число -128…127. 1 байт
short System.Int16 Структура. Целое число -32768…32767. 2 байта
ushort System.UInt16 Структура. Целое число 0…65535. 2 байта
int System.Int32 Структура. Целое число -2147483648…2147483647. 4 байта
uint System.UInt32 Структура. Целое число 0…4294967295. 4 байта
long System.Int64 Структура. Целое число –9 223 372 036 854 775 808…9 223 372 036 854 775 807. 8 байт
ulong System.UInt64 Структура. Целое число 0…18 446 744 073 709 551 615. 8 байт
float System.Single Структура. Число с плавающей точкой -3.4*1038…3.4*1038 4 байта
double System.Double Структура. Число с плавающей точкой ±5.0*10-324…±1.7*10308 8 байт
decimal format c# System.Decimal Структура. Десятичное дробное число. Без десятичной запятой ±1.0*10-28…±7.9228*1028, хранит до 28 знаков после запятой. 16 байт
bool System.Boolean Структура. Хранит логические литералы true или false. 1 байт
char System.Char Структура. Хранит одиночный символ в Unicode. 2 байта
object System.Object Класс. Хранит значение любого типа данных.
string System.String Класс. Хранит набор символов Unicode.

Неявная типизация

Чтобы указать призвольный тип переменных, можно использовать неявную типизацию. Для этого используется ключевое слово var.

Пример:

var hello = "Привет, мир!";
var c = 20;
             
Console.WriteLine(c.GetType().ToString());
Console.WriteLine(hello.GetType().ToString());

Var используется вместо названия типа данных. Присвоенное значение позволяет компилятору выводить тип данных. В примере Console.WriteLine(c.GetType().ToString()); определяет тип переменной с. Целочисленные значения по умолчанию рассматриваются как int,  поэтому переменная с имеет тип System.Int32.

Но такие переменные имеют свои ограничения:

1Нельзя определить неявную переменную и сразу ее инициализировать.

// верно
int a;
a = 20;
 
// неверно
var c;
c = 20;

2Неявная переменная не может иметь значение null, в этом случае компилятор не определит автоматически тип данных.

// неверно
var c=null;

Double или format decimal C#?

Для больших дробных чисел проще всего использовать тип double. Decimal имеет большую разрядность в сравнении с double, но double хранит большее значение.

После запятой decimal может иметь до 28 цифр, тогда как double — до 16. Тем не менее double широко используется в математических вычислениях, а decimal — в финансовых.

Таблица различий между double и decimal

Максимальное значение Минимальное значение Цифр после запятой Размер Количество операций
double ~10308 ~10-323 16 8 байт миллиарды в секунду
decimal ~1028 10-28 28 16 байт сотни миллионов в секунду

Итог

Типы данных могут быть простыми и сложными. Сложные типы чаще всего данные структурируют, а у простых значения данных неделимы. Любой язык программирования имеет систему встроенных типов данных, на их основе можно создавать свои производные.

В C# типы данных подразделяются на две большие группы:

  • типы значений (входит большинство встроенных типов в т.ч. пользовательские) — для их создания применяется ключевое слово struct ;
  • ссылочные типы — для их создания применяется ключевое слово class.

Закрепить материал по типам C#-данных можно на основе этого замечательного видео, где дополняется все сказаное нами:

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023