Типы данных для 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# типы данных имеют две категории:
- Типы значений — это тип данных, содержащий значения данных в собственном пространстве памяти. Хранятся в стеке, а потому их можно быстро создавать и удалять.
- Ссылочные типы — хранят ссылку на значения и указывают на другую ячейку памяти, в которой хранятся данные. Хранятся в управляемой куче.
Подразделение типов значения
- Целочисленные типы (
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#-данных можно на основе этого замечательного видео, где дополняется все сказаное нами:

Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: