C# dili turu

C# ("See Sharp" olarak okunur), modern, nesne odaklı ve türe uygun bir programlama dilidir. C#, geliştiricilerin .NET'te çalıştıran birçok tür güvenli ve sağlam uygulama oluşturmalarına olanak sağlar. C# dilinin kökleri C dil ailesindedir ve C, C++, Java ve JavaScript programcılarına hemen tanıdık gelecektir. Bu tur, C# 8 ve önceki sürümlerde dilin ana bileşenlerine genel bir bakış sağlar. Dili etkileşimli örneklerle keşfetmek için C# öğreticilerini incelemeyi deneyin.

C# nesne odaklı, bileşen odaklı bir programlama dilidir. C# bu kavramları doğrudan desteklemek için dil yapıları sağlar ve bu da C# dilini yazılım bileşenlerinin oluşturularak kullanıla bir doğal dil olması sağlar. C# kaynağından bu yana yeni iş yüklerini ve yeni ortaya çıkan yazılım tasarımı uygulamalarını desteklemek için özellikler eklemektedir. C# temel olarak nesne odaklı bir dildir . Türleri ve bunların davranışlarını siz tanımlarsiniz.

Çeşitli C# özellikleri sağlam ve dayanıklı uygulamalar oluşturmanıza yardımcı olur. Atık toplama , erişilemez durumdaki nesneler tarafından kapladığı belleği otomatik olarak geri verir. Null değere sahip türler, ayrılan nesnelere başvurul olmayan değişkenlere karşı koruma sağlar. Özel durum işleme, hata algılama ve kurtarma için yapılandırılmış ve genişletilebilir bir yaklaşım sağlar. Lambda ifadeleri işlevsel programlama tekniklerini destekler. Language Integrated Query (LINQ) söz dizimi, herhangi bir kaynaktan gelen verilerle çalışmak için ortak bir desen oluşturur. Zaman uyumsuz işlemler için dil desteği, dağıtılmış sistemler için söz dizimi sağlar. C# birleşik bir tür sistemine sahiptir. ve gibi ilkel türler de dahil olmak üzere tüm int C# türleri doubletek bir kök türünden devralınabilir object . Tüm türler bir dizi ortak işlem paylaşır. Herhangi bir türe sahip değerler tutarlı bir şekilde depolanmış, taşımalı ve üzerinde işletilebilir. Ayrıca, C# hem kullanıcı tanımlı başvuru türlerini hem de değertürlerini destekler. C#, nesnelerin dinamik olarak ayırmaya ve basit yapıların satır içinde depolanmasına olanak sağlar. C#, daha fazla tür güvenliği ve performansı sağlayan genel yöntemleri ve türleri destekler. C#, koleksiyon sınıflarını uygulayanların istemci kodu için özel davranışlar tanımlamalarını sağlayan bir yenidenlayıcı sağlar.

C#, programların ve kitaplıkların zaman içinde uyumlu bir şekilde gelişene kadar devam etmek için sürüm geliştirmeyi vurgular. C# tasarımının virtualoverride sürümle ilgili önemli noktalardan doğrudan etkileniyor olan yönleri ayrı ve değiştiriciler, yöntem aşırı yükleme çözümlemesi kuralları ve açık arabirim üyesi bildirimleri için destek içerir.

.NET mimarisi

C# programları .NET üzerinde, ortak dil çalışma zamanı (CLR) adlı bir sanal yürütme sistemi ve bir sınıf kitaplıkları kümesi üzerinde çalışır. CLR, microsoft tarafından uluslararası bir standart olan ortak dil altyapısının (CLI) uygulanmasıdır. CLI, dillerin ve kitaplıkların birlikte sorunsuz bir şekilde birlikte çalışıp çalışmalarına izin verilemayacak yürütme ve geliştirme ortamları oluşturmanın temelini oluşturuyor.

