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 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ürmede 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ği aynı başvuru türü örneğine erişebilir. 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 açık 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 değer türünün T
tüm değerlerini ve ek bir null değeri temsil eder. Null değer türü olmadığı sürece, değer türünün bir değişkenine atayamazsınız null
.
Tür parametresinin null atanamaz bir değer türü olduğunu belirtmek için kısıtlamasını 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:
- Tam sayı türleri
- Kayan nokta sayısal türleri
- Boole değerini temsil eden bool
- Unicode UTF-16 karakterini temsil eden karakter
Tüm basit türler yapı türleridir ve bazı ek işlemlere izin verdikleri diğer yapı türlerinden farklıdır:
Değişmez değerleri kullanarak basit türde bir değer sağlayabilirsiniz.
Örneğin,'A'
türünün değişmez değeri, türününchar
int
2001
değişmez değeridir ve12.34m
türünündecimal
değişmez değeridir.const anahtar sözcüğüyle basit türlerin sabitlerini bildirebilirsiniz.
Örneğin, tanımlayabilirsinizconst decimal = 12.34m
.
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: