Üye erişim işleçleri ve ifadeleri (C# Başvurusu)Member access operators and expressions (C# reference)

Bir tür üyesine eriştiğinizde aşağıdaki işleçleri ve ifadeleri kullanabilirsiniz:You can use the following operators and expressions when you access a type member:

Üye erişim ifadesi.Member access expression .

.Aşağıdaki örneklerde gösterildiği gibi, belirteci, bir ad uzayı veya bir tür üyesine erişmek için kullanabilirsiniz:You use the . token to access a member of a namespace or a type, as the following examples demonstrate:

  • .Aşağıdaki bir using yönerge örneğinde gösterildiği gibi, bir ad alanı içinde iç içe geçmiş bir ad alanına erişmek için kullanın:Use . to access a nested namespace within a namespace, as the following example of a using directive shows:

    using System.Collections.Generic;
    
  • .Aşağıdaki kodun gösterdiği gibi, bir ad alanı içindeki bir türe erişmek üzere nitelenmiş bir ad oluşturmak için kullanın:Use . to form a qualified name to access a type within a namespace, as the following code shows:

    System.Collections.Generic.IEnumerable<int> numbers = new int[] { 1, 2, 3 };
    

    Nitelenmiş adların kullanımını isteğe bağlı yapmak için bir using yönergesi kullanın.Use a using directive to make the use of qualified names optional.

  • .Aşağıdaki kodda gösterildiği gibi, tür üyelerine, statik ve statik olmayan erişim için kullanın:Use . to access type members, static and non-static, as the following code shows:

    var constants = new List<double>();
    constants.Add(Math.PI);
    constants.Add(Math.E);
    Console.WriteLine($"{constants.Count} values to show:");
    Console.WriteLine(string.Join(", ", constants));
    // Output:
    // 2 values to show:
    // 3.14159265358979, 2.71828182845905
    

Ayrıca, . bir genişletme yöntemineerişmek için kullanabilirsiniz.You can also use . to access an extension method.

Indexer işleci []Indexer operator []

Köşeli parantezler, [] genellikle Array, Indexer veya pointer öğesi erişimi için kullanılır.Square brackets, [], are typically used for array, indexer, or pointer element access.

Dizi erişimiArray access

Aşağıdaki örnek, dizi öğelerine nasıl erişileceğini göstermektedir:The following example demonstrates how to access array elements:

int[] fib = new int[10];
fib[0] = fib[1] = 1;
for (int i = 2; i < fib.Length; i++)
{
    fib[i] = fib[i - 1] + fib[i - 2];
}
Console.WriteLine(fib[fib.Length - 1]);  // output: 55

double[,] matrix = new double[2,2];
matrix[0,0] = 1.0;
matrix[0,1] = 2.0;
matrix[1,0] = matrix[1,1] = 3.0;
var determinant = matrix[0,0] * matrix[1,1] - matrix[1,0] * matrix[0,1];
Console.WriteLine(determinant);  // output: -3

Bir dizi dizini, bir dizi karşılık gelen boyutun sınırları dışındaysa, bir oluşturulur IndexOutOfRangeException .If an array index is outside the bounds of the corresponding dimension of an array, an IndexOutOfRangeException is thrown.

Yukarıdaki örnekte gösterildiği gibi, bir dizi türü bildirdiğinizde veya bir dizi örneği örneklediğinizde köşeli parantezleri de kullanabilirsiniz.As the preceding example shows, you also use square brackets when you declare an array type or instantiate an array instance.

Diziler hakkında daha fazla bilgi için bkz. diziler.For more information about arrays, see Arrays.

Dizin Oluşturucu erişimiIndexer access

Aşağıdaki örnek, Dictionary<TKey,TValue> Dizin Oluşturucu erişimini göstermek için .NET türünü kullanır:The following example uses the .NET Dictionary<TKey,TValue> type to demonstrate indexer access:

var dict = new Dictionary<string, double>();
dict["one"] = 1;
dict["pi"] = Math.PI;
Console.WriteLine(dict["one"] + dict["pi"]);  // output: 4.14159265358979

Dizin oluşturucular, Kullanıcı tanımlı bir türün örneklerinin, dizi dizini oluşturma gibi benzer şekilde dizinlemesini sağlar.Indexers allow you to index instances of a user-defined type in the similar way as array indexing. Tamsayı olması gereken dizi dizinlerinin aksine, Dizin Oluşturucu parametreleri herhangi bir türde olacak şekilde bildirilmelidir.Unlike array indices, which must be integer, the indexer parameters can be declared to be of any type.

Dizin oluşturucular hakkında daha fazla bilgi için bkz. Dizin oluşturucular.For more information about indexers, see Indexers.

[] Diğer kullanımlarıOther usages of []

İşaretçi öğesi erişimi hakkında daha fazla bilgi için, işaretçi ilgili işleçler makalesinin işaretçi öğesi erişim işleci [] bölümüne bakın.For information about pointer element access, see the Pointer element access operator [] section of the Pointer related operators article.

Ayrıca, öznitelikleribelirtmek için köşeli parantezleri de kullanabilirsiniz:You also use square brackets to specify attributes:

[System.Diagnostics.Conditional("DEBUG")]
void TraceMethod() {}

Null koşullu işleçler?.Null-conditional operators ?. '? []and ?[]

C# 6 ve üzeri sürümlerde kullanılabilir, null koşullu bir operatör, member access ?. yalnızca o işlenen null olmayan olarak değerlendiriliyorsa işlenene bir üye erişimi, veya öğe erişimiuygular ?[] ; Aksi takdirde, döndürür null .Available in C# 6 and later, a null-conditional operator applies a member access, ?., or element access, ?[], operation to its operand only if that operand evaluates to non-null; otherwise, it returns null. YaniThat is,

  • aOlarak değerlendirilirse null , a?.x veya a?[x] olur null .If a evaluates to null, the result of a?.x or a?[x] is null.

  • aNull olmayan olarak değerlendirilirse, veya sonucu, a?.x sırasıyla veya sonucu ile a?[x] aynıdır a.x a[x] .If a evaluates to non-null, the result of a?.x or a?[x] is the same as the result of a.x or a[x], respectively.

    Not

    a.xYa da a[x] bir özel durum oluşturursa a?.x ya da a?[x] null olmayan bir özel durum oluşturur a .If a.x or a[x] throws an exception, a?.x or a?[x] would throw the same exception for non-null a. Örneğin, a null olmayan bir dizi örneğidir ve x sınırları dışındaysa a a?[x] bir oluşturur IndexOutOfRangeException .For example, if a is a non-null array instance and x is outside the bounds of a, a?[x] would throw an IndexOutOfRangeException.

Null koşullu işleçler kısa devre dışı.The null-conditional operators are short-circuiting. Diğer bir deyişle, bir koşullu üye veya öğe erişim işlemleri zincirindeki bir işlem dönerse null , zincir geri kalanı yürütülmez.That is, if one operation in a chain of conditional member or element access operations returns null, the rest of the chain doesn't execute. Aşağıdaki örnekte, B A olarak değerlendirilirse null ve C değerlendirmesi durumunda hesaplanmaz A B null :In the following example, B is not evaluated if A evaluates to null and C is not evaluated if A or B evaluates to null:

A?.B?.Do(C);
A?.B?[C];

Aşağıdaki örnek, ?. ve işleçlerinin kullanımını gösterir ?[] :The following example demonstrates the usage of the ?. and ?[] operators:

double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
{
    return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}

var sum1 = SumNumbers(null, 0);
Console.WriteLine(sum1);  // output: NaN

var numberSets = new List<double[]>
{
    new[] { 1.0, 2.0, 3.0 },
    null
};

var sum2 = SumNumbers(numberSets, 0);
Console.WriteLine(sum2);  // output: 6

var sum3 = SumNumbers(numberSets, 1);
Console.WriteLine(sum3);  // output: NaN

Yukarıdaki örnek, null-koşullu bir işlemin sonucu olarak değerlendirmek için alternatif bir ifade belirtmek üzere null birleşim işlecini ?? de kullanır null .The preceding example also uses the null-coalescing operator ?? to specify an alternative expression to evaluate in case the result of a null-conditional operation is null.

a.xYa da a[x] null yapılamayan bir değer türü ise T a?.x veya a?[x] buna karşılık gelen null atanabilir değer türüdür T? .If a.x or a[x] is of a non-nullable value type T, a?.x or a?[x] is of the corresponding nullable value type T?. Türünde bir ifadeye ihtiyacınız varsa T , ?? Aşağıdaki örnekte gösterildiği gibi null birleşim işlecini null koşullu ifadeye uygulayın:If you need an expression of type T, apply the null-coalescing operator ?? to a null-conditional expression, as the following example shows:

int GetSumOfFirstTwoOrDefault(int[] numbers)
{
    if ((numbers?.Length ?? 0) < 2)
    {
        return 0;
    }
    return numbers[0] + numbers[1];
}

Console.WriteLine(GetSumOfFirstTwoOrDefault(null));  // output: 0
Console.WriteLine(GetSumOfFirstTwoOrDefault(new int[0]));  // output: 0
Console.WriteLine(GetSumOfFirstTwoOrDefault(new[] { 3, 4, 5 }));  // output: 7

Önceki örnekte, işlecini kullanmıyorsanız, ?? numbers?.Length < 2 false ne zaman numbers olduğunu değerlendirir null .In the preceding example, if you don't use the ?? operator, numbers?.Length < 2 evaluates to false when numbers is null.

Null koşullu üye erişim işleci ?. ELVIS işleci olarak da bilinir.The null-conditional member access operator ?. is also known as the Elvis operator.

Not

C# 8 ' de, null-forverme işleci önceki null koşullu işlemlerin listesini sonlandırır.In C# 8, the null-forgiving operator terminates the list of preceding null-conditional operations. Örneğin, ifadesi x?.y!.z olarak ayrıştırılır (x?.y)!.z .For example, the expression x?.y!.z is parsed as (x?.y)!.z. Bu yorum nedeniyle,, z olsa bile değerlendirilir, bu da x null bir ile sonuçlanabilir NullReferenceException .Due to this interpretation, z is evaluated even if x is null, which may result in a NullReferenceException.

İş parçacığı açısından güvenli temsilci çağırmaThread-safe delegate invocation

?.Bir temsilcinin null olup olmadığını denetlemek ve iş parçacığı güvenli bir şekilde (örneğin, bir olayyükselttiğinizde) aşağıdaki kodun gösterdiği gibi, bir temsilciyi çağırmak için işlecini kullanın:Use the ?. operator to check if a delegate is non-null and invoke it in a thread-safe way (for example, when you raise an event), as the following code shows:

PropertyChanged?.Invoke(…)

Bu kod, C# 5 veya daha önceki bir sürümünde kullanacağınız aşağıdaki koda eşdeğerdir:That code is equivalent to the following code that you would use in C# 5 or earlier:

var handler = this.PropertyChanged;
if (handler != null)
{
    handler(…);
}

Bu, yalnızca null olmayan bir değer çağrılmasını sağlamak için iş parçacığı açısından güvenli bir yoldur handler .That is a thread-safe way to ensure that only a non-null handler is invoked. Temsilci örnekleri sabit olduğu için, hiçbir iş parçacığı yerel değişken tarafından başvurulan nesneyi değiştiremez handler .Because delegate instances are immutable, no thread can change the object referenced by the handler local variable. Özellikle, başka bir iş parçacığı tarafından yürütülen kod, olaydan aboneliği kaldırır PropertyChanged ve PropertyChanged null önce gelirse handler , tarafından başvurulan nesne handler etkilenmeden kalır.In particular, if the code executed by another thread unsubscribes from the PropertyChanged event and PropertyChanged becomes null before handler is invoked, the object referenced by handler remains unaffected. ?.İşleci sol taraftaki işlenenini birden çok kez değerlendirir ve null null olmayan olarak doğrulandıktan sonra olarak değiştirilemez.The ?. operator evaluates its left-hand operand no more than once, guaranteeing that it cannot be changed to null after being verified as non-null.

Çağırma ifadesi ()Invocation expression ()

()Bir yöntemi çağırmak veya bir temsilciyiçağırmak için parantezleri kullanın.Use parentheses, (), to call a method or invoke a delegate.

Aşağıdaki örnek, bağımsız değişkenler içeren veya olmayan bir yöntemin nasıl çağrılacağını gösterir ve bir temsilciyi çağırır:The following example demonstrates how to call a method, with or without arguments, and invoke a delegate:

Action<int> display = s => Console.WriteLine(s);

var numbers = new List<int>();
numbers.Add(10);
numbers.Add(17);
display(numbers.Count);   // output: 2

numbers.Clear();
display(numbers.Count);   // output: 0

İşleci ile bir Oluşturucu çağırdığınızda parantezleri de kullanabilirsiniz new .You also use parentheses when you invoke a constructor with the new operator.

() Diğer kullanımlarıOther usages of ()

Ayrıca, bir ifadede işlemlerin değerlendirileceği sırayı ayarlamak için parantez de kullanabilirsiniz.You also use parentheses to adjust the order in which to evaluate operations in an expression. Daha fazla bilgi için bkz. C# işleçleri.For more information, see C# operators.

Açık tür dönüştürmeleri gerçekleştiren atama ifadeleri, parantez de kullanır.Cast expressions, which perform explicit type conversions, also use parentheses.

Bitiş işlecinden Dizin ^Index from end operator ^

C# 8,0 ve üzeri sürümlerde kullanılabilen işleç, ^ öğe konumunun bir dizinin sonundan olduğunu gösterir.Available in C# 8.0 and later, the ^ operator indicates the element position from the end of a sequence. Bir uzunluk sırası için length , ^n length - n bir dizi başlangıcının sonuna kadar olan öğesine işaret eder.For a sequence of length length, ^n points to the element with offset length - n from the start of a sequence. Örneğin, ^1 bir sıranın son öğesine işaret eder ve ^length dizinin ilk öğesine işaret eder.For example, ^1 points to the last element of a sequence and ^length points to the first element of a sequence.

int[] xs = new[] { 0, 10, 20, 30, 40 };
int last = xs[^1];
Console.WriteLine(last);  // output: 40

var lines = new List<string> { "one", "two", "three", "four" };
string prelast = lines[^2];
Console.WriteLine(prelast);  // output: three

string word = "Twenty";
Index toFirst = ^word.Length;
char first = word[toFirst];
Console.WriteLine(first);  // output: T

Yukarıdaki örnekte gösterildiği gibi, ifadesi ^e System.Index türüdür.As the preceding example shows, expression ^e is of the System.Index type. İfadesinde ^e , sonucu e örtük olarak dönüştürülebilir olmalıdır int .In expression ^e, the result of e must be implicitly convertible to int.

Ayrıca ^ bir dizin aralığı oluşturmak için işleci Aralık işleciyle de kullanabilirsiniz.You can also use the ^ operator with the range operator to create a range of indices. Daha fazla bilgi için bkz. Dizinler ve aralıklar.For more information, see Indices and ranges.

Aralık işleci..Range operator ..

C# 8,0 ve üzeri sürümlerde kullanılabilen işleç, .. işlenen bir dizin aralığının başlangıcını ve sonunu belirtir.Available in C# 8.0 and later, the .. operator specifies the start and end of a range of indices as its operands. Sol işlenen bir aralığın kapsamlı bir başlangıcı olur.The left-hand operand is an inclusive start of a range. Sağ işlenen bir aralığın dışlamalı bir sonu.The right-hand operand is an exclusive end of a range. Her iki işlenen de, aşağıdaki örnekte gösterildiği gibi, bir sıranın başından veya sonundan bir dizin olabilir:Either of operands can be an index from the start or from the end of a sequence, as the following example shows:

int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int start = 1;
int amountToTake = 3;
int[] subset = numbers[start..(start + amountToTake)];
Display(subset);  // output: 10 20 30

int margin = 1;
int[] inner = numbers[margin..^margin];
Display(inner);  // output: 10 20 30 40

string line = "one two three";
int amountToTakeFromEnd = 5;
Range endIndices = ^amountToTakeFromEnd..^0;
string end = line[endIndices];
Console.WriteLine(end);  // output: three

void Display<T>(IEnumerable<T> xs) => Console.WriteLine(string.Join(" ", xs));

Yukarıdaki örnekte gösterildiği gibi, ifadesi a..b System.Range türüdür.As the preceding example shows, expression a..b is of the System.Range type. İfadesinde a..b , a ve sonuçları b örtülü olarak veya olarak dönüştürülebilir olmalıdır int Index .In expression a..b, the results of a and b must be implicitly convertible to int or Index.

..Açık uçlu bir Aralık almak için işlecin işlenenlerinden herhangi birini atlayabilirsiniz:You can omit any of the operands of the .. operator to obtain an open-ended range:

  • a..eşdeğerdira..^0a.. is equivalent to a..^0
  • ..beşdeğerdir0..b..b is equivalent to 0..b
  • ..eşdeğerdir0..^0.. is equivalent to 0..^0
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int amountToDrop = numbers.Length / 2;

int[] rightHalf = numbers[amountToDrop..];
Display(rightHalf);  // output: 30 40 50

int[] leftHalf = numbers[..^amountToDrop];
Display(leftHalf);  // output: 0 10 20

int[] all = numbers[..];
Display(all);  // output: 0 10 20 30 40 50

void Display<T>(IEnumerable<T> xs) => Console.WriteLine(string.Join(" ", xs));

Daha fazla bilgi için bkz. Dizinler ve aralıklar.For more information, see Indices and ranges.

Operatör overloadabilityOperator overloadability

.,, () ^ , Ve .. işleçleri aşırı yüklenemez.The ., (), ^, and .. operators cannot be overloaded. []İşleci, aşırı yüklenebilir olmayan bir işleç olarak kabul edilir.The [] operator is also considered a non-overloadable operator. Kullanıcı tanımlı türlerle Dizin oluşturmayı desteklemek için Dizin oluşturucular kullanın.Use indexers to support indexing with user-defined types.

C# dili belirtimiC# language specification

Daha fazla bilgi için C# dil belirtimininaşağıdaki bölümlerine bakın:For more information, see the following sections of the C# language specification:

Dizinler ve aralıklar hakkında daha fazla bilgi için bkz. özellik teklifi Note.For more information about indices and ranges, see the feature proposal note.

Ayrıca bkz.See also