Aracılığıyla paylaş


C# türü sistemi

Tip

Yazılım geliştirme konusunda yeni misiniz? İlk olarak Başlangıç öğreticileri ile başlayın. Size program yazmayı adım adım öğretip ilerledikçe türleri tanıtırlar.

Başka bir dilde mi deneyimlisiniz? Tür sistemlerini zaten anlıyorsanız, değer ve başvuru ayrımını gözden geçirin ve hangi türü seçeceğinizi anlatan kılavuza bakın, ardından belirli türlerle ilgili makalelere geçiş yapın.

C# kesin olarak yazılan bir dildir. Her değişken, sabit ve ifadenin bir türü vardır. Derleyici, kodunuzdaki her işlemin ilgili türler için geçerli olup olmadığını denetleyerek tür güvenliğini zorlar. Örneğin, iki int değer ekleyebilirsiniz, ancak bir int ve bool değer ekleyemezsiniz.

int a = 5;
int b = a + 2; // OK

bool test = true;

// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
// int c = a + test;

Uyarı

C ve C++'ın aksine, C# dilinde bool, int'ye dönüştürülemez.

Tür güvenliği, kodunuz çalışmadan önce derleme zamanında hataları yakalar. Derleyici ayrıca tür bilgilerini yürütülebilir dosyaya meta veri olarak ekler ve ortak dil çalışma zamanı (CLR), çalışma zamanında ilave güvenlik denetimlerini gerçekleştirmek için bunları kullanır.

Türleri olan değişkenleri bildirme

Bir değişkeni bildirdiğinizde, türünü açıkça belirtirsiniz veya derleyicinin türü atanan değerden çıkarmasına izin vermek için kullanırsınız var :

// Explicit type:
int count = 10;
double temperature = 36.6;

// Compiler-inferred type:
var name = "C#";
var items = new List<string> { "one", "two", "three" };

Yöntem parametrelerinin ve dönüş değerlerinin de türleri vardır. Aşağıdaki yöntem bir string ve intalır ve döndürür string:

static string GetGreeting(string name, int visitCount)
{
    return visitCount switch
    {
        1 => $"Welcome, {name}!",
        _ => $"Welcome back, {name}! Visit #{visitCount}."
    };
}

Bir değişkeni bildirdikten sonra türünü değiştiremez veya bildirilen türle uyumsuz bir değer atayamazsınız. Değerleri diğer türlere dönüştürebilirsiniz. Derleyici, verileri otomatik olarak kaybetmeyen örtük dönüştürmeler gerçekleştirir. Açık dönüştürmeler (atamalar), kodunuzda dönüştürmeyi belirtmenizi gerektirir. Daha fazla bilgi için Dönüştürme ve tür dönüştürmeleri bölümüne bakın.

Yerleşik türler ve özel türler

C# ortak veriler için yerleşik türler sağlar: tamsayılar, kayan noktalı sayılar, bool, charve string. Her C# programı, ek başvuru olmadan bu yerleşik türleri kullanabilir.

Yerleşik türlerin ötesinde, birkaç yapı kullanarak kendi türlerinizi oluşturabilirsiniz:

  • Sınıflar — Davranış modelleme ve karmaşık nesneler için başvuru türleri. Devralmayı ve çok biçimliliği destekler.
  • Yapılar — Küçük, basit veriler için değer türleri. Her değişken kendi kopyasını tutar.
  • Kayıtlar — Derleyici tarafından oluşturulan eşitlik, ToStringve ifadeler aracılığıyla with yıkıcı olmayan mutasyona sahip sınıflar veya yapılar.
  • Arabirimler — Herhangi bir sınıfın veya yapının uygulayabileceği üyeleri tanımlayan sözleşmeler.
  • Numaralandırmalar — Haftanın günleri veya dosya erişim modları gibi integral sabitlerinin adlandırılmış kümeleri.
  • Demetler — Adlandırılmış bir tür tanımlamadan ilgili değerleri gruplandıran basit yapısal türler.
  • Genel türler — ve gibi List<T>Dictionary<TKey, TValue> tür parametreli yapılar, farklı türler için aynı mantığı yeniden kullanırken tür güvenliği sağlar.

Değer türleri ve başvuru türleri

C# dilindeki her tür bir değer türü veya başvuru türüdür. Bu ayrım, değişkenlerin verileri nasıl depoladığını ve atamanın nasıl çalıştığını belirler.

