parametre değiştiricide (C# Başvurusu)
inAnahtar sözcüğü, bağımsız değişkenlerin başvuruya göre geçirilmesine neden olur, ancak bağımsız değişkenin değiştirilmediğinden emin olun. Bir değişken olması gereken, biçimsel parametreye bağımsız değişken için bir diğer ad oluşturur. Diğer bir deyişle, parametresindeki tüm işlemler bağımsız değişkende yapılır. Başvuru veya Çıkış anahtar kelimeleri gibidir, bu in bağımsız değişkenler çağrılan yöntem tarafından değiştirilemez. refBağımsız değişkenler değiştirilebilir, out bağımsız değişkenler çağrılan yöntemle değiştirilmelidir ve bu değişiklikler çağıran bağlamda Observable ' tır.
int readonlyArgument = 44;
InArgExample(readonlyArgument);
Console.WriteLine(readonlyArgument); // value is still 44
void InArgExample(in int number)
{
// Uncomment the following line to see error CS8331
//number = 19;
}
Yukarıdaki örnek, in değiştiricinin çağrı sitesinde genellikle gereksiz olduğunu gösterir. Yalnızca yöntem bildiriminde gereklidir.
Not
inAnahtar sözcüğü, tür parametresinin değişken karşıtı olduğunu, bir deyimin parçası olarak foreach veya bir join LINQ sorgusundaki yan tümcesinin bir parçası olarak belirtmek için genel bir tür parametresiyle de kullanılabilir. Bu bağlamlarda anahtar sözcüğünün kullanımı hakkında daha fazla bilgi için, in bkz. içindekitüm kullanımları için bağlantı sağlayan.
Bağımsız değişken olarak geçirilen değişkenlerin in bir yöntem çağrısında geçirilmeden önce başlatılması gerekir. Ancak çağrılan yöntem bir değer atayamayabilir veya bağımsız değişkeni değiştirebilir.
inParametre değiştiricisi C# 7,2 ve üzeri sürümlerde kullanılabilir. Önceki sürümlerde derleyici hatası CS8107 ("' ReadOnly başvuruları" özelliği C# 7,0 ' de kullanılamaz. Lütfen dil sürümü 7,2 veya üstünü kullanın. ") Derleyici dili sürümünü yapılandırmak için bkz. C# dil sürümünü seçme.
in, out Ve ref parametre değiştiricileri bir imzanın parçası olarak kabul edilse de, tek bir türde belirtilen Üyeler yalnızca ve ile imzasında farklı olamaz in ref out . Bu nedenle, tek fark bir yöntemin bir ref veya bağımsız değişken alırsa in ve diğeri bir bağımsız değişken alırsa Yöntemler aşırı yüklenemez out . Aşağıdaki kod, örneğin derlenmeyecektir:
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on in, ref and out".
public void SampleMethod(in int i) { }
public void SampleMethod(ref int i) { }
}
Varlığına göre aşırı yüklemeye in izin verilir:
class InOverloads
{
public void SampleMethod(in int i) { }
public void SampleMethod(int i) { }
}
Aşırı yükleme çözümleme kuralları
inBağımsız değişkenler için mosyon 'yı anlayarak değere ve bağımsız değişkenlerle ile yöntemler için aşırı yükleme çözümleme kurallarını anlayabilirsiniz in . Parametreleri kullanarak yöntemlerin tanımlanması in potansiyel bir performans iyileştirmesidir. Bazı struct tür bağımsız değişkenleri boyutu büyük olabilir ve Yöntemler sıkı Döngülerde veya kritik kod yollarında çağrıldığında, bu yapıları kopyalama maliyeti kritik öneme sahiptir. Yöntemler, bu in bağımsız değişkenin durumunu değiştirmediğinden bağımsız değişkenlerin başvuruya güvenli bir şekilde geçirilebileceğini belirtmek için parametreler bildirir. Bu bağımsız değişkenlerin başvuruya göre geçirilmesi, (potansiyel) pahalı kopyayı önler.
inÇağrı sitesinde bağımsız değişkenlerin belirtilmesi genellikle isteğe bağlıdır. Bağımsız değişkenleri değere göre geçirme ve değiştiricisini kullanarak başvuruya göre geçirme arasında herhangi bir semantik fark yoktur in . inBağımsız değişkenin değerinin değiştirilip değiştirilemeyeceğini belirtmeniz gerekmiyorsa, çağrı sitesindeki değiştirici isteğe bağlıdır. inBağımsız değişkenin değere göre değil başvuruya göre geçirildiğinden emin olmak için çağrı sitesine açıkça değiştiricisini eklersiniz. Açıkça kullanmak in aşağıdaki iki etkiye sahiptir:
İlk olarak, in çağıran sitede belirtme, derleyicinin eşleşen bir parametreyle tanımlanmış bir yöntemi seçmesini zorlar in . Aksi takdirde, iki yöntem yalnızca varlığı içinde farklılık gösteriyorsa in , bu değer aşırı yükleme daha iyi bir eşleşmedir.
İkincisi, belirtme, in bir bağımsız değişkeni başvuruya göre geçirme amacınızı bildirir. İle kullanılan bağımsız değişken, in doğrudan başvuruda bulunulabilir bir konumu temsil etmelidir. Ve bağımsız değişkenler için aynı genel kurallar out ref geçerlidir: sabitleri, olağan özellikleri veya değer üreten diğer ifadeleri kullanamazsınız. Aksi takdirde, in çağıran sitede atlama yöntemi derleyiciye bildirir ve bu, yönteme salt okuma başvurusu ile geçirilecek geçici bir değişken oluşturmasına izin verir. Derleyici, bağımsız değişkenlerle birkaç kısıtlamayı aşmak için geçici bir değişken oluşturur in :
- Geçici bir değişken, derleme zamanı sabitlerinin parametre olarak kullanılmasına izin verir
in. - Geçici bir değişken özellikler veya parametreler için diğer ifadelere izin verir
in. - Geçici bir değişken, bağımsız değişken türünden parametre türüne örtük bir dönüştürme olduğu bağımsız değişkenlere izin verir.
Önceki tüm örneklerde, derleyici sabit, özellik veya başka bir ifadenin değerini depolayan geçici bir değişken oluşturur.
Aşağıdaki kod bu kuralları gösterir:
static void Method(in int argument)
{
// implementation removed
}
Method(5); // OK, temporary variable created.
Method(5L); // CS1503: no implicit conversion from long to int
short s = 0;
Method(s); // OK, temporary int created with the value 0
Method(in s); // CS1503: cannot convert from in short to in int
int i = 42;
Method(i); // passed by readonly reference
Method(in i); // passed by readonly reference, explicitly using `in`
Şimdi, değer bağımsız değişkenlerine göre kullanılan başka bir yöntem bulunduğunu varsayalım. Sonuçlar aşağıdaki kodda gösterildiği gibi değişir:
static void Method(int argument)
{
// implementation removed
}
static void Method(in int argument)
{
// implementation removed
}
Method(5); // Calls overload passed by value
Method(5L); // CS1503: no implicit conversion from long to int
short s = 0;
Method(s); // Calls overload passed by value.
Method(in s); // CS1503: cannot convert from in short to in int
int i = 42;
Method(i); // Calls overload passed by value
Method(in i); // passed by readonly reference, explicitly using `in`
Bağımsız değişkenin başvuruya göre geçirildiği tek yöntem çağrısı son bir yöntemdir.
Not
Önceki kod int basitlik için bağımsız değişken türü olarak kullanılır. intÇoğu modern makinenin bir başvurusundan daha büyük olmadığından, tek tek bir int salt okunur başvuru olarak geçirilme avantajı yoktur.
Parametrelerle ilgili sınırlamalar in
in ref out Aşağıdaki tür yöntemler için, ve anahtar sözcüklerini kullanamazsınız:
- Zaman uyumsuz değiştirici kullanarak tanımladığınız zaman uyumsuz yöntemler.
- Bir yield return veya bildiri içeren Yineleyici yöntemleri
yield break. - Uzantı yönteminin ilk bağımsız değişkeni,
inBu bağımsız değişken bir struct olmadığı takdirde değiştiriciye sahip olamaz. - Bu bağımsız değişkenin genel bir tür olduğu bir genişletme yönteminin ilk bağımsız değişkeni (Bu tür bir struct gibi kısıtlanıyor olsa bile).
Değiştirici hakkında daha fazla bilgi edinmek için in , nasıl farklılık olduğunu ve bu makalenin ne kadar uyumlu olduğunu öğrenin ref out .
C# Dil Belirtimi
Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.