Yapı türleri (C# başvurusu)Structure types (C# reference)

Yapı türü (veya yapı türü), verileri ve ilgili işlevselliği kapsülleyebilen bir değer türüdür.A structure type (or struct type) is a value type that can encapsulate data and related functionality. Bir yapı struct türünü tanımlamak için anahtar sözcüğü kullanırsınız:You use the struct keyword to define a structure type:

public struct Coords
{
    public Coords(double x, double y)
    {
        X = x;
        Y = y;
    }

    public double X { get; }
    public double Y { get; }

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

Yapı türleri değer semantikvar.Structure types have value semantics. Diğer bir zamanda, bir yapı türü değişkeni türünün bir örneğini içerir.That is, a variable of a structure type contains an instance of the type. Varsayılan olarak, değişken değerleri atamada kopyalanır, bir bağımsız değişkeni bir yönteme geçirilir ve yöntem sonucunu döndürür.By default, variable values are copied on assignment, passing an argument to a method, and returning a method result. Yapı türünde bir değişken olması durumunda, türün bir örneği kopyalanır.In the case of a structure-type variable, an instance of the type is copied. Daha fazla bilgi için Değer türlerinebakın.For more information, see Value types.

Genellikle, çok az veya hiç davranış sağlayan küçük veri merkezli türler tasarlamak için yapı türleri kullanırsınız.Typically, you use structure types to design small data-centric types that provide little or no behavior. Örneğin, .NET bir sayıyı (hem tamsayı hem de gerçek), Boolean değeri, Unicode karakterini,bir zaman örneğinitemsil etmek için yapı türlerini kullanır.For example, .NET uses structure types to represent a number (both integer and real), a Boolean value, a Unicode character, a time instance. Bir türün davranışına odaklanmışsanız, bir sınıftanımlamayı düşünün.If you're focused on the behavior of a type, consider defining a class. Sınıf türleri referans semantikvar.Class types have reference semantics. Diğer bir zamanda, sınıf türünden bir değişken, örneğin kendisi değil, tür örneğinin bir örneğine başvuruda bulunun.That is, a variable of a class type contains a reference to an instance of the type, not the instance itself.

Yapı türlerinin değer semantikleri olduğundan, değişmez yapı türlerini tanımlamanızı öneririz.Because structure types have value semantics, we recommend you to define immutable structure types.

readonlyYapıreadonly struct

C# 7.2 ile başlayarak, bir yapı türünün değişmez olduğunu bildirmek için readonly değiştirici kullanırsınız:Beginning with C# 7.2, you use the readonly modifier to declare that a structure type is immutable:

public readonly struct Coords
{
    public Coords(double x, double y)
    {
        X = x;
        Y = y;
    }

    public double X { get; }
    public double Y { get; }

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

Bir readonly yapının tüm veri üyeleri aşağıdaki gibi salt okunur olmalıdır:All data members of a readonly struct must be read-only as follows:

  • Herhangi bir alan bildirimi readonly değiştirici olmalıdırAny field declaration must have the readonly modifier
  • Otomatik olarak uygulananlar da dahil olmak üzere herhangi bir özellik yalnızca okunmalıdırAny property, including auto-implemented ones, must be read-only

Bu, bir readonly yapının hiçbir üyesinin yapının durumunu modiyi olmadığını garanti eder.That guarantees that no member of a readonly struct modifies the state of the struct.

Not

Bir readonly yapıda, mutable başvuru türündeki bir veri üyesi yine de kendi durumunu mutasyona uğrayabilir.In a readonly struct, a data member of a mutable reference type still can mutate its own state. Örneğin, bir List<T> örneği değiştiremezsiniz, ancak buna yeni öğeler ekleyebilirsiniz.For example, you can't replace a List<T> instance, but you can add new elements to it.

readonlyörnek üyelerreadonly instance members

C# 8.0 ile başlayarak, readonly bir örnek üyenin yapının durumunu değiştirmediğini bildirmek için değiştiriciyi de kullanabilirsiniz.Beginning with C# 8.0, you can also use the readonly modifier to declare that an instance member doesn't modify the state of a struct. Tüm yapı türünü readonly, yapının durumunu değiştirmeyen örnek üyeleri işaretlemek için readonly değiştiriyi kullanın.If you can't declare the whole structure type as readonly, use the readonly modifier to mark the instance members that don't modify the state of the struct. Bir readonly yapıda, her örnek üye readonlyörtülü olarak .In a readonly struct, every instance member is implicitly readonly.

Bir readonly örnek üyeiçinde, yapının örnek alanlarına atayamazsınız.Within a readonly instance member, you can't assign to structure's instance fields. Ancak, readonly bir üyereadonly üye olmayan bir araya gelebilir.However, a readonly member can call a non-readonly member. Bu durumda derleyici yapı örneğinin bir kopyasını oluşturur vereadonly bu kopyada üye olmayanı çağırır.In that case the compiler creates a copy of the structure instance and calls the non-readonly member on that copy. Sonuç olarak, özgün yapı örneği değiştirilmez.As a result, the original structure instance is not modified.

Genellikle, readonly değiştiriciaşağıdaki örnek üye türlerine uygularsınız:Typically, you apply the readonly modifier to the following kinds of instance members:

  • Yöntemler:methods:

    public readonly double Sum()
    {
        return X + Y;
    }
    

    readonly Ayrıca, aşağıdaki durumlarda System.Objectbildirilen yöntemleri geçersiz kılınan yöntemlere değiştirici uygulayabilirsiniz:You can also apply the readonly modifier to methods that override methods declared in System.Object:

    public readonly override string ToString() => $"({X}, {Y})";
    
  • özellikleri ve dizinleyiciler:properties and indexers:

    private int counter;
    public int Counter
    {
        readonly get => counter;
        set => counter = value;
    }
    

    readonly Değiştiriciyi bir mülkün veya dizinleyicinin her iki erişimine de uygulamanız gerekiyorsa, bunu özellik veya dizinleyicinin bildirimine uygulayın.If you need to apply the readonly modifier to both accessors of a property or indexer, apply it in the declaration of the property or indexer.

    Not

    Derleyici, bir get özellik bildiriminde readonly readonly değiştiricinin varlığından bağımsız olarak otomatik olarak uygulanan bir özelliğin erişimini bildirir.The compiler declares a get accessor of an auto-implemented property as readonly, regardless of presence of the readonly modifier in a property declaration.

readonly Değiştiriciyi bir yapı türünün statik üyelerine uygulayamazsınız.You can't apply the readonly modifier to static members of a structure type.

Derleyici, performans optimizasyonları readonly için değiştiriciden yararlanabilir.The compiler may make use of the readonly modifier for performance optimizations. Daha fazla bilgi için bkz: Güvenli ve verimli C# kodu yaz.For more information, see Write safe and efficient C# code.

Bir yapı türünün tasarımıile sınırlamalarLimitations with the design of a structure type

Bir yapı türü tasarlarken, aşağıdaki özel durumlar dışında, sınıf türüyle aynı özelliklere sahip olursunuz:When you design a structure type, you have the same capabilities as with a class type, with the following exceptions:

  • Parametresiz bir oluşturucu bildiremezsiniz.You can't declare a parameterless constructor. Her yapı türü zaten türün varsayılan değerini üreten örtülü parametresiz bir oluşturucu sağlar.Every structure type already provides an implicit parameterless constructor that produces the default value of the type.

  • Bir örnek alanını veya özelliği beyannamesinde başharfe ait olamazsınız.You can't initialize an instance field or property at its declaration. Ancak, bir statik veya const alanı veya statik bir özelliği bildiriminde başharfe döndürebilirsiniz.However, you can initialize a static or const field or a static property at its declaration.

  • Yapı türünden bir oluşturucu, türün tüm örnek alanlarını başlatmalıdır.A constructor of a structure type must initialize all instance fields of the type.

  • Yapı türü diğer sınıf veya yapı türünden devralamaz ve bir sınıfın temeli olamaz.A structure type can't inherit from other class or structure type and it can't be the base of a class. Ancak, bir yapı türü arabirimleriuygulayabilirsiniz.However, a structure type can implement interfaces.

  • Bir yapı türü içinde bir sonlandırıcı bildiremezsiniz.You can't declare a finalizer within a structure type.

Bir yapı türünün anındaInstantiation of a structure type

C#'da, kullanılmadan önce bildirilen bir değişkeni başlatmanız gerekir.In C#, you must initialize a declared variable before it can be used. Yapı türünde bir değişken null (nullable değer türündebir değişken olmadığı sürece) olamaz, ilgili türdeki bir örneği anında alamalısınız.Because a structure-type variable can't be null (unless it's a variable of a nullable value type), you must instantiate an instance of the corresponding type. Bunu yapmanın birkaç yolu vardır.There are several ways to do that.

Genellikle, new işleç ile uygun bir yapıcı çağırarak bir yapı türü anında.Typically, you instantiate a structure type by calling an appropriate constructor with the new operator. Her yapı türünde en az bir oluşturucu vardır.Every structure type has at least one constructor. Bu, türün varsayılan değerini üreten örtük bir parametresiz oluşturucu.That's an implicit parameterless constructor, which produces the default value of the type. Bir türün varsayılan değerini oluşturmak için varsayılan değer ifadesini de kullanabilirsiniz.You can also use a default value expression to produce the default value of a type.

Yapı türünün tüm örnek alanlarına erişilebilirse, new operatör olmadan da anında ekleyebilirsiniz.If all instance fields of a structure type are accessible, you can also instantiate it without the new operator. Bu durumda, örneğin ilk kullanımından önce tüm örnek alanları başlatmanız gerekir.In that case you must initialize all instance fields before the first use of the instance. Aşağıdaki örnek, bunun nasıl yapılacağını gösterir:The following example shows how to do that:

public static class StructWithoutNew
{
    public struct Coords
    {
        public double x;
        public double y;
    }

    public static void Main()
    {
        Coords p;
        p.x = 3;
        p.y = 4;
        Console.WriteLine($"({p.x}, {p.y})");  // output: (3, 4)
    }
}

Yerleşik değer türlerisöz konusu olduğunda, türün bir değerini belirtmek için karşılık gelen literals kullanın.In the case of the built-in value types, use the corresponding literals to specify a value of the type.

Yapı tipi değişkenleri referansa göre geçirmePassing structure-type variables by reference

Bir yapı türü değişkenini bağımsız değişken olarak bir yönteme geçtiğinde veya bir yöntemden yapı türü değeri döndürdüğünde, yapı türünün tüm örneği kopyalanır.When you pass a structure-type variable to a method as an argument or return a structure-type value from a method, the whole instance of a structure type is copied. Bu, büyük yapı türleri içeren yüksek performanslı senaryolarda kodunuzu performansını etkileyebilir.That can affect the performance of your code in high-performance scenarios that involve large structure types. Bir yapı türü değişkenini referans aylaaktararak değer kopyalamayı önleyebilirsiniz.You can avoid value copying by passing a structure-type variable by reference. Bir refbağımsız outdeğişkenin başvuru yla geçirilmesi gerektiğini belirtmek için , veya in yöntem parametre değiştiriciler kullanın.Use the ref, out, or in method parameter modifiers to indicate that an argument must be passed by reference. Referans bir yöntem sonucu döndürmek için ref döner kullanın.Use ref returns to return a method result by reference. Daha fazla bilgi için bkz: Güvenli ve verimli C# kodu yaz.For more information, see Write safe and efficient C# code.

refYapıref struct

C# 7.2 ile başlayarak, ref bir yapı türü bildiriminde değiştirici kullanabilirsiniz.Beginning with C# 7.2, you can use the ref modifier in the declaration of a structure type. Yapı türü ref örnekleri yığına ayrılır ve yönetilen yığına kaçamaz.Instances of a ref struct type are allocated on the stack and can't escape to the managed heap. Bunu sağlamak için derleyici yapı ref türlerinin kullanımını aşağıdaki gibi sınırlar:To ensure that, the compiler limits the usage of ref struct types as follows:

  • Bir ref yapı, bir dizinin öğe türü olamaz.A ref struct can't be the element type of an array.
  • Bir ref yapı, bir sınıfın veya yapı olmayanref bir alanın beyan edilen türü olamaz.A ref struct can't be a declared type of a field of a class or a non-ref struct.
  • Bir ref yapı arabirimleri uygulayamaz.A ref struct can't implement interfaces.
  • Bir ref yapı kutulanamaz System.ValueType ya da. System.ObjectA ref struct can't be boxed to System.ValueType or System.Object.
  • Bir ref yapı tür bağımsız değişkeni olamaz.A ref struct can't be a type argument.
  • Bir ref yapı değişkeni lambda ifadesi veya yerel bir işlevtarafından ele geçirilemez.A ref struct variable can't be captured by a lambda expression or a local function.
  • Bir ref yapı değişkeni bir async yöntemde kullanılamaz.A ref struct variable can't be used in an async method. Ancak, eşzamanlı ref yöntemlerde struct değişkenleri kullanabilirsiniz, örneğin, bu Task Task<TResult>döndürülen veya .However, you can use ref struct variables in synchronous methods, for example, in those that return Task or Task<TResult>.
  • Bir ref yapı değişkeni yineleyicilerdekullanılamaz.A ref struct variable can't be used in iterators.

Genellikle, ref ref yapı türlerinin veri üyelerini de içeren bir türe ihtiyacınız olduğunda bir yapı türü tanımlarsınız:Typically, you define a ref struct type when you need a type that also includes data members of ref struct types:

public ref struct CustomRef
{
    public bool IsValid;
    public Span<int> Inputs;
    public Span<int> Outputs;
}

Bir ref readonlyyapıyı , tür bildiriminde readonly ve ref değiştiricileri birleştirin readonly (değiştiricinin ref önce gelmesi gerekir):To declare a ref struct as readonly, combine the readonly and ref modifiers in the type declaration (the readonly modifier must come before the ref modifier):

public readonly ref struct ConversionRequest
{
    public ConversionRequest(double rate, ReadOnlySpan<double> values)
    {
        Rate = rate;
        Values = values;
    }

    public double Rate { get; }
    public ReadOnlySpan<double> Values { get; }
}

.NET'te, ref bir yapı örnekleri System.Span<T> System.ReadOnlySpan<T>ve .In .NET, examples of a ref struct are System.Span<T> and System.ReadOnlySpan<T>.

DönüşümlerConversions

Herhangi bir yapı türü için ref (yapı türleri hariç), kutulama ve unboxing dönüşümleri System.ValueType ve System.Object türleri vardır.For any structure type (except ref struct types), there exist boxing and unboxing conversions to and from the System.ValueType and System.Object types. Ayrıca, bir yapı türü ve uyguladığı herhangi bir arabirim arasında kutulama ve unboxing dönüşümleri de vardır.There exist also boxing and unboxing conversions between a structure type and any interface that it implements.

C# dili belirtimiC# language specification

Daha fazla bilgi için C# dil belirtiminin Structs bölümüne bakın.For more information, see the Structs section of the C# language specification.

C# 7.2 ve sonraki özellikler hakkında daha fazla bilgi için aşağıdaki özellik teklif notlarına bakın:For more information about features introduced in C# 7.2 and later, see the following feature proposal notes:

Ayrıca bkz.See also