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

Типы данных для 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#-данных можно на основе этого замечательного видео, где дополняется все сказаное нами:

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

Всегда перед глазами: 15 лучших тем VS Code на 2026 год

Visual Code от Microsoft, вероятно, один из самых популярных редакторов кода. Разработчики любят его за…

22.02.2026

Киберпанк по-японски: 9 лучших аниме в жанре «технологии нас погубят»

Япония сама по себе — сплошной киберпанк. Это заметил даже культовый писатель жанра Уильям Гибсон,…

21.02.2026

Не просто коробка с бантом. Как оригинально подарить гаджет: 5 незатратных способов

Сам по себе телефон Айфон 17 Про Макс – отличный подарок. У него красивая заводская…

12.02.2026

Лучшие криптобиржи для криптозаймов в 2025 году: где лучше брать кредит под крипту?

На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…

09.07.2025

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024