Aracılığıyla paylaş


Türler (C# Programlama Kılavuzu)

Türler, Değişkenler ve Değerler

C# türü kesin olarak belirlenmiş dildir.Bir değere değerlenen her ifadenin sahip olduğu gibi, her değişken ve sabit de bir türe sahiptir.Her yöntem imzası, her giriş parametresi ve dönüş değeri için bir tür belirler..NET Framework sınıf kitaplığı bir yerleşik sayısal tür kümesinin yanı sıra dosya sistemi, ağ bağlantıları, nesne koleksiyonları ve dizileri ve tarihler gibi çok çeşitli mantıksal yapıları temsil eden daha karmaşık türleri de tanımlar.Tipik bir C# programı sınıf kitaplığından alınan türleri kullanırken aynı zamanda programın sorun etki alanına özgü kavramları modelleyen kullanıcı tanımlı türlerden de kullanır.

Bir tür içinde depolanan bilgiler aşağıdakileri içerebilir:

  • Bir tür değişkeninin gerektirdiği depolama alanı.

  • Temsil edebileceği maksimum ve minimum değerler.

  • İçerdiği üyeler (yöntemler, alanlar, etkinlikler ve benzerleri).

  • Devraldığı taban türü.

  • Değişkenler için belleğin konumu çalışma zamanında atanacaktır.

  • İzin verilen işlem türleri.

Derleyici, kodunuzda gerçekleştirilen tüm işlemlerin tür güvenli olduğundan emin olmak için tür bilgisini kullanır.Örneğin, int türünde bir değişken bildirirseniz derleyici, toplama ve çıkarma işlemlerinde değişkeni kullanmanıza olanak tanır.bool türünde bir değişkende aynı işlemleri gerçekleştirmeyi denerseniz derleyici, aşağıdaki örnekte gönderilene benzer bir hata oluşturur:

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;

[!NOT]

C ve C++ geliştiricileri; C#'de bool, int öğesine dönüştürülebilir değildir.

Derleyiciye tür bilgisini yürütülebilir dosyaya meta veri olarak gömer.Ortak dil çalışma zamanı (CLR) bellek ayırırken ve geri kazanırken daha fazla tür güvenliği sağlamak için bu meta verileri çalışma zamanında kullanır.

Değişken Bildirimlerinde Türleri Belirtme

Bir programda değişken veya sabit bildirdiğinizde türünü belirtmeniz veya var anahtar sözcüğünü kullanarak derleyicinin türü almasını sağlamanız gerekir.Aşağıdaki örnek, hem yerleşik sayısal türler hem de kullanıcı tanımlı karmaşık türler kullanan bazı değişken bildirimlerini gösterir:

// Declaration only: 
float temperature;
string name;
MyClass myClass;

// Declaration with initializers (four examples): 
char firstLetter = 'C';
var limit = 3;
int[] source = { 0, 1, 2, 3, 4, 5 };
var query = from item in source
            where item <= limit
            select item;

Yöntem parametrelerinin ve dönüş değerlerinin türleri, yöntem imzasında belirtilir.Aşağıdaki imza, giriş bağımsız değişkeni olarak int gerektiren ve dize döndüren bir yöntemi gösterir.

public string GetName(int ID)
{
    if (ID < names.Length)
        return names[ID];
    else 
        return String.Empty;
}
private string[] names = { "Spencer", "Sally", "Doug" };

Bir değişken bildirildikten sonra yeni bir türle yeniden bildirilemez ve bildirilen türle uyumlu olmayan bir değer atanamaz.Örneğin, int öğesini bildirip bunu true olan bir Boolean değerine atayamazsınız.Ancak, değerler örneğin yeni değişkenlere eklendiklerinde veya yöntem bağımsız değişkenleri olarak geçtiklerinde diğer türlere dönüştürülebilir.Veri kaybına neden olmayan tür dönüşümü derleyici tarafından otomatik olarak gerçekleştirilir.Veri kaybına neden olabilecek bir dönüştürme kaynak kodda atama gerektirir.

Daha fazla bilgi için bkz. Atama ve Tür Dönüşümleri (C# Programlama Kılavuzu).

Yerleşik Türleri

C#; tamsayılar, kayan nokta değerleri, Boolean ifadeleri, metin karakterleri, ondalık değerler ve diğer veri türlerini temsil etmek üzere standart bir yerleşik sayısal türler kümesi sağlar.Ayrıca yerleşik string ve object türleri de vardır.Bunları dilediğiniz C# programında kullanabilirsiniz.Yerleşik türler hakkında daha fazla bilgi için bkz. Türler için Başvuru Tabloları (C# Başvurusu).

Özel Türler

Kendi özel türlerinizi oluşturmak için struct, class, interface ve enum yapılarını kullanırsınız..NET Framework sınıf kitaplığının kendisi, uygulamalarınızda kullanabileceğiniz Microsoft tarafından sağlanan bir özel türler koleksiyonudur.Varsayılan olarak, sınıf kitaplığında en sık kullanılan türler, herhangi bir C# programında kullanıma hazırdır.Diğerleri yalnızca tanımlandıkları derlemeye açıkça bir proje başvurusu eklediğinizde kullanılabilir duruma gelir.Derleyici, bir derleme başvurusuna sahip olduktan sonra kaynak koddaki söz konusu derlemede belirtilen türlerin değişkenlerini (ve sabitlerini) bildirebilirsiniz.Daha fazla bilgi için bkz. .NET Framework Sınıf Kitaplığı.

Ortak Tür Sistemi

.NET Framework içindeki tür sisteminde iki temel noktanın anlaşılması önemlidir:

  • Devralma ilkesini destekler.Türler, temel türler olarak adlandırılan diğer türlerden türetilebilir.Türetilmiş tür taban türün yöntemlerini, özelliklerini ve diğer üyelerini (bazı sınırlamalarla birlikte) devralır.Taban türü başka bir türden türetilmiş olabilir; bu durumda türetilmiş tür devralma hiyerarşisinde her iki taban türün üyelerini devralır.Yerleşik sayısal türler dahil, Int32 (C# anahtar sözcük: int) gibi türlerin tümü, nihayetinde Object (C# anahtar sözcük: nesne) olan tek bir taban türünden türetilir.Bu birleşik tür hiyerarşisine Ortak Tür Sistemi (CTS) denir.C# içinde devralma hakkında daha fazla bilgi için bkz. Devralma (C# Programlama Kılavuzu).

  • CTS'deki her tür; değer türü veya başvuru türü olarak tanımlanır.Bu, .NET Framework sınıf kitaplığındaki ve kullanıcı tanımlı türlerinizdeki tüm özel türleri içerir.struct anahtar sözcüğünü kullanarak tanımladığınız türler değer türleridir ve tüm yerleşik sayısal türler structs türündedir.class anahtar sözcüğünü kullanarak tanımladığınız türler, başvuru türleridir.Başvuru türleri ve değer türlerinin derleme zamanı kuralları ve çalışma zamanı davranışları farklıdır.

Aşağıdaki çizim, CTS'deki değer türleri ve referans türleri arasındaki ilişkiyi gösterir.

CTS içindeki değer türleri ve başvuru türleri

Değer Türleri ve Başvuru Türleri

[!NOT]

Sık kullanılan türlerinin tümünün System ad alanında olduğunu görebilirsiniz.Ancak türü içeren ad alanının değer türü veya başvuru türü olmasıyla bir ilgisi yoktur.

Değer Türleri

Değer türleri ValueType kaynağından türetilir, o da Object kaynağından türetilir.ValueType kaynağından türetilen türler CLR içinde özel davranışa sahiptir.Değer türü değişkenler doğrudan değerlerini içerir, yani değişken hangi bağlamda bildirilirse bildirilsin, bellek satır içi atanır.Değer türlü değişkenler için ayrı yığın atama veya çöp toplama taşması yoktur.

İki değer türü kategorisi vardır: struct ve enum.

Yerleşik sayısal türler yapı birimleridir ve erişebileceğiniz özelliklere ve yöntemlere sahiptirler:

// Static method on type Byte.
byte b = Byte.MaxValue;

Ancak bunlara basit, toplama olmayan türlermiş gibi yaklaşarak, değerler bildirir ve atarsınız:

byte num = 0xA;
int i = 5;
char c = 'Z';

Değer türleri sealed, yani örnek olarak Int32 içinden bir tür türetemezsiniz ve bir yapı yalnızca ValueType kaynağından devralabileceğinden bir kullanıcı tanımlı sınıf veya yapıdan devralacak bir yapı tanımlayamazsınız.Ancak bir yapı birimi bir veya daha fazla arabirim uygulayabilir.Bir yapı türünü bir arabirim türüne dönüştürebilirsiniz; bu durumda yapıyı yönetilen yığında bir başvuru türü nesnesi içine sarmak için kutulama işlemi gerçekleştirilir.Kutulama işlemleri; bir değer türünü, girdi parametresi olarak bir Object öğesini alan bir yönteme geçirdiğinizde meydana gelir.Daha fazla bilgi için bkz. Kutulama ve Kutudan Çıkarma (C# Programlama Kılavuzu).

Kendi özel değer türlerinizi oluşturmak için struct anahtar sözcüğünü kullanırsınız.Genelde bir yapı aşağıdaki örnekte gösterildiği gibi küçük bir ilişkili değişken kümesi için kapsayıcı olarak kullanılır:

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Yapılar hakkında daha fazla bilgi için bkz. Yapılar (C# Programlama Kılavuzu)..NET Framework içindeki değer türleri hakkında daha fazla bilgi için bkz. Ortak Tür Sistemi.

Değer türlerinin diğer kategorisi enum'dur.Bir numaralandırma, adlandırılmış tam sayı sabitler kümesini tanımlar.Örneğin, .NET Framework sınıf kitaplığındaki FileMode numaralandırması bir dosyanın nasıl açılacağını belirten adlandırılmış sabit tamsayı seti içerir.Aşağıdaki örnekte gösterildiği gibi tanımlanmıştır:

public enum FileMode
{
    CreateNew = 1,
    Create = 2,
    Open = 3,
    OpenOrCreate = 4,
    Truncate = 5,
    Append = 6,
}

System.IO.FileMode.Create sabitinin değeri 2'dir.Ancak ad, kaynak kodu okuyanlar için daha anlamlı olur ve bu nedenle sabit ve değişmez sayılar yerine numaralandırmalar kullanılması daha uygundur.Daha fazla bilgi için bkz. FileMode.

Tüm numaralandırmalar, ValueTypeişlevinden devralan Enum işlevinden devralır.Yapı birimleri için geçerli olan tüm kurallar numaralandırmalar için de geçerlidir.Numaralandırmalar hakkında daha fazla bilgi için bkz. Numaralandırma Türleri (C# Programlama Kılavuzu).

Başvuru Türleri

sınıf, temsilci, dizi veya arabirim olarak tanımlanan tür, başvuru türüolarak nitelendirilir.Çalışma zamanında, bir başvuru türündeki değişkeni bildirdiğinizde, siz yeni işlecini kullanarak açıkça nesnenin bir örneğini oluşturana veya new, as shown in the following example: kullanarak başka bir yerde oluşturulmuş nesneyi atayana kadar, değişken null değerini içerir.

MyClass mc = new MyClass();
MyClass mc2 = mc;

Bir arabirim, kendisini uygulayan bir sınıf nesnesiyle birlikte başlatılmalıdır.MyClass, IMyInterface uygularsa aşağıdaki örnekte gösterildiği şekilde bir IMyInterface örneği oluşturursunuz:

IMyInterface iface = new MyClass();

Nesne oluşturulduğunda bellek yönetilen yığında ayrılır ve değişken yalnızca nesne konumu için bir başvuru içerir.Yönetilen yığındaki türler için hem atandığında hem de CLR'nin otomatik bellek yönetimi işlevinin gerektirdiği zamanda yük gerekir, buna çöp toplama adı verilir.Ancak çöp toplama yüksek oranda en iyi duruma getirilmiştir ve çoğu senaryoda bir performans sorununa neden olmaz.Çöp toplama hakkında daha fazla bilgi için bkz. Otomatik Bellek Yönetimi.

Öğeleri değer türleri olsa bile, tüm diziler başvuru türleridir.Diziler dolaylı olarak Array sınıfından türer, ancak bunları, aşağıdaki örnekte gösterildiği gibi, C# tarafından sağlanan basitleştirilmiş sözdizimi ile bildirir ve kullanırsınız:

// Declare and initialize an array of integers. 
int[] nums = { 1, 2, 3, 4, 5 };

// Access an instance property of System.Array. 
int len = nums.Length;

Başvuru türleri devralmayı tam olarak destekler.Bir sınıf oluşturduğunuz zaman, sealed olarak tanımlanmamış herhangi bir arabirim veya sınıftan devralabilirsiniz ve diğer sınıflar, sizin sınıfınızdan miras alabilir ve sanal yöntemlerinizi geçersiz kılabilir.Kendi sınıflarınızı nasıl oluşturabileceğiniz hakkında daha fazla bilgi için bkz. Sınıflar ve Yapılar (C# Programlama Kılavuzu).Devralma ve sanal yöntemler hakkında daha fazla bilgi için bkz. Devralma (C# Programlama Kılavuzu).

Değişmez Değer Türleri

C# dilinde değişmez değerler, derleyiciden bir tür alır.Bir sayının arkasına harf ekleyerek sayısal değişmez değerin nasıl yazılacağını belirtebilirsiniz.Örneğin, 4.56 değerinin kaydırma olarak ele alınması için sayıdan sonra "f" veya "F" ekleyin: 4.56f.Hiçbir harf eklenmediyse derleyici değişmez değer için bir tür gösterir.Harf sonekleri olarak belirtilebilen türler hakkında daha fazla bilgi için Değer Türleri (C# Başvurusu) içindeki her bir türe ilişkin başvuru sayfalarına bakın.

Sabit değerler türlere sahip olduğu ve tüm türler nihai olarak Object öğesinden türediğinden, aşağıdaki şekilde kod yazabilir ve derleyebilirsiniz:

string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);

Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);

Genel Türler

Tür; türün bir örneği oluşturulduğunda istemci kodunun sağlayacağı gerçek değer için (somut tür) bir yer tutucu olarak sağlanan bir veya daha fazla tür parametreleri ile bildirilebilir.Bu türler genel türler olarak adlandırılırlar.Örneğin, List .NET Framework türü, kural olarak T adı verilen bir türde parametreye sahiptir.Bir türün örneğini oluşturduğunuzda dize gibi listesinin içereceği nesne türlerini belirtirsiniz:

List<string> strings = new List<string>();

Tür parametresinin kullanımı, aynı sınıfın her bir öğeyi nesne halinde dönüştürmeden her türlü öğenin barındırılmasını sağlar.Derleyici koleksiyonun öğelerinin belirli bir türünü bildiğinden ve derleme sırasında örneğin, önceki örnekte strings nesnesine bir tam sayı eklemeyi denediğinizde olduğu gibi, bir hata ortaya çıkabileceğinden genel koleksiyon sınıflarına kesin olarak belirtilmiş koleksiyonlar denir.Daha fazla bilgi için bkz. Genel Türler (C# Programlama Kılavuzu).

Örtülü Türler, Anonim Türler ve Boş Değer Atanabilir Türler

Daha önce belirtildiği gibi, bir yerel değişkeni (sınıf üyeleri olmamak kaydıyla) var anahtar sözcüğünü kullanarak örtülü olarak yazabilirsiniz.Değişken derleme zamanında tür almaya devam eder ancak tür, derleyici tarafından sağlanır.Daha fazla bilgi için bkz. Örtülü Olarak Yazılan Yerel Değişkenler (C# Programlama Kılavuzu).

Bazı durumlarda, yöntem sınırlarının dışında depolamayı veya bu sınırların dışına geçirmeyi amaçlamadığınız ilgili değer kümeleri için adlandırılmış bir tür oluşturmanız uygun olmaz.Bu amaç için anonim türler oluşturabilirsiniz.Daha fazla bilgi için bkz. Anonim Türler (C# Programlama Kılavuzu).

Sıradan değer türleri null değerine sahip olamaz.Ancak türden sonra bir ? ekleyerek null olabilen değer türleri oluşturabilirsiniz.Örneğin, int? bir int türüdür ve null değerini alabilir.CTS içinde boş değer atanabilir türler genel yapı türünün Nullable örnekleridir.Null olabilecek türler özellikle sayısal değerlerin boş olabileceği verileri veritabanlarına veya veritabanlarından taşırken kullanışlıdır.Daha fazla bilgi için bkz. Boş Değer Atanabilir Türler (C# Programlama Kılavuzu).

İlgili Bölümler

Daha fazla bilgi için aşağıdaki konulara bakın:

C# Dil Belirtimi

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

Ayrıca bkz.

Başvuru

Tam Sayı Türleri Tablosu (C# Başvurusu)

Kavramlar

C# Programlama Kılavuzu

Conversion of XML Data Types

Diğer Kaynaklar

C# Başvurusu