Menu

C# Veri Tipleri: int, double, decimal, char, bool ve Aralıkları

Boyutu, aralığı ve literal son ekiyle her yerleşik C# tipi, değer tipleri ile referans tipleri arasındaki fark, para için neden decimal kullanıldığı, tamsayı taşması ve checked, varsayılan değerler.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

C# statik tiplidir: her değişkenin, alanın ve ifadenin derleme zamanında bilinen bir tipi vardır. Dilin kendi anahtar kelimeleri olan bir dizi yerleşik tipi vardır (int, double, string...). Her anahtar kelime System namespace'indeki bir tipin takma adıdır; yani int ile System.Int32 aynı tiptir, string ile System.String de aynı tiptir.

Yerleşik tipler

Tip.NET tipiBoyutAralık ya da hassasiyetLiteral
boolBoolean1 bayttrue ya da falsetrue
byteByte1 bayt0 ile 255 arası200
sbyteSByte1 bayt-128 ile 127 arası-5
shortInt162 bayt-32.768 ile 32.767 arası1200
ushortUInt162 bayt0 ile 65.535 arası60000
intInt324 bayt-2.147.483.648 ile 2.147.483.647 arası42
uintUInt324 bayt0 ile 4.294.967.295 arası42u
longInt648 baytyaklaşık ±9,2 × 10^1842L
ulongUInt648 bayt0 ile yaklaşık 1,8 × 10^19 arası42ul
floatSingle4 baytyaklaşık ±3,4 × 10^38, ~6 ile 9 basamak2.5f
doubleDouble8 baytyaklaşık ±1,8 × 10^308, ~15 ile 17 basamak2.5 ya da 2.5d
decimalDecimal16 baytyaklaşık ±7,9 × 10^28, 28 ile 29 basamak2.5m
charChar2 baytbir UTF-16 kod birimi, U+0000 ile U+FFFF arası'A'
stringStringreferansher uzunlukta metin, değiştirilemez"hello"
objectObjectreferansher tipin temelinew object()

Son eki olmayan bir tamsayı literal'i bir int'tir; int için fazla büyükse uint, long ve ulong arasından onu tutabilen ilk tip olur. Ondalık noktası olan bir literal ise double'dır. float f = 2.5; ve decimal d = 2.5; satırlarının derlenmemesinin nedeni budur: literal bir double'dır ve double'dan float'a ya da decimal'e örtük dönüşüm yoktur. Son eki ekleyin: 2.5f, 2.5m.

Her sayısal tip sınırlarını sabitler olarak sunar:

Çıktı:

byte:  0 to 255
short: -32768 to 32767
int:   -2147483648 to 2147483647
long:  -9223372036854775808 to 9223372036854775807
decimal max: 79228162514264337593543950335
double max:  1.798E+308
sizes: int 4, long 8, double 8, char 2
255 161 3000000000

Uygulamada çoğu kod bunlardan dördünü kullanır: sayımlar ve indeksler için int, ID'ler ve büyük toplamlar için long, ölçümler ve matematik için double, para için decimal.

decimal ve double

double (ve float) sayıları ikili sistemde saklar. 0.1 dahil çoğu ondalık kesrin tam bir ikili karşılığı yoktur, bu yüzden temsil edilebilen en yakın değer olarak saklanırlar ve küçük hatalar birikir. decimal ise 10 tabanında bir tamsayı ile bir ölçek saklar, bu yüzden 0.1 tam olarak 0.1'dir.

Çıktı:

False
True
0.30000000000000004
0.3
double sum == 1.0: False
decimal sum == 1.0: True
Total: 59.97
Split three ways: 19.99

Para, fiyatlar, vergi ve bir insanın elle toplayıp karşılaştıracağı her şey için decimal kullanın. Girdilerindeki sondaki sıfırları korur (1.50m, 1.50 olarak yazdırılır) ve 28 ile 29 anlamlı basamağı vardır.

Fiziksel ölçümler, istatistik, geometri ve oyunlar için double kullanın. Birkaç kat daha hızlıdır, yarı bellek kullanır ve aralığı muazzamdır. Hesaplanmış iki double'ı asla == ile karşılaştırmayın; farkı bir toleransla karşılaştırın: Math.Abs(x - y) < 1e-9.

decimal sihirli değildir: 1m / 3m yine 0.3333333333333333333333333333'tür. double aritmetiği sıfıra bölmede istisna fırlatmaz (sonsuz ya da 0.0 / 0.0 için NaN üretir), decimal ve tamsayı bölmesi ise sıfıra bölmede DivideByZeroException fırlatır.

Tamsayı taşması ve checked

Tipin aralığını aşan tamsayı aritmetiği varsayılan olarak sessizce başa sarar. Derleyici sabit ifadelerdeki taşmayı yakalar, ama değerler değişkenlerden geldiğinde yakalamaz:

Çıktı:

-2147483648
OverflowException
-1294967296
2147483648

checked(...) ya da bir checked { ... } bloğu taşmayı bir OverflowException'a çevirir. Bunu <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow> ile tüm proje için de açabilirsiniz. Sabitlerle int x = int.MaxValue + 1; yazmak bir derleme hatasıdır (CS0220), çünkü derleyici taşmayı görebilir.

Son satır çoğu taşma hatasının çözümünü gösterir: aritmetikten önce daha geniş bir tipe dönüştürün. (long)(max + 1) yanlış olurdu, çünkü dönüşüm çalıştığında toplama zaten başa sarmıştır.

Değer tipleri ve referans tipleri

Her C# tipi ya bir değer tipi ya da bir referans tipidir ve fark, atamanın ne yaptığını belirler.

  • Değer tipleri: tüm sayısal tipler, bool, char, DateTime, enum'lar ve her struct. Değişken veriyi içerir; atama onu kopyalar.
  • Referans tipleri: string, diziler, object ve her class. Değişken bir nesneye referans içerir; atama referansı kopyalar, bu yüzden iki değişken de aynı nesneyi görür.

Çıktı:

a=10 b=99
first[0]=99
s1=cat s2=cats

string, uygulamada bir değer gibi davranan bir referans tipidir: değiştirilemezdir ve == referansları değil metni karşılaştırır. Kullanıcı tanımlı değer tipleri hakkında daha fazlası struct'lar sayfasında.

char ve bool

Bir char, tek tırnak içinde yazılan bir UTF-16 kod birimidir. Altta sayısal bir tiptir, bu yüzden int'e dönüşür ve aritmetiği destekler:

Çıktı:

66
C
True
True
7
b
True

bool'un tam olarak iki değeri vardır ve sayılara dönüşmez, sayılardan da dönüştürülemez: if (count) sıfır olmayan değer testi değil, bir derleme hatasıdır. if (count != 0) yazın. Çoğu emoji gibi Temel Çok Dilli Düzlem dışındaki karakterler iki char değeri kaplar (bir surrogate çifti); bu yüzden bir string'in Length'i görünen karakterleri değil UTF-16 birimlerini sayar.

Varsayılan değerler

Alanlar, dizi elemanları ve default(T) tipin varsayılan değerini alır: sayılar için sıfır, bool için false, char için '\0' ve referans tipleri için null. Yerel değişkenler varsayılan değer almaz ve kullanılmadan önce atanmalıdır.

Çıktı:

0
0
False
True
0001-01-01
0,0,0

C# 7.1'den beri, derleyici tipi çıkarabildiğinde default literal'ini tip olmadan yazabilirsiniz (int x = default;). Bir değer tipi null olamaz; int? (nullable değer tipi) bunun içindir, bkz. nullable tipler.

Yerel boyutlu ve büyük tamsayılar

Özel durumlar için iki sayısal tip daha vardır. nint ve nuint (C# 9) platforma göre 32 ya da 64 bit olan, bir pointer boyutunda tamsayılardır ve birlikte çalışma ile düşük seviye kodda kullanılır. System.Numerics.BigInteger hız pahasına her boyutta tamsayı tutar:

using System.Numerics;
BigInteger factorial = 1;
for (int i = 2; i <= 30; i++) factorial *= i;
// 265252859812191058636308480000000

Sıkça Sorulan Sorular

C#'ta veri tipleri nelerdir?

Yerleşik tipler; tamsayılar (sbyte, byte, short, ushort, int, uint, long, ulong), kayan noktalı float ve double tipleri, kesin ondalık aritmetik için decimal, bir UTF-16 karakter için char, bool ve referans tipleri string ile object'tir. Her anahtar kelime bir .NET tipinin takma adıdır: int, System.Int32; string, System.String'dir.

C#'ta para için decimal mı kullanmalıyım, double mı?

decimal kullanın. double ikili kesirler saklar, bu yüzden 0.1 gibi değerler tam olarak temsil edilemez ve toplamlar kayar (0.1 + 0.2 == 0.3 false'tur). decimal 10 tabanında basamaklar saklar, 28 ile 29 anlamlı basamak tutar ve muhasebecilerin beklediği sonuçları verir. double daha hızlıdır ve çok daha geniş bir aralığı vardır; onu bilim, grafik ve ölçümler için kullanın.

C#'ta int'in maksimum değeri nedir?

int.MaxValue 2.147.483.647, int.MinValue ise -2.147.483.648'dir (32 bitlik işaretli tamsayı). int.MaxValue'ya 1 eklemek, kod checked bir bağlamda çalışmadıkça sessizce int.MinValue'ya sarar; checked bağlamda bir OverflowException fırlatır. Daha büyük değerler için long (yaklaşık 9,2 kentilyona kadar) kullanın.

C#'ta float ile double arasındaki fark nedir?

float 32 bittir ve yaklaşık 6 ile 9 anlamlı basamak tutar; double 64 bittir ve yaklaşık 15 ile 17 basamak tutar. Kayan noktalı literal'ler varsayılan olarak double'dır, bu yüzden bir float f son ekine ihtiyaç duyar: float speed = 2.5f;. Bellek ya da bir API (Unity'nin Vector3'ü gibi) float gerektirmedikçe double kullanın.

C#'ta değer tipleri ile referans tipleri arasındaki fark nedir?

Bir değer tipi değişkeni (int, double, bool, DateTime, herhangi bir struct) verinin kendisini tutar ve atama onu kopyalar. Bir referans tipi değişkeni (string, diziler, herhangi bir class) heap'teki bir nesneye referans tutar ve atama referansı kopyalar; böylece iki değişken aynı nesneyi gösterebilir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA