Değer türleri (C# başvurusu)

Değer türleri ve başvuru türleri , C# türlerinin iki ana kategorisidir. Değer türündeki bir değişken, türün bir örneğini içerir. Bu, başvuru türünün bir örneğine başvuru içeren bir değişkenden farklıdır. Varsayılan olarak, atamada, bir bağımsız değişkeni bir yönteme geçirme ve yöntem sonucu döndürme, değişken değerleri kopyalanır. Değer türü değişkenleri söz konusu olduğunda, karşılık gelen tür örnekleri kopyalanır. Aşağıdaki örnekte bu davranış gösterilmektedir:

using System;

public struct MutablePoint
{
    public int X;
    public int Y;

    public MutablePoint(int x, int y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

public class Program
{
    public static void Main()
    {
        var p1 = new MutablePoint(1, 2);
        var p2 = p1;
        p2.Y = 200;
        Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified: {p1}");
        Console.WriteLine($"{nameof(p2)}: {p2}");

        MutateAndDisplay(p2);
        Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");
    }

    private static void MutateAndDisplay(MutablePoint p)
    {
        p.X = 100;
        Console.WriteLine($"Point mutated in a method: {p}");
    }
}
// Expected output:
// p1 after p2 is modified: (1, 2)
// p2: (1, 200)
// Point mutated in a method: (100, 200)
// p2 after passing to a method: (1, 200)

Yukarıdaki örnekte gösterildiği gibi, değer türü değişkenindeki işlemler yalnızca değişkende depolanan değer türünün örneğini etkiler.

Bir değer türü bir başvuru türünün veri üyesini içeriyorsa, bir değer türü örneği kopyalandığında yalnızca başvuru türü örneğine başvuru kopyalanır. Hem kopya hem de özgün değer türü örneğinin aynı başvuru türü örneğine erişimi vardır. Aşağıdaki örnekte bu davranış gösterilmektedir:

using System;
using System.Collections.Generic;

public struct TaggedInteger
{
    public int Number;
    private List<string> tags;

    public TaggedInteger(int n)
    {
        Number = n;
        tags = new List<string>();
    }

    public void AddTag(string tag) => tags.Add(tag);

    public override string ToString() => $"{Number} [{string.Join(", ", tags)}]";
}

public class Program
{
    public static void Main()
    {
        var n1 = new TaggedInteger(0);
        n1.AddTag("A");
        Console.WriteLine(n1);  // output: 0 [A]

        var n2 = n1;
        n2.Number = 7;
        n2.AddTag("B");

        Console.WriteLine(n1);  // output: 0 [A, B]
        Console.WriteLine(n2);  // output: 7 [A, B]
    }
}

Not

Kodunuzu daha az hataya eğilimli ve daha güçlü hale getirmek için sabit değer türlerini tanımlayın ve kullanın. Bu makalede, değiştirilebilir değer türleri yalnızca gösterim amacıyla kullanılır.

Değer türü türleri ve tür kısıtlamaları

Değer türü aşağıdaki iki türden biri olabilir:

  • verileri ve ilgili işlevleri kapsülleyen bir yapı türü
  • adlandırılmış sabitler kümesi tarafından tanımlanan ve bir seçimi veya seçim birleşimini temsil eden bir numaralandırma türü

Null atanabilir değer türüT?, temel alınan değer türünün T tüm değerlerini ve ek bir null değeri temsil eder. Boş değer atanabilir bir değer türü olmadığı sürece, değer türünde bir değişkene atayamazsınız null .

Tür parametresinin null atanamaz bir değer türü olduğunu belirtmek için kısıtlamayıstruct kullanabilirsiniz. Hem yapı hem de numaralandırma türleri kısıtlamayı karşılar struct . Tür parametresinin bir numaralandırma türü olduğunu belirtmek için temel sınıf kısıtlamasında (numaralandırma kısıtlaması olarak bilinir) kullanabilirsinizSystem.Enum.

Yerleşik değer türleri

C# basit türler olarak da bilinen aşağıdaki yerleşik değer türlerini sağlar:

Tüm basit türler yapı türleridir ve bazı ek işlemlere izin verdikleri için diğer yapı türlerinden farklıdır:

  • Basit türde bir değer sağlamak için değişmez değerleri kullanabilirsiniz. Örneğin, 'A' türünün char değişmez değeridir ve 2001 türünün intdeğişmez değeridir.

  • Const anahtar sözcüğüyle basit türlerin sabitlerini bildirebilirsiniz. Diğer yapı türlerinin sabitlerine sahip olmak mümkün değildir.

  • İşlenenlerin tümü basit türlerin sabitleri olan sabit ifadeler derleme zamanında değerlendirilir.

Değer tanımlama grubu bir değer türüdür, ancak basit bir tür değildir.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:

Ayrıca bkz.