Yerleşik başvuru türleri (C# başvurusu)

C# bir dizi yerleşik başvuru türüne sahip. .NET kitaplığında bir türün eş anlamlıları olan anahtar sözcüklere veya işleçlere sahipler.

Nesne türü

türü object , .NET'te için System.Object bir diğer addır. C# birleşik tür sisteminde, tüm türler, önceden tanımlanmış ve kullanıcı tanımlı, başvuru türleri ve değer türleri doğrudan veya dolaylı olarak 'den System.Object devralın. herhangi bir türün değerlerini türüne sahip değişkenlere object atleyebilirsiniz. Herhangi object bir değişken, değişmez değeri kullanılarak varsayılan değerine atanabilir. null Bir değer türünde bir değişken nesnesine dönüştür olduğunda, kutula olduğu kabul eder. türünde bir değişken object bir değer türüne dönüştür olduğunda, kutusunun açık olduğu kabulediliyor. Daha fazla bilgi için, bkz. Boxing ve Unboxing.

Dize türü

Tür, string sıfır veya daha fazla Unicode karakterden oluşur. string , System.String .NET'te için bir diğer addır.

Bir string başvuru türü olsa da, eşitlik == != işleçleri ve başvurular değil, nesnelerin değerlerini karşılaştırmak için string tanımlanır. Bu, dize eşitliği testinin daha sezgisel hale getirir. Örnek:

string a = "hello";
string b = "h";
// Append to contents of 'b'
b += "ello";
Console.WriteLine(a == b);
Console.WriteLine(object.ReferenceEquals(a, b));

Dizelerin içeriği eşdeğer olduğundan ve aynı dize örneğine başvurmayarak "True" ve ardından "False" a b görüntülenir.

+ işleci dizeleri birletir:

string a = "good " + "morning";

Bu, "good morning" içeren bir dize nesnesi oluşturur.

Dizeler sabittir; söz dizimi bunu gibi görünmesini sağlar ancak nesne oluşturulduktan sonra bir dize nesnesinin içeriği değiştirilemez. Örneğin, bu kodu yazarak, derleyici aslında yeni karakter dizisini tutmak için yeni bir dize nesnesi oluşturur ve bu yeni nesne'ye b atanır. için ayrılan bellek b ("h" dizesini içerdiği zaman) atık toplama için uygun olur.

string b = "h";
b += "ello";

[] işleci, bir dizenin tek tek karakterlerine salt okunur erişim için kullanılabilir. Geçerli dizin değerleri ile 0 başlar ve dizenin uzunluğundan küçük olmalıdır:

string str = "test";
char x = str[2];  // x = 's';

Benzer şekilde [] işleç, bir dizedeki her karakter üzerinde yinelerken de kullanılabilir:

string str = "test";

for (int i = 0; i < str.Length; i++)
{
  Console.Write(str[i] + " ");
}
// Output: t e s t

Dize değişmez değeri türündedir ve tırnak içine ve tırnak içine string alınarak iki @ şekilde yazıldığına göre. Tırnak içine alınmış dize sabitleri çift tırnak içine alınır ("):

"good morning"  // a string literal

Dize sabitleri herhangi bir karakter değişmez değeri içerebilir. Kaçış dizileri dahil edilir. Aşağıdaki örnek ters eğik çizgi için, f harfi için \\ ve yeni satır için kaçış dizisi \u0066 \n kullanır.

string a = "\\\u0066\n F";
Console.WriteLine(a);
// Output:
// \f
//  F

Not

Kaçış kodu \udddd (burada dddd dört basamaklı bir sayıdır) U+ Unicode karakterini temsil dddd eder. Sekiz basamaklı Unicode kaçış kodları da tanınır: \Udddddddd .

Tam dize sabitleri ile başlar @ ve çift tırnak içine alınır. Örnek:

@"good morning"  // a string literal

Tam dizelerin avantajı, kaçış dizilerinin işlenmez ve bu da tam dosya adı gibi bir Windows kolaylaştırır:

@"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"

Bir dizeye çift tırnak işareti eklemek @-quoted için iki katına çıkar:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.

Temsilci türü

Temsilci türünün bildirimi, yöntem imzalarına benzer. Bir dönüş değerine ve herhangi bir türde herhangi bir sayıda parametreye sahip:

public delegate void MessageDelegate(string message);
public delegate int AnotherDelegate(MyType m, long num);

.NET'te System.Action ve türleri birçok ortak temsilci için genel tanımlar System.Func sağlar. Büyük olasılıkla yeni özel temsilci türleri tanımlamanız gerekmz. Bunun yerine, sağlanan genel türlerin örneğini oluşturabilirsiniz.

, delegate adlandırılmış veya anonim bir yöntemi kapsüllemede kullanılan bir başvuru t t. Temsilciler, C++'daki işlev işaretçileri ile benzerdir; ancak, temsilciler tür için güvenli ve güvenlidir. Temsilci uygulamaları için bkz. Temsilciler ve Genel Temsilciler. Temsilciler, Olaylar için temeldir. Temsilcinin örneği, adlandırılmış veya anonim bir yöntemle birlikte başlatıcı olabilir.

Temsilcinin, uyumlu bir dönüş türü ve giriş parametreleri olan bir yöntem veya lambda ifadesiyle örneği gerekir. Yöntem imzasına izin verilen varyans derecesi hakkında daha fazla bilgi için bkz. Temsilcilerde Varyans. Anonim yöntemlerle kullanmak için, temsilci ve ilişkili kod birlikte bildirildi.

Çalışma zamanında katılan temsilci türleri değişken dönüştürmeden dolayı farklı olduğunda temsilci birleşimi ve kaldırma bir çalışma zamanı özel durumuyla başarısız olur. Aşağıdaki örnek, başarısız olan bir durumu gösteriyor:

Action<string> stringAction = str => {};
Action<object> objectAction = obj => {};
  
// Valid due to implicit reference conversion of
// objectAction to Action<string>, but may fail
// at run time.
Action<string> combination = stringAction + objectAction;

Yeni bir temsilci nesnesi oluşturarak doğru çalışma zamanı türüne sahip bir temsilci oluşturabilirsiniz. Aşağıdaki örnek, bu geçici çözümün önceki örnekte nasıl uygulana bir örnek olduğunu gösteriyor.

Action<string> stringAction = str => {};
Action<object> objectAction = obj => {};
  
// Creates a new delegate instance with a runtime type of Action<string>.
Action<string> wrappedObjectAction = new Action<string>(objectAction);

// The two Action<string> delegate instances can now be combined.
Action<string> combination = stringAction + wrappedObjectAction;

C# 9'dan başarak, benzer söz dizimi kullananişlev işaretçileri bildirebilirsiniz. İşlev işaretçisi, calli bir temsilci türü örneği oluşturmak ve sanal yöntemi çağırmak yerine yönergeyi Invoke kullanır.

Dinamik tür

türü, dynamic değişkenin kullanımının ve üyelerine yapılan başvuruların derleme zamanı tür denetlemesini atla olduğunu gösterir. Bunun yerine, bu işlemler çalışma zamanında çözümlenir. Türü, dynamic Office Automation API'leri gibi COM API'lerine, IronPython kitaplıkları gibi dinamik API'lere ve HTML api'lerine (DOM) Belge Nesne Modeli kolaylaştırır.

Tür, dynamic çoğu durumda tür gibi object davranır. Özellikle, null olmayan tüm ifadeler türe dynamic dönüştürülür. dynamicTürün, türünde object ifadeleri içeren işlemlerden farkı, derleyici tarafından dynamic denetlenen tür veya çözümlenemedi. Derleyici, işlemle ilgili bilgileri birlikte paketler ve bu bilgiler daha sonra çalışma zamanında işlemi değerlendirmek için kullanılır. Sürecin bir parçası olarak, türünde değişkenleri dynamic türünde değişkenlere derlenmiş object olur. Bu nedenle, dynamic tür çalışma zamanında değil, yalnızca derleme zamanında mevcuttur.

Aşağıdaki örnek türünde bir değişkeni türünde dynamic bir değişkenle karşıtlıklı olarak object gösterir. Derleme zamanında her değişkenin türünü doğrulamak için fare işaretçisini deyimlerin üzerine dyn veya obj üzerine WriteLine bırakın. Aşağıdaki kodu IntelliSense'in kullanılabilir olduğu bir düzenleyiciye kopyalayın. IntelliSense için dinamik ve dyn nesnesini obj gösterir.

class Program
{
    static void Main(string[] args)
    {
        dynamic dyn = 1;
        object obj = 1;

        // Rest the mouse pointer over dyn and obj to see their
        // types at compile time.
        System.Console.WriteLine(dyn.GetType());
        System.Console.WriteLine(obj.GetType());
    }
}

deyimleri WriteLine ve çalışma zamanı türlerini dyn obj görüntüler. Bu noktada her ikisi de aynı türde tamsayıya sahip. Aşağıdaki çıktı üretilir:

System.Int32
System.Int32

derleme zamanında ile arasındaki farkı görmek için, önceki örnekte bildirimleri ve deyimleri dyn arasına aşağıdaki iki satırı obj WriteLine ekleyin.

dyn = dyn + 3;
obj = obj + 3;

ifadesinde bir tamsayı ve nesne ekleme girişimi için bir derleyici hatası obj + 3 raporlandı. Ancak, için hiçbir hata dyn + 3 bildiriliyor. içeren dyn ifade, türü olduğundan derleme zamanında dyn dynamic denetlenir.

Aşağıdaki örnek, çeşitli dynamic bildirimlerde kullanır. yöntemi, Main derleme zamanı türü denetimi ile çalışma zamanı türü denetimi arasında da karşıtlık sağlar.

using System;

namespace DynamicExamples
{
    class Program
    {
        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));

            // The following line causes a compiler error because exampleMethod
            // takes only one argument.
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));

            // Because dynamic_ec is dynamic, the following call to exampleMethod
            // with two arguments does not produce an error at compile time.
            // However, it does cause a run-time error.
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }

    class ExampleClass
    {
        static dynamic field;
        dynamic prop { get; set; }

        public dynamic exampleMethod(dynamic d)
        {
            dynamic local = "Local variable";
            int two = 2;

            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
}
// Results:
// Local variable
// 2
// Local variable

Ayrıca bkz.