Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tavsiye
Yazılım geliştirme konusunda yeni misiniz? İlk olarak Başlangıç öğreticileri ile başlayın. Kodunuzda basit değer türlerine ihtiyacınız olduğunda yapılarla karşılaşırsınız.
Başka bir dilde mi deneyimlisiniz? C# yapıları C++ veya Swift'teki yapılara benzer değer türleridir, ancak boxlandıklarında yönetilen yığında yaşarlar ve arabirimler, oluşturucular ve yöntemleri desteklerler. C#'ye özgü desenler için salt okunur yapılar bölümünü inceleyin. Kayıt yapıları için bkz. Kayıtlar.
Yapı, yığındaki bir nesneye başvuru yapmak yerine verilerini doğrudan örnekte tutan bir değer türüdür. Yeni bir değişkene bir yapı atadığınızda, çalışma zamanı tüm örneği kopyalar. Her değişken farklı bir örneği temsil ettiğinden, bir değişkende yapılan değişiklikler diğerini etkilemez. Birincil rolü modelleme davranışı yerine verileri depolayan küçük, basit türler için yapıları kullanın. Örnek olarak koordinatlar, renkler, ölçümler veya yapılandırma ayarları verilebilir.
Yapıların ne zaman kullanılacağı
Türünüz için bir struct kullanın:
- Tek bir değeri veya küçük bir ilişkili değer grubunu (kabaca 16 bayt veya daha az) temsil eder.
- Değer semantiğine sahiptir; aynı veriye sahip iki örnek eşit olmalıdır.
- Davranış modeli yerine öncelikli olarak bir veri kapsayıcısıdır.
- Temel türden devralma gerekmez (yapılar diğer yapılardan veya sınıflardan devralamaz, ancak arabirimleri uygulayabilir).
Sınıfları, kayıtları, tupları ve arabirimleri içeren daha geniş bir karşılaştırma için bkz. Hangi türü seçeceğiniz.
Bir yapı bildir
anahtar sözcüğüyle struct bir yapı tanımlayın. Yapı alanlar, özellikler, yöntemler ve oluşturucular içerebilir; aynı bir sınıf gibi:
struct Point
{
public double X { get; set; }
public double Y { get; set; }
public readonly double DistanceTo(Point other)
{
var dx = X - other.X;
var dy = Y - other.Y;
return Math.Sqrt(dx * dx + dy * dy);
}
public override string ToString() => $"({X}, {Y})";
}
Point yapısı iki değeri depolar ve iki double nokta arasındaki mesafeyi hesaplamak için bir yöntem sağlar.
DistanceTo yöntemi, yapının durumunu değiştirmediğinden işaretlenirreadonly. Bu desen salt okunur üyeler kapsamındadır.
Değer semantiği
Yapılar değer türleridir. Atama, verileri kopyalar; böylece her değişken kendi bağımsız kopyasına sahip olur.
var p1 = new Point { X = 3, Y = 4 };
var p2 = p1; // copies the data
p2.X = 10;
Console.WriteLine(p1); // (3, 4) — p1 is unchanged
Console.WriteLine(p2); // (10, 4) — only p2 was modified
Yapılar veri kapsayıcıları olduğundan, atama her veri üyesini yeni, bağımsız bir örneğe kopyalar. Her kopya ayrıdır. Birinin değiştirilmesi diğerini etkilemez. Bu davranış, atamanın yalnızca başvuruyu kopyaladığı ve her iki değişkenin de aynı nesneyi paylaştığı sınıflardan farklıdır. Ayrım hakkında daha fazla bilgi için bkz . Değer türleri ve başvuru türleri.
Yapı oluşturucuları
Yapılarda oluşturucuları sınıflarda yaptığınız gibi tanımlayabilirsiniz. Yapılar, özel varsayılan değerler ayarlayan parametresiz oluşturuculara sahip olabilir. "Parametresiz oluşturucu terimi, new kullanılarak oluşturulan ve oluşturucu mantığınızı çalıştıran bir örneği, ifadesiyle varsayılan olarak oluşturulan ve tüm alanları sıfır ile başlatılan default örnekten ayırır:"
struct ConnectionSettings
{
public string Host { get; set; }
public int Port { get; set; }
public int MaxRetries { get; set; }
public ConnectionSettings()
{
Host = "localhost";
Port = 8080;
MaxRetries = 3;
}
}
Bağımsız değişken olmadan new kullanıldığında parametresiz bir oluşturucu çalıştırılır. İfade oluşturucuyu default atlar ve tüm alanları varsayılan değerlerine (0, null, false) ayarlar. Farka dikkat edin:
var custom = new ConnectionSettings();
Console.WriteLine($"{custom.Host}:{custom.Port} (retries: {custom.MaxRetries})");
// localhost:8080 (retries: 3)
var defaults = default(ConnectionSettings);
Console.WriteLine($"{defaults.Host ?? "(null)"}:{defaults.Port} (retries: {defaults.MaxRetries})");
// (null):0 (retries: 0)
Derleyici, bir oluşturucuda açıkça ayarlamadığınız tüm alanları otomatik olarak başlatır. Yalnızca varsayılan olmayan değerlere ihtiyaç duyan alanları başlatabilirsiniz:
struct GameTile
{
public int Row { get; set; }
public int Column { get; set; }
public bool IsBlocked { get; set; }
public GameTile(int row, int column)
{
Row = row;
Column = column;
// IsBlocked is automatically initialized to false
}
}
Aşağıdaki örnekte için IsBlockedvarsayılan değer görüntülenir:
var tile = new GameTile(2, 5);
Console.WriteLine($"Tile ({tile.Row}, {tile.Column}), blocked: {tile.IsBlocked}");
// Tile (2, 5), blocked: False
IsBlocked Özelliği oluşturucuda atanmadığından, derleyici bunu false olarak ayarlar (için boolvarsayılan). Bu özellik, yalnızca birkaç alanı ayarlamak zorunda olan kurucularda gereksiz kodu azaltır.
Salt okunur yapılar ve salt okunur üyeler
Bir readonly struct , hiçbir örnek üyesinin yapının durumunu değiştirmediğini garanti eder. Derleyici, tüm alanların ve otomatik olarak uygulanan özelliklerin salt okunur olmasını zorunlu kılarak bu garantiyi uygular:
readonly struct Temperature
{
public double Celsius { get; }
public Temperature(double celsius) => Celsius = celsius;
public double Fahrenheit => Celsius * 9.0 / 5.0 + 32.0;
public override string ToString() => $"{Celsius:F1}°C ({Fahrenheit:F1}°F)";
}
Aşağıdaki örnek bir Temperature örnek oluşturur ve özelliklerini okur:
var temp = new Temperature(100);
Console.WriteLine(temp); // 100.0°C (212.0°F)
// temp.Celsius = 50; // Error: property is read-only
Yapının tamamının sabit olması gerekmiyorsa, bunun yerine tek tek üyeleri olarak readonly işaretleyin. Bir readonly üye yapının durumunu değiştiremez ve derleyici bu garantiyi doğrular:
struct Velocity
{
public double X
{
readonly get;
set;
}
public double Y
{
readonly get;
set;
}
public readonly double Speed => Math.Sqrt(X * X + Y * Y);
public readonly override string ToString() => $"({X}, {Y}) speed={Speed:F2}";
}
Aşağıdaki örnek, üyelerin readonly değiştirilebilir özellikler değiştiğinde güncelleştirilmiş değerler döndürdüğünü gösterir:
var v = new Velocity { X = 3, Y = 4 };
Console.WriteLine(v.Speed); // 5
Console.WriteLine(v); // (3, 4) speed=5.00
v.X = 6;
Console.WriteLine(v.Speed); // 7.211...
Üyeleri readonly işaretlemek, derleyicinin savunma kopyalarını iyileştirmesine yardımcı olur. Bir readonly parametreyi kabul in eden bir yönteme bir yapı geçirdiğinizde, derleyici kopya gerekmediğini bilir.