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 tipi | Boyut | Aralık ya da hassasiyet | Literal |
|---|---|---|---|---|
bool | Boolean | 1 bayt | true ya da false | true |
byte | Byte | 1 bayt | 0 ile 255 arası | 200 |
sbyte | SByte | 1 bayt | -128 ile 127 arası | -5 |
short | Int16 | 2 bayt | -32.768 ile 32.767 arası | 1200 |
ushort | UInt16 | 2 bayt | 0 ile 65.535 arası | 60000 |
int | Int32 | 4 bayt | -2.147.483.648 ile 2.147.483.647 arası | 42 |
uint | UInt32 | 4 bayt | 0 ile 4.294.967.295 arası | 42u |
long | Int64 | 8 bayt | yaklaşık ±9,2 × 10^18 | 42L |
ulong | UInt64 | 8 bayt | 0 ile yaklaşık 1,8 × 10^19 arası | 42ul |
float | Single | 4 bayt | yaklaşık ±3,4 × 10^38, ~6 ile 9 basamak | 2.5f |
double | Double | 8 bayt | yaklaşık ±1,8 × 10^308, ~15 ile 17 basamak | 2.5 ya da 2.5d |
decimal | Decimal | 16 bayt | yaklaşık ±7,9 × 10^28, 28 ile 29 basamak | 2.5m |
char | Char | 2 bayt | bir UTF-16 kod birimi, U+0000 ile U+FFFF arası | 'A' |
string | String | referans | her uzunlukta metin, değiştirilemez | "hello" |
object | Object | referans | her tipin temeli | new 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 herstruct. Değişken veriyi içerir; atama onu kopyalar. - Referans tipleri:
string, diziler,objectve herclass. 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.