Değer türleri verilerini doğrudan tutar. Yeni bir değişkene değer türü atadığınızda çalışma zamanı verileri kopyalar. Bir değişkende yapılan değişiklikler diğerini etkilemez. Yapılar, sabit listeleri ve yerleşik sayısal türlerin tümü değer türleridir.

Başvuru türleri , yönetilen yığındaki bir nesneye başvuru içerir. Yeni bir değişkene bir başvuru türü atadığınızda, her iki değişken de aynı nesneye işaret eder. Bir değişkendeki değişiklikler diğer değişkenden görülebilir. Sınıflar, diziler, temsilciler ve dizeler başvuru türleridir.

Aşağıdaki örnekte fark gösterilmektedir. İlk blok, bir değer türü olan kayıt yapısının Coords tanımını gösterir. İkinci blok, değer türleri ve başvuru türleri için farklı davranışı gösterir.

public readonly record struct Coords(int X, int Y);
// Value type: each variable holds its own copy
var point1 = new Coords(3, 4);
var point2 = point1;
Console.WriteLine($"point1: ({point1.X}, {point1.Y})");
Console.WriteLine($"point2: ({point2.X}, {point2.Y})");
// point1 and point2 are independent copies

// Reference type: both variables refer to the same object
var list1 = new List<int> { 1, 2, 3 };
var list2 = list1;
list2.Add(4);
Console.WriteLine($"list1 count: {list1.Count}"); // 4 — same object

Tüm türler sonunda System.Object'den türetilir. Değer türleri System.ValueType'den türetilir, bu da object'den türetilmiştir. Bu birleşik hiyerarşi Ortak Tür Sistemi (CTS) olarak adlandırılır. Devralma hakkında daha fazla bilgi için bkz . Devralma.

Hangi türü seçmek istediğinizi belirleyin

Yeni bir tür tanımladığınızda, seçtiğiniz tür kodunuzun nasıl davranacağını şekillendirir. İlk kararı vermek için aşağıdaki yönergeleri kullanın:

  • Tuple — Adlandırılmış tür veya davranış gerektirmeyen, değerlerin geçici olarak gruplandırılması.
  • struct veya record struct — Küçük veriler (kabaca 64 bayt veya daha az), değer semantiği veya değişmezlik. Kayıt yapıları değer tabanlı eşitlik ve with ifadeler ekler.
  • record class — Temelde veri, değere dayalı eşitlik ToString ve yıkıcı olmayan mutasyon ile. Devralmayı destekler.
  • class — Karmaşık davranış, polimorfizm veya değiştirilebilir durum. Çoğu özel tür sınıflardır.
  • interface — İlişkili olmayan türlerin uygulayabileceği bir sözleşme. Kimlik yerine özellikleri tanımlar.
  • enum — Durum kodları veya seçenekler gibi sabit bir adlandırılmış sabit kümesi.

Birden fazla seçenek genellikle makuldür.

Derleme zamanı türü ve çalışma zamanı türü

Bir değişkenin derleme zamanında ve çalışma zamanında farklı türleri olabilir. Derleme zamanı türü, kaynak kodunda bildirilen veya çıkarım yapılan türdür. Çalışma zamanı türü, değişkenin başvurduğu örneğin gerçek türüdür. Çalışma zamanı türü, derleme zamanı türüyle veya ondan türetilen veya bunu uygulayan bir türle aynı olmalıdır. Atama yalnızca kimlik, başvuru, kutulama veya sayısal dönüştürme gibi çalışma zamanı türünden derleme zamanı türüne örtük bir dönüştürme mevcut olduğunda geçerlidir.

// Compile-time and run-time types match:
string message = "Hello, world!";

// Compile-time type differs from run-time type:
object boxed = "This is a string at run time";
IEnumerable<char> characters = "abcdefghijklmnopqrstuvwxyz";

Yukarıdaki örnekte, boxed derleme zamanı türüne object , ancak çalışma zamanı türüne stringsahiptir. Görev, object'den türetildiği için string çalışır. Benzer şekilde, characters derleme zamanı türüne IEnumerable<char>sahiptir ve bu arabirimi uyguladığından string atama çalışır. Derleme zamanı türü aşırı yükleme çözümlemesini ve kullanılabilir dönüştürmeleri denetler. Çalışma zamanı türü sanal yöntem gönderimini, is ifadelerini ve switch ifadelerini denetler.

Ayrıca bakınız

C# dil belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# söz dizimi ve kullanımı için kesin kaynaktır.