Türler ve üyeler

Nesne odaklı bir dil olarak C# kapsülleme, devralma ve çok biçimlilik kavramlarını destekler. Bir sınıf doğrudan bir üst sınıftan devralabilir ve herhangi bir sayıda arabirim gerçekleştirebilirsiniz. Bir üst sınıftaki sanal yöntemleri geçersiz kılma yöntemleri, yanlışlıkla yeniden tanımdan kaçınmanın bir yolu olarak override anahtar sözcüğünü gerektirir. C# içinde yapı basit bir sınıfa benzer; Bu, arabirimleri uygulayan ancak devralmayı desteklemeen yığın tarafından ayrılan bir tür. C# record class , amacı record struct öncelikli olarak veri değerlerini depolamak olan türleri ve türlerini sağlar.

Sınıflar ve nesneler

Sınıflar, C# türlerinin en temelleridir. Sınıf, durumu (alanları) ve eylemleri (yöntemler ve diğer işlev üyeleri) tek bir ünitede birleştiren bir veri yapısıdır. Bir sınıf, sınıfının örnekleri için nesne olarak da bilinen bir tanım sağlar. Sınıflar devralmayı ve çok biçimliliği destekler; türetilmiş sınıfların temel sınıfları genişleterek uzmanlaşmalarını sağlar.

Yeni sınıflar sınıf bildirimleri kullanılarak oluşturulur. Sınıf bildirimi bir üst bilgi ile başlar. Üst bilgi şunları belirtir:

  • Sınıfın öznitelikleri ve değiştiricileri
  • Sınıfın adı
  • Temel sınıf (bir temel sınıftan devralınıyorken)
  • sınıfı tarafından uygulanan arabirimler.

Üst bilgi, sınırlayıcılar ve arasında yazılan üye bildirimlerinin bir listesinden oluşan sınıf gövdesi tarafından { takip } ediliyor.

Aşağıdaki kod adlı basit bir sınıfın bildirimini Point gösterir:

public class Point
{
    public int X { get; }
    public int Y { get; }
    
    public Point(int x, int y) => (X, Y) = (x, y);
}

Sınıf örnekleri, yeni bir örnek için bellek ayıran, örneği başlatmak için bir oluşturucu çağıran ve örnek için bir başvuru döndüren new işleci kullanılarak oluşturulur. Aşağıdaki deyimler iki nesne Point oluşturur ve bu nesnelere yapılan başvuruları iki değişkende depolar:

var p1 = new Point(0, 0);
var p2 = new Point(10, 20);

Bir nesne tarafından kapladığı bellek, nesne artık erişilemez olduğunda otomatik olarak geri yüklenir. C# içinde nesnelerin açıkça taşınması gerekli veya mümkün değildir.

Tür parametreleri

Genel sınıflar tür parametrelerini tanımlar. Tür parametreleri, açılı ayraç içine alınmış tür parametre adlarının listesidir. Tür parametreleri sınıf adını takip eder. Tür parametreleri daha sonra sınıfın üyelerini tanımlamak için sınıf bildirimlerinin gövdesinde kullanılabilir. Aşağıdaki örnekte, ve tür Pair TFirst TSecond parametreleridir:

public class Pair<TFirst, TSecond>
{
    public TFirst First { get; }
    public TSecond Second { get; }
    
    public Pair(TFirst first, TSecond second) => 
        (First, Second) = (first, second);
}

Tür parametrelerini almak için bildirilen bir sınıf türü, genel sınıf türü olarak çağrılır. Yapı, arabirim ve temsilci türleri de genel olabilir. Genel sınıf kullanıldığında, tür parametrelerinin her biri için tür bağımsız değişkenleri sağlanmalıdır:

var pair = new Pair<int, string>(1, "two");
int i = pair.First;     //TFirst int
string s = pair.Second; //TSecond string

Yukarıda olduğu gibi sağlanan tür bağımsız değişkenleri olan genel Pair<int,string> türe, oluşturulmuş tür adı verilmektedir.

Temel sınıflar

Bir sınıf bildirimi bir temel sınıf belirterek. Sınıf adını ve tür parametrelerini iki nokta üst üste ve temel sınıfın adını takip edin. Temel sınıf belirtimlerini atlama, türünden türetmeyle object aynıdır. Aşağıdaki örnekte, temel sınıfı Point3D Point olur. İlk örnekte temel sınıfı Point şu object şekildedir:

public class Point3D : Point
{
    public int Z { get; set; }
    
    public Point3D(int x, int y, int z) : base(x, y)
    {
        Z = z;
    }
}

Bir sınıf, temel sınıfının üyelerini devralınır. Devralma, bir sınıfın temel sınıfının neredeyse tüm üyelerini örtülü olarak içerdiği anlamına gelir. Sınıf, örneği ve statik oluşturucuları ve sonlandırıcıyı devralmaz. Türetilmiş bir sınıf devralınmış olduğu üyelere yeni üyeler ekleyebilir, ancak devralınan üyenin tanımını kaldırabilir. Önceki örnekte, Point3D ve üyelerinden X Y devralınıyor Point ve her örnek üç özellik Point3D içerir: , ve X Y Z .

Bir sınıf türünden temel sınıf türlerinden herhangi biri için örtülü bir dönüştürme vardır. Sınıf türünde bir değişken, o sınıfın örneğine veya türetilmiş herhangi bir sınıfın örneğine başvurur. Örneğin, önceki sınıf bildirimlerini verilen, türünde bir değişken Point veya bir Point başvuru Point3D olabilir:

