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şvuran 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# bir _ birleşik tür sistemine sahiptir. * ve gibi ilkel türler de dahil olmak üzere tüm C# int türleri tek bir kök double türünden object devralınabilir. Tüm türler bir dizi ortak işlem paylaşır. Herhangi bir türde 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ğer tü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 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 virtual override için destek içerir.

.NET mimarisi

C# programları ortak dil çalışma zamanı (CLR) olarak adlandırılan bir sanal yürütme sistemi ve sınıf kitaplıkları kümesi olan .NET ü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 kod, belirli bir platformu hedef alan yerel makine diline derlenmiş "yönetilemeyen kod" yerine bazen "yönetilen kod" olarak adlandırılır.

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# dilinden oluşturulan IL kodu F#, Visual Basic, C++ veya diğer 20'den fazla CTS uyumlu dilin .NET sürümlerinden oluşturulan kodla etkileşime olabilir. Tek bir derleme, farklı .NET dillerinde yazılmış birden çok modül içerebilir ve 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. Dosya girişi ve çıkışından dize işlemeye, XML ayrıştırmaya, web uygulaması çerçevelerine ve Windows Forms denetimlerine kadar her şey için çok çeşitli yararlı işlevler sağlayan ad alanları olarak düzenlenmiştir. 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 using başvurulan 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ı, programda başvurulan sınıf gibi bir dizi tür ve ve gibi diğer ad System Console alanlarını IO Collections içerir. 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 Console.WriteLine shorthand olarak System.Console.WriteLine kullanabilir.

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

Programın çıktısı, ad alanı WriteLine içinde sınıfının Console yöntemi 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 ve baş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 (ve parametre ref out 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#'ın değer türleri basit türlere, enum türlerine, yapı türlerine, null değer türlerine ve tuple değer türlerine ayrılır. C#'ın başvuru türleri sınıf türlerine, arabirim türlerine, dizi türlerine ve temsilci türlerine ayrılır.

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.

  • 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 ettiği 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 object devralın.
  • Tür, interface bir sözleşmeyi adlandırılmış ortak üye kümesi olarak tanımlar. uygulayan class struct veya, interface arabirimin üyelerinin uygulamalarını sağlay gerekir. , interface birden çok temel arabirimden devralabilir ve bir veya birden çok arabirim class struct uygulamalı olabilir.
  • 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, struct , ve interface delegate türleri, 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 boyutlu bir dizisidir, iki boyutlu bir dizisidir ve tek boyutlu dizilerin veya int[] int int[,] int "jagged" dizisinin tek boyutlu int[][] bir int dizisidir.

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

C#'nin tür sistemi, herhangi bir türün değeri olarak kabul edilebilir şekilde object birleştirilmiştir. C# içinde her tür doğrudan veya dolaylı olarak sınıf türünden object 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 object edilir. Değer türlerinin değerleri, kutulama ve kutudan açma işlemleri gerçekleştirerek nesne olarak kabul edilir. Aşağıdaki örnekte bir int değere dönüştürülür ve object değerine geri int döner.

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

Bir başvuruya bir değer türü değeri atandığı object zaman, 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 bir değer türüne türe göre başvurulan bir kutu olduğunu object object 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 object "isteğe bağlı" başvuru olarak kabul edilen bir sistem olduğu anlamına gelir. Birleştirme nedeniyle, türünü kullanan genel amaçlı kitaplıklar, hem başvuru türleri hem de değer türleri dahil olmak üzere ' den türeten object object 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
  • Boş değere değer yazılabilir değer türü
    • Tam null türe sahip bir değer veya değer
  • object
    • Başvuru, herhangi bir başvuru türüne sahip bir nesneye başvuru veya herhangi bir değer türünün kutu değerli null değerine başvuru
  • Sınıf türü
    • Bir 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 null örneğine başvuru
  • Arabirim türü
    • Bir başvuru, 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 null 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 kuruluş kavramları programları * _, ad alanları, türleri, üyelerive derlemeleridir. 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 _* kitaplıkları ** uygulamalarına bağlı olarak genellikle dosya .exe .dll uzantısına veya 'ye sahiptir. **

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

using System;

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ı şu Acme.Collections.Stack şekildedir: . sınıfı birkaç üye içerir: adlı bir alan, ve adlı top iki yöntem ve adlı iç içe geçmiş bir Push Pop Entry sınıf. sınıfı Entry da üç üye içerir: adlı bir next alan, adlı bir alan ve data oluşturucu. Stack, genel bir sınıftır. Bir tür parametresi vardır T ve 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 Stack yığın için depolama ve davranışı 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, C# içinde yönergelere ve üst bilgi #include 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 Acme.Collections.Stack derlemeden sınıfını acme.dll kullanır:

using System;
using Acme.Collections;

class Example
{
    public static void Main()
    {
        var s = new 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ı birkaç kaynak dosyada 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.