C# dilinde yazılan kaynak kodu, CLI belirtimine uygun bir ara dil (IL) olarak derlenmiş. IL kodu ve bit eşlemler ve dizeler gibi kaynaklar genellikle bir derlemede depolanır ve genellikle bir .dll. Derleme, derlemenin türleri, sürümü ve kültürü hakkında bilgi sağlayan bir bildirim içerir.

C# programı yürütülürken derleme CLR'ye yüklenir. CLR, IL kodunu yerel makine yönergelerine dönüştürmek için Tam Zamanında (JIT) derleme gerçekleştirir. CLR otomatik çöp toplama, özel durum işleme ve kaynak yönetimi ile ilgili diğer hizmetleri sağlar. CLR tarafından yürütülen kodlar bazen "yönetilen kod" olarak adlandırılır. "Unmanaged code", belirli bir platformu hedef alan yerel makine diline derlenmiş.

Dil birlikte çalışabilirliği, .NET'in önemli bir özelliğidir. C# derleyicisi tarafından üretilen IL kodu Ortak Tür Belirtimine (CTS) uygun. C# ile oluşturulan IL kodu, F#, Visual Basic, C++ .NET sürümlerinden oluşturulan kodla etkileşime olabilir. 20'den fazla CTS uyumlu dil daha vardır. Tek bir derleme, farklı .NET dillerinde yazılmış birden çok modül içerebilir. Türler aynı dilde yazılmış gibi birbirine başvurur.

.NET, çalışma zamanı hizmetlerine ek olarak kapsamlı kitaplıklar da içerir. Bu kitaplıklar birçok farklı iş yükünü destekler. Bunlar çok çeşitli yararlı işlevler sağlayan ad alanları olarak düzenlenmiştir. Kitaplıklar, dosya girişi ve çıkışından dize işlemeye, XML ayrıştırmaya, web uygulaması çerçevelerine ve Windows Forms denetimlerini içerir. Tipik C# uygulaması yaygın "su işleri" işlerini işlemek için .NET sınıf kitaplığını yaygın olarak kullanır.

.NET hakkında daha fazla bilgi için bkz. .NET'e Genel Bakış.

Merhaba dünya

"Hello, World" programı geleneksel olarak bir programlama dilini tanıtmak için kullanılır. Burada C# içindedir:

using System;

class Hello
{
    static void Main()
    {
        Console.WriteLine("Hello, World");
    }
}

"Hello, World" programı ad alanına başvurulan using bir yönergeyle System başlar. Ad alanları, C# programlarını ve kitaplıklarını düzenlemek için hiyerarşik bir hizmet sağlar. Ad alanları türleri ve diğer ad alanlarını içerir; örneğin ad alanı, SystemConsole programda başvurulan sınıf gibi bir dizi tür ve ve gibi diğer ad alanlarını IO içerir Collections. Verilen using ad alanına başvurulan bir yönerge, bu ad alanının üyesi olan türlerin tam olmayan kullanımını sağlar. yönergesi using nedeniyle, program için shorthand Console.WriteLine olarak kullanabilir System.Console.WriteLine.

Hello"Hello, World" programı tarafından bildirilen sınıfın adlı tek bir üyesi vardırMain. yöntemi Main değiştiricisi ile static bildirildi. Örnek yöntemleri anahtar sözcüğünü kullanarak belirli bir kapsayan thisnesne örneğine başvurarken, statik yöntemler belirli bir nesneye başvuru olmadan çalışır. Kural gereği, adlı statik bir yöntem Main C# programının giriş noktası olarak görev gösterir.

Programın çıktısı, ad alanı içinde WriteLine sınıfının yöntemi Console tarafından System üretir. Bu sınıf, varsayılan olarak derleyici tarafından otomatik olarak başvurulan standart sınıf kitaplıkları tarafından sağlanır.

Türler ve değişkenler

Tür , C# içinde herhangi bir verinin yapısını ve davranışını tanımlar. Bir türün bildirimi üyelerini, temel türünü, uygulayan arabirimleri ve bu tür için izin verilen işlemleri içerebilir. Değişken , belirli bir tür örneğine başvuran bir etikettir.

C# içinde iki tür türü vardır: değer türleri vebaşvuru türleri. Değer türlerinin değişkenleri doğrudan verilerini içerir. Başvuru türlerinin değişkenleri, verilerine yapılan başvuruları depolar; ikincisi nesne olarak bilinir. Başvuru türleriyle, iki değişkenin aynı nesneye başvurarak bir değişkendeki işlemlerin diğer değişken tarafından başvurulan nesneyi etkilemesi mümkündür. Değer türleriyle, değişkenlerin her birinin kendi veri kopyası vardır ve birteki işlemlerin birbirini etkilemesi mümkün değildir ( refout ve parametre değişkenleri hariç).

Tanımlayıcı bir değişken adıdır. Tanımlayıcı, boşluk olmadan unicode karakter dizisidir. Tanımlayıcı, ön eke sahipse C# ayrılmış sözcüğü olabilir @. Tanımlayıcı olarak ayrılmış bir sözcük kullanmak, diğer dillerle etkileşimde bulunmak için yararlı olabilir.

C# değerinin değer türleri basit türlere ,enum türlerine , yapı türlerine, null değer türlerine ve tuple değer türlerine bölündü. C# başvuru türleri sınıf türlerine, arabirim türlerine, dizi türlerine ve temsilcitürlerine daha fazla bölündü.

Aşağıdaki ana hat, C#'nin tür sistemine genel bir bakış sağlar.

C# programları, yeni türler oluşturmak için tür bildirimlerini kullanır. Tür bildirimi, yeni türün adını ve üyelerini belirtir. C# kategorisinin altı türü kullanıcı tarafından tanımlanabilir: sınıf türleri, yapı türleri, arabirim türleri, enum türleri, temsilci türleri ve tuple değer türleri. Ayrıca, veya record türlerini bildiresinizrecord structrecord class. Kayıt türlerinin derleyici sentezlenmiş üyeleri vardır. Kayıtları en az ilişkili davranışla değerleri depolamak için kullanırsınız.

  • Tür class , veri üyelerini (alanlar) ve işlev üyelerini (yöntemler, özellikler ve diğerleri) içeren bir veri yapısını tanımlar. Sınıf türleri tek devralmayı ve çok biçimliliği destekler; türetilmiş sınıfların temel sınıfları genişleterek ve özelleyebilinir mekanizmalar.
  • Tür struct , veri üyeleri ve işlev üyelerine sahip bir yapıyı temsil eden sınıf türüne benzer. Ancak, sınıfların aksine, yapılar değer türleridir ve genellikle yığın ayırma gerektirmez. Yapı türleri kullanıcı tarafından belirtilen devralmayı desteklemez ve tüm yapı türleri türünden örtülü olarak devralın.object
  • Tür interface , bir sözleşmeyi adlandırılmış ortak üye kümesi olarak tanımlar. uygulayan class veya, arabirimin interface üyelerinin uygulamalarını sağlay struct gerekir. Bir interface , birden çok temel arabirimden devralabilir ve bir veya class birden struct çok arabirim kullanabilir.
  • Tür delegate , belirli bir parametre listesi ve dönüş türüne sahip yöntemlere yapılan başvuruları temsil eder. Temsilciler, yöntemleri değişkenlere atanabilir ve parametre olarak geçirilen varlıklar olarak kabul edilebilir. Temsilciler, işlev dilleri tarafından sağlanan işlev türlerine benzer. Bunlar, diğer bazı dillerde bulunan işlev işaretçileri kavramına da benzer. İşlev işaretçileri aksine, temsilciler nesne odaklı ve tür güvenlidir.

, class, structinterfaceve türleridelegate, diğer türlerle parametreli hale getirildiklerinden tüm genel türleri destekler.

C# herhangi bir türde tek boyutlu ve çok boyutlu dizileri destekler. Yukarıda listelenen türlerin aksine, dizi türlerinin kullanılamadan önce bildirilene gerek yok. Bunun yerine, dizi türleri köşeli ayraç içeren bir tür adı takip tarafından oluşturulur. Örneğin, tek int[]intboyutlu bir dizisidir, intint[,]int[][] iki boyutlu bir dizisidir ve tek boyutlu dizilerden veya "jagged" dizisinin tek boyutlu bir dizisidirint.

Null değere sahip türler için ayrı bir tanım gerekli değildir. Null değere sahip olmayan her tür Tiçin, ek T?bir değere sahip olan karşılık gelen null değere değiştirilebilir bir tür vardır null. Örneğin, herhangi int? bir 32 bit nullstring? tamsayıyı veya değerini tuta bir tür ve herhangi birini veya değerini tutan string bir tür.null

C#'nin tür sistemi, herhangi bir türün değeri olarak kabul edilebilir şekilde birleştirilmiştir object. C# içinde her tür doğrudan veya dolaylı olarak object sınıf türünden türetir ve object tüm türlerin nihai temel sınıfıdır. Başvuru türlerinin değerleri, değerleri türünde görüntüılarak nesne olarak kabul edilir object. Değer türlerinin değerleri, kutulama ve kutudan açma işlemleri gerçekleştirereknesne olarak kabul edilir. Aşağıdaki örnekte, bir değer int değerine dönüştürülür ve object tekrar değerine dönüştürülür int.

int i = 123;
object o = i;    // Boxing
int j = (int)o;  // Unboxing

Bir başvuruya bir değer türü değeri atandığı zaman object , değeri tutmak için bir "kutu" ayrılır. Bu kutu bir başvuru türünün örneğidir ve değer bu kutuya kopyalanır. Buna karşılık, bir başvuru object bir değer türüne object türe göre başvurulan bir kutu olduğunu onaylar. Onay başarılı olursa, kutu içinde yer alan değer değer türüne kopyalanır.

C#'nin birleşik tür sistemi, değer türlerinin "isteğe bağlı" başvuru object olarak kabul edilen bir sistem olduğu anlamına gelir. Birleştirme nedeniyle, türünü kullanan objectobjectgenel amaçlı kitaplıklar, hem başvuru türleri hem de değer türleri dahil olmak üzere ' den türeten tüm türlerle kullanılabilir.

C# içinde alanlar , dizi öğeleri, yerel değişkenler ve parametreler gibi çeşitli değişken türleri vardır. Değişkenler depolama konumlarını temsil eder. Her değişkenin, aşağıda gösterildiği gibi değişkende depolanmış olan değerleri belirleyen bir türü vardır.

  • Null değere sahip olmayan değer türü
    • Tam türün değeri
  • Null değer değer türü
    • Tam null türe sahip bir değer veya değer
  • object
    • Başvuru null , herhangi bir başvuru türüne sahip bir nesneye başvuru veya herhangi bir değer türünün kutu değerli değerine başvuru
  • Sınıf türü
    • Bir null başvuru, bu sınıf türünün bir örneğine başvuru veya bu sınıf türünden türetilen bir sınıfın örneğine başvuru
  • Arabirim türü
    • Başvuru null , bu arabirim türünü uygulayan bir sınıf türünün örneğine başvuru veya bu arabirim türünü uygulayan bir değer türünün kutusal değerine başvuru
  • Dizi türü
    • Bir null başvuru, bu dizi türünün bir örneğine başvuru veya uyumlu bir dizi türünün örneğine başvuru
  • Temsilci türü
    • Uyumlu null bir temsilci türünün örneğine başvuru veya başvuru

Program yapısı

C# içinde temel kurumsal kavramlar programlar, ad alanları, türler, üyeler ve derlemelerdir. Programlar, üyeleri içeren ve ad alanları olarak düzenlen içeren türleri bildirmektedir. Sınıflar, yapılar ve arabirimler türlere örnektir. Alanlar, yöntemler, özellikler ve olaylar üyelerin örnekleridir. C# programları derlenmiş olduğunda, fiziksel olarak derlemeler içine paketlenmiş olur. Derlemeler, sırasıyla uygulama veya .exe.dllkitaplık uygulamalarına bağlı olarak genellikle .exeuzantısına veya 'ye sahiptir.

Küçük bir örnek olarak, aşağıdaki kodu içeren bir derlemeyi göz önünde bulundurabilirsiniz:

namespace Acme.Collections;

public class Stack<T>
{
    Entry _top;

    public void Push(T data)
    {
        _top = new Entry(_top, data);
    }

    public T Pop()
    {
        if (_top == null)
        {
            throw new InvalidOperationException();
        }
        T result = _top.Data;
        _top = _top.Next;

        return result;
    }

    class Entry
    {
        public Entry Next { get; set; }
        public T Data { get; set; }

        public Entry(Entry next, T data)
        {
            Next = next;
            Data = data;
        }
    }
}

Bu sınıfın tam adı olur Acme.Collections.Stack. sınıfı birkaç üye içerir: adlı bir alan _top, ve adlı iki yöntem PushPopve adlı iç içe geçmiş bir sınıf Entry. Sınıfı Entry daha fazla üç üye içerir: adlı bir özellik Next, adlı bir özellik ve Databir oluşturucu. , Stack genel bir Stack . Bir tür parametresi vardır ve T bu parametre kullanıldığında somut bir türle değiştirilir.

Yığın , "ilk gelen - son çıkar" (FILO) koleksiyonudur. Yığının en üstüne yeni öğeler eklenir. Bir öğe kaldırıldığı zaman, yığının üst kısmından kaldırılır. Önceki örnek, bir yığının Stack depolama alanını ve davranışını tanımlayan türü bildirmektedir. Bu işlevi kullanmak için türünün bir örneğine başvuran Stack bir değişken bildirsiniz.

Derlemeler, Ara Dil (IL) yönergeleri ve meta veriler şeklinde sembolik bilgiler şeklinde yürütülebilir kod içerir. Yürütülmeden önce, .NET Ortak Dil Çalışma Zamanı'nın Tam Zamanında (JIT) derleyicisi, derlemede IL kodunu işlemciye özgü koda dönüştürür.

Derleme hem kodu hem de meta verileri içeren kendini açıklayan bir işlev birimi olduğundan, #include C# içinde yönergelere ve üst bilgi dosyalarına gerek yoktur. Belirli bir derlemede yer alan ortak türler ve üyeler, yalnızca programı derlemek için bu derlemeye başvurarak bir C# programında kullanılabilir hale yapılır. Örneğin, bu program derlemeden Acme.Collections.Stack sınıfını acme.dll kullanır:

class Example
{
    public static void Main()
    {
        var s = new Acme.Collections.Stack<int>();
        s.Push(1); // stack contains 1
        s.Push(10); // stack contains 1, 10
        s.Push(100); // stack contains 1, 10, 100
        Console.WriteLine(s.Pop()); // stack contains 1, 10
        Console.WriteLine(s.Pop()); // stack contains 1
        Console.WriteLine(s.Pop()); // stack is empty
    }
}

Bu programı derlemek için önceki örnekte tanımlanan yığın sınıfını içeren derlemeye başvurabilirsiniz.

C# programları çeşitli kaynak dosyalarda depolanmış olabilir. Bir C# programı derlendiğinde, tüm kaynak dosyalar birlikte işlenir ve kaynak dosyalar birbirine ücretsiz olarak başvurur. Kavramsal olarak, tüm kaynak dosyalar işlenmeden önce tek bir büyük dosyada birlenmiş gibi olur. Birkaç özel durum dışında bildirim sırası önemsiz olduğundan, C# içinde hiçbir zaman ileri bildirim gerekmez. C# bir kaynak dosyayı yalnızca bir ortak türü bildirecek şekilde sınırlamaz ve kaynak dosyanın adının kaynak dosyada bildirilen bir türle eşleşmesi için gerekli değildir.

Bu turda yer alan diğer makalelerde bu kurumsal bloklar açıklayacak.