Point a = new(10, 20);
Point b = new Point3D(10, 20, 30);

Yapılar

Sınıflar devralmayı ve çok biçimliliği destekleyen türleri tanımlar. Türetilmiş sınıfların hiyerarşilerini temel alan gelişmiş davranışlar oluşturmanıza olanak sağlar. Buna karşılık yapı türleri, birincil amacı veri değerlerini depolamak olan daha basit türlerdir. Yapılar bir temel tür bildirene kadar; , 'den örtülü olarak System.ValueType türetir. Bir türden başka struct türler struct türeyyetmezsiniz. Bunlar örtülü olarak korumalıdır.

public struct Point
{
    public double X { get; }
    public double Y { get; }
    
    public Point(double x, double y) => (X, Y) = (x, y);
}

Arabirimler

Arabirim * _ sınıflar ve yapılar tarafından uygulanacak bir sözleşme tanımlar. Farklı türler _interface özellikleri tanımlamak için bir uygulama* tanımlamanız. Örneğin, arabirimi dizi gibi bir koleksiyondaki tüm öğeleri çapraz System.Collections.Generic.IEnumerable<T> geçiş yapmak için tutarlı bir yol tanımlar. Bir arabirim yöntemler, özellikler, olaylar ve dizinciler içerebilir. Arabirim genellikle tanımladığı üyelerin uygulamasını sağlamaz; yalnızca arabirimi uygulayan sınıflar veya yapılar tarafından sağlanmalıdır üyeleri belirtir.

Arabirimler birden çok devralmayı kullanabilir. Aşağıdaki örnekte, arabirimi hem hem IComboBox de 'den ITextBox IListBox devralıyor.

interface IControl
{
    void Paint();
}

interface ITextBox : IControl
{
    void SetText(string text);
}

interface IListBox : IControl
{
    void SetItems(string[] items);
}

interface IComboBox : ITextBox, IListBox { }

Sınıflar ve yapılar birden çok arabirim kullanabilir. Aşağıdaki örnekte, sınıfı hem EditBox hem de IControl 'i uygulayan bir IDataBound sınıftır.

interface IDataBound
{
    void Bind(Binder b);
}

public class EditBox : IControl, IDataBound
{
    public void Paint() { }
    public void Bind(Binder b) { }
}

Bir sınıf veya yapı belirli bir arabirimi uygulayan bir sınıf veya yapının örnekleri örtülü olarak bu arabirim türüne dönüştürülür. Örneğin:

EditBox editBox = new();
IControl control = editBox;
IDataBound dataBound = editBox;

Numaralandırmalar

Enum türü bir sabit değer kümesi tanımlar. Aşağıda, enum farklı kök kök kök kök köklerini tanımlayan sabitler bildirildi:

public enum SomeRootVegetable
{
    HorseRadish,
    Radish,
    Turnip
}

Birlikte bayrak olarak kullanılacak enum bir de tanımlayabilirsiniz. Aşağıdaki bildirim, dört mevsim için bir bayrak kümesi bildiriyor. Tüm mevsimleri içeren bir değer de dahil olmak üzere tüm All sezonlar uygulanabilir:

[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring
}

Aşağıdaki örnek, önceki her iki enum'un bildirimlerini gösterir:

var turnip = SomeRootVegetable.Turnip;

var spring = Seasons.Spring;
var startingOnEquinox = Seasons.Spring | Seasons.Autumn;
var theYear = Seasons.All;

Null atanabilir türler

Herhangi bir türün değişkenleri * null değersiz _ veya null değersiz olarak bildirilebilir. Null değere sahip bir değişken, değer null olmadığını belirten ek bir değer tutabilir. Null Değer Türleri (structs veya enums) ile temsil System.Nullable<T> edildi. Null değere sahip olmayan ve Null Değer Değere Edilebilir Başvuru türlerinin her ikisi de temel alınan başvuru türüyle temsil edilebilir. Ayrım, derleyici tarafından okunan meta veriler ve bazı kitaplıklarla temsil eder. Derleyici, önce değerlerine karşı denetlenmeden null değere değiştirilebilir başvurular başvurulmadan uyarılar null sağlar. Derleyici ayrıca null atanabilir olmayan başvurulara , olan bir değer atandığı zaman da uyarılar null sağlar. Aşağıdaki örnek null değere sahip bir int bildirerek bunu olarak başlatıyor. null Ardından değerini olarak 5 ayarlar. _* null değer atılabilir dizesi **ile aynı kavramı gösteriyor. Daha fazla bilgi için bkz. null değerlenebilir değer türleri ve null değere değiştirilebilir başvuru türleri.

int? optionalInt = default; 
optionalInt = 5;
string? optionalText = default;
optionalText = "Hello World.";

Demetler

C#, basit bir veri yapısındabirden çok veri öğelerini grup için kısa söz dizimi sağlayan veri kümelerini destekler. Aşağıdaki örnekte gösterildiği gibi ve arasındaki üyelerin türlerini ve adlarını bildirerek bir ( ) tuple örneği hazırlarsiniz:

(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
//Output:
//Sum of 3 elements is 4.5.

Uples, sonraki makalede açıklanan yapı taşlarını kullanmadan birden çok üyeye sahip veri yapısına alternatif sağlar.