Yerleşik başvuru türleri (C# başvurusu)
C# birçok yerleşik başvuru türüne sahiptir. .NET kitaplığındaki bir tür için eş anlamlı olan anahtar sözcükleri veya işleçleri vardır.
Nesne türü
Türü object
, .NET'te için System.Object bir diğer addır. C# birleştirilmiş tür sisteminde, önceden tanımlanmış ve kullanıcı tanımlı tüm türler, başvuru türleri ve değer türleri, doğrudan veya dolaylı olarak öğesinden System.Objectdevralır. türünde değişkenlere herhangi bir türde object
değer atayabilirsiniz. Herhangi bir object
değişken, değişmez değeri null
kullanılarak varsayılan değerine atanabilir. Değer türünde bir değişken nesneye dönüştürüldüğünde kutulandığı söylenir. Tür object
değişkeni bir değer türüne dönüştürüldüğünde, bu değişkenin kutulanmamış olduğu söylenir. Daha fazla bilgi için bkz . Kutulama ve Kutu açma.
Dize türü
türü string
sıfır veya daha fazla Unicode karakterden oluşan bir diziyi temsil eder. string
, .NET'te için System.String bir diğer addır.
Bir başvuru türü olsa da string
, eşitlik işleçleri ==
ve !=
başvuruların değil nesnelerin değerlerini string
karşılaştırmak için tanımlanır. Değer tabanlı eşitlik, dize eşitliği testini daha sezgisel hale getirir. Örneğin:
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 a
aynı dize örneğine başvurmadığından, önceki örnekte "True" ve b
"False" görüntülenir.
+ işleci dizeleri birleştirir:
string a = "good " + "morning";
Yukarıdaki kod, "günaydın" ifadesini içeren bir dize nesnesi oluşturur.
Dizeler sabittir; bir dize nesnesinin içeriği nesne oluşturulduktan sonra değiştirilemez. Örneğin, bu kodu yazdığınızda, derleyici aslında yeni karakter dizisini tutmak için yeni bir dize nesnesi oluşturur ve bu yeni nesne öğesine b
atanır. Için ayrılan b
bellek ("h" dizesini içerdiğinde), atık toplama için uygundur.
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 şu konumdan 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 karakteri yinelemek için 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ğerleri
Dize değişmez değerleri türündedir string
ve ham, tırnak içine alınmış ve ayrıntılı olmak üzere üç biçimde yazılabilir.
Ham dize değişmez değerleri C# 11'de başlayarak kullanılabilir. Ham dize değişmez değerleri, kaçış dizileri gerektirmeden rastgele metinler içerebilir. Ham dize değişmez değerleri boşluk ve yeni satırlar, eklenmiş tırnak işaretleri ve diğer özel karakterleri içerebilir. Ham dize değişmez değerleri en az üç çift tırnak işareti (""") içine alınır:
"""
This is a multi-line
string literal with the second line indented.
"""
Hatta üç (veya daha fazla) çift tırnak karakteri içeren bir dizi de ekleyebilirsiniz. Metniniz ekli bir tırnak dizisi gerektiriyorsa, ham dize değişmez değerlerini gerektiği gibi daha fazla tırnak işaretiyle başlatıp sonlandırabilirsiniz:
"""""
This raw string literal has four """", count them: """" four!
embedded quote characters in a sequence. That's why it starts and ends
with five double quotes.
You could extend this example with as many embedded quotes as needed for your text.
"""""
Ham dize değişmez değerleri genellikle eklenen metinden ayrı satırlarda başlangıç ve bitiş tırnak dizilerine sahiptir. Çok satırlı ham dize değişmez değerleri, kendilerine alıntı yapılan dizeleri destekler:
var message = """
"This is a very important message."
""";
Console.WriteLine(message);
// output: "This is a very important message."
Başlangıç ve bitiş tırnak işaretleri ayrı satırlarda olduğunda, açılış teklifini izleyen ve bitiş tırnak işaretinden önceki yeni satırlar son içeriğe dahil değildir. Kapanış tırnak dizisi, dize değişmez değeri için en soldaki sütunu dikte eder. Ham dize değişmez değerlerini genel kod biçimiyle eşleşecek şekilde girintili yapabilirsiniz:
var message = """
"This is a very important message."
""";
Console.WriteLine(message);
// output: "This is a very important message."
// The leftmost whitespace is not part of the raw string literal
Bitiş tırnak dizisinin sağındaki sütunlar korunur. Bu davranış, aşağıdaki örnekte gösterildiği gibi JSON, YAML veya XML gibi veri biçimleri için ham dizeleri etkinleştirir:
var json= """
{
"prop": 0
}
""";
Metin satırlarından herhangi biri kapanış tırnak dizisinin soluna uzanırsa derleyici bir hata verir. Açma ve kapatma tırnak dizileri aynı satırda olabilir ve dize değişmez değeri bir tırnak karakteriyle başlamaz veya bitmez:
var shortText = """He said "hello!" this morning.""";
Çıkış dizesine tırnak karakterleri ve ayraçlar eklemek için ham dize değişmez değerlerini dize ilişkilendirmesiyle birleştirebilirsiniz.
Tırnak içine alınan dize değişmez değerleri çift tırnak içine alınır ("):
"good morning" // a string literal
Dize değişmez değerleri herhangi bir karakter değişmez değeri içerebilir. Kaçış dizileri dahil edilir. Aşağıdaki örnek, ters eğik çizgi, \u0066
f harfi ve \n
yeni satır için kaçış sırası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+dddd
Unicode karakterini temsil eder. Sekiz basamaklı Unicode kaçış kodları da tanınır: \Udddddddd
.
Düz metin dize değişmez değerleri ile @
başlar ve çift tırnak içine alınır. Örneğin:
@"good morning" // a string literal
Ayrıntılı dizelerin avantajı, kaçış dizilerinin işlenmemiş olmasıdır ve bu da yazmayı kolaylaştırır. Örneğin, aşağıdaki metin tam bir Windows dosya adıyla eşleşir:
@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"
@tırnak içine alınmış bir dizeye çift tırnak işareti eklemek için iki kez ekleyin:
@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
UTF-8 dize değişmez değerleri
.NET'teki dizeler UTF-16 kodlaması kullanılarak depolanır. UTF-8, Web protokolleri ve diğer önemli kitaplıklar için standarttır. C# 11'den başlayarak, UTF-8 kodlamasını u8
belirtmek için son eki bir dize değişmez değerine ekleyebilirsiniz. UTF-8 değişmez değerleri nesne olarak ReadOnlySpan<byte>
depolanır. UTF-8 dize değişmez değeri doğal türüdür ReadOnlySpan<byte>
. UTF-8 dize değişmez değeri kullanmak, aşağıdaki kodda gösterildiği gibi eşdeğerini System.ReadOnlySpan<T>bildirmekten daha net bir bildirim oluşturur:
ReadOnlySpan<byte> AuthWithTrailingSpace = new byte[] { 0x41, 0x55, 0x54, 0x48, 0x20 };
ReadOnlySpan<byte> AuthStringLiteral = "AUTH "u8;
UtF-8 dize değişmez değerini bir dizi olarak depolamak için, sabit değeri içeren baytları değiştirilebilir diziye kopyalamak için komutunun kullanılması ReadOnlySpan<T>.ToArray() gerekir:
byte[] AuthStringLiteral = "AUTH "u8.ToArray();
UTF-8 dize değişmez değerleri derleme zamanı sabitleri değildir; çalışma zamanı sabitleridir. Bu nedenle, isteğe bağlı bir parametre için varsayılan değer olarak kullanılamazlar. UTF-8 dize değişmez değerleri, dize ilişkilendirmesi ile birleştirilemiyor. Belirteci $
ve u8
son eki aynı dize ifadesinde kullanamazsınız.
Temsilci türü
Temsilci türünün bildirimi yöntem imzasına benzer. Bir dönüş değeri ve herhangi bir türde herhangi bir sayıda parametreye sahiptir:
public delegate void MessageDelegate(string message);
public delegate int AnotherDelegate(MyType m, long num);
.NET'te ve System.Func
türleri birçok System.Action
ortak temsilci için genel tanımlar sağlar. Büyük olasılıkla yeni özel temsilci türleri tanımlamanız gerekmez. Bunun yerine, sağlanan genel türlerin örneklemelerini oluşturabilirsiniz.
A delegate
, adlandırılmış veya anonim bir yöntemi kapsüllemek için kullanılabilecek bir başvuru türüdür. Temsilciler C++'taki işlev işaretçilerine benzer; ancak, temsilciler tür açısından güvenli ve güvenlidir. Temsilci uygulamaları için bkz . Temsilciler ve Genel Temsilciler. Temsilciler Olaylar için temel oluşturur. Bir temsilci, adlandırılmış veya anonim bir yöntemle ilişkilendirilerek örneklenebilir.
Temsilci, uyumlu bir dönüş türüne ve giriş parametrelerine sahip bir yöntem veya lambda ifadesiyle örneklenmelidir. Yöntem imzasında izin verilen varyans derecesi hakkında daha fazla bilgi için bkz . Temsilcilerde Varyans. Anonim yöntemlerle kullanmak için temsilci ve onunla ilişkilendirilecek kod birlikte bildirilir.
Çalışma zamanında dahil olan temsilci türleri değişken dönüştürme nedeniyle farklı olduğunda temsilci birleşimi veya kaldırma işlemi çalışma zamanı özel durumuyla başarısız olur. Aşağıdaki örnekte başarısız olan bir durum gösterilmektedir:
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 örnekte, bu geçici çözümün önceki örne nasıl uygulanabileceği gösterilmektedir.
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;
Benzer söz dizimi kullanan işlev işaretçileri bildirebilirsiniz. İşlev işaretçisi, bir temsilci türü örneği oluşturmak ve sanal Invoke
yöntemi çağırmak yerine yönergeyi kullanırcalli
.
Dinamik tür
türü, dynamic
değişkenin kullanımını ve üyelerine yapılan başvuruların derleme zamanı türü denetimini atladığını gösterir. Bunun yerine, bu işlemler çalışma zamanında çözümlenir. Türü, dynamic
Office Otomasyonu API'leri gibi COM API'lerine, IronPython kitaplıkları gibi dinamik API'lere ve HTML Belge Nesne Modeli'ne (DOM) erişimi basitleştirir.
Tür dynamic
çoğu durumda tür object
gibi davranır. Özellikle, null olmayan tüm ifadeler türüne dynamic
dönüştürülebilir. Türü, dynamic
tür dynamic
ifadeleri object
içeren işlemlerin çözümlenmediği veya türün derleyici tarafından denetlendiği durumlardan farklıdır. Derleyici, işlem hakkındaki bilgileri birlikte paketler ve bu bilgiler daha sonra çalışma zamanında işlemi değerlendirmek için kullanılır. İşlemin bir parçası olarak, türündeki dynamic
değişkenler türünde object
değişkenler halinde derlenir. Bu nedenle, tür dynamic
çalışma zamanında değil, yalnızca derleme zamanında var olur.
Aşağıdaki örnek, türünde bir değişken ile türündeki dynamic
object
bir değişkenin karşıtlığını oluşturur. 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
getirin. Aşağıdaki kodu IntelliSense'in kullanılabildiği bir düzenleyiciye kopyalayın. IntelliSense için dyn
dinamik ve nesnesi 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());
}
}
WriteLine deyimleri ve obj
çalışma zamanı türlerini dyn
görüntüler. Bu noktada her ikisi de tamsayı türündedir. Aşağıdaki çıktı üretilir:
System.Int32
System.Int32
derleme zamanında ve obj
arasındaki dyn
farkı görmek için, önceki örnekteki bildirimlerle WriteLine
deyimler arasına aşağıdaki iki satırı ekleyin.
dyn = dyn + 3;
obj = obj + 3;
İfadesinde bir tamsayı ve nesne obj + 3
ekleme girişimi için bir derleyici hatası bildirilir. Ancak için hata bildirilmemiştir dyn + 3
. içeren dyn
ifade, türü dyn
dynamic
olduğundan derleme zamanında denetlenmiyor.
Aşağıdaki örnek çeşitli bildirimlerde kullanır dynamic
. yöntemi, Main
derleme zamanı türü denetimini çalışma zamanı türü denetimiyle de karşıtlık eder.
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
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:
- §8.2.3 Nesne türü
- §8.2.4 Dinamik tür
- §8.2.5 Dize türü
- §8.2.8 Temsilci türleri
- C# 11 - Ham dize değişmez değerleri
- C# 11 - Ham dize değişmez değerleri
Ayrıca bkz.
- C# Anahtar Sözcükleri
- Etkinlikler
- Tür dinamiği kullanma
- Dizeleri Kullanmak için En İyi Uygulamalar
- Temel Dize İşlemleri
- Yeni Dizeler Oluşturma
- Tür testi ve atama işleçleri
- Desen eşleştirme ve ve olarak işleçlerini kullanarak güvenli bir şekilde atama
- İzlenecek yol: dinamik nesneler oluşturma ve kullanma
- System.Object
- System.String
- System.Dynamic.DynamicObject