readonly (odwołanie w C#)readonly (C# Reference)

readonly — Słowo kluczowe jest modyfikator, który może być używana w kontekstach trzy:The readonly keyword is a modifier that can be used in three contexts:

  • W pola deklaracji, readonly wskazuje przypisania do pola mogą występować wyłącznie jako część deklaracji lub za pomocą konstruktora w tej samej klasy.In a field declaration, readonly indicates that assignment to the field can only occur as part of the declaration or in a constructor in the same class. Pola tylko do odczytu mogą zostać przypisane i ponownie przypisać wiele razy w ramach deklarację pola i konstruktora.A readonly field can be assigned and reassigned multiple times within the field declaration and constructor.

    Element readonly nie można przypisać pola, po zakończeniu konstruktora.A readonly field cannot be assigned after the constructor exits. Która ma inny wpływ dla typów wartości i typy referencyjne:That has different implications for value types and reference types:

    • Ponieważ typy wartości zawierają bezpośrednio swoje dane, pole to readonly typ wartości jest niezmienny.Because value types directly contain their data, a field that is a readonly value type is immutable.
    • Ponieważ typy odwołań zawierają odwołania do swoich danych, pola to readonly typu odwołania zawsze musi odwoływać się do tego samego obiektu.Because reference types contain a reference to their data, a field that is a readonly reference type must always refer to the same object. Ten obiekt jest niezmienny.That object is not immutable. readonly Modyfikator zapobiega zastępowane przez inne wystąpienie typu odwołania pola.The readonly modifier prevents the field from being replaced by a different instance of the reference type. Jednak modyfikator nie uniemożliwia dane wystąpienia pola modyfikowana za pomocą pola tylko do odczytu.However, the modifier does not prevent the instance data of the field from being modified through the read-only field.

    Ostrzeżenie

    Typ widoczny na zewnątrz zawiera widoczne na zewnątrz pole tylko do odczytu, która jest typu referencji zmiennej może być luki w zabezpieczeniach i mogą wyzwalać ostrzeżenie CA2104 : "Nie deklaruj odczytu modyfikowalnych typów referencyjnych tylko."An externally visible type that contains an externally visible read-only field that is a mutable reference type may be a security vulnerability and may trigger warning CA2104 : "Do not declare read only mutable reference types."

  • W readonly struct definicji, readonly wskazuje, że struct można modyfikować.In a readonly struct definition, readonly indicates that the struct is immutable.

  • W ref readonly zwrotu metody, readonly modyfikator wskazuje, że metoda zwraca odwołanie i zapisy są niedozwolone do tego odwołania.In a ref readonly method return, the readonly modifier indicates that method returns a reference and writes are not allowed to that reference.

Końcowe dwa konteksty zostały dodane w języku C# 7.2.The final two contexts were added in C# 7.2.

Przykład pola tylko do odczytuReadonly field example

W tym przykładzie wartość pola year nie można zmienić w metodzie ChangeYear, nawet jeśli jest do niej przypisana wartość w konstruktorze klasy:In this example, the value of the field year cannot be changed in the method ChangeYear, even though it is assigned a value in the class constructor:

class Age
{
    readonly int year;
    Age(int year)
    {
        this.year = year;
    }
    void ChangeYear()
    {
        //year = 1967; // Compile error if uncommented.
    }
}

Można przypisać wartości do readonly tylko w następujących kontekstów się:You can assign a value to a readonly field only in the following contexts:

  • Gdy zmienna jest inicjowana w deklaracji, na przykład:When the variable is initialized in the declaration, for example:

    public readonly int y = 5;
    
  • W konstruktorze wystąpienia klasy, który zawiera deklarację pola wystąpienia.In an instance constructor of the class that contains the instance field declaration.

  • W konstruktorze statycznym klasy, który zawiera deklarację pola statycznego.In the static constructor of the class that contains the static field declaration.

Tych kontekstach Konstruktor są również tylko kontekstów, w których jest on prawidłowy do przekazania readonly pola jako się lub ref parametru.These constructor contexts are also the only contexts in which it is valid to pass a readonly field as an out or ref parameter.

Uwaga

readonly — Słowo kluczowe różni się od const — słowo kluczowe.The readonly keyword is different from the const keyword. A const pola mogą być inicjowane tylko na deklarację pola.A const field can only be initialized at the declaration of the field. A readonly pola można przypisać wiele razy w deklarację pola i dowolny Konstruktor.A readonly field can be assigned multiple times in the field declaration and in any constructor. W związku z tym readonly pola mogą mieć różne wartości w zależności od używanego konstruktora.Therefore, readonly fields can have different values depending on the constructor used. Ponadto, podczas gdy const pole jest stałą czasu kompilacji readonly pole może być używane dla stałych środowiska uruchomieniowego, jak w poniższym przykładzie:Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants as in the following example:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
class SampleClass
{
    public int x;
    // Initialize a readonly field
    public readonly int y = 25;
    public readonly int z;

    public SampleClass()
    {
        // Initialize a readonly instance field
        z = 24;
    }

    public SampleClass(int p1, int p2, int p3)
    {
        x = p1;
        y = p2;
        z = p3;
    }

    public static void Main()
    {
        SampleClass p1 = new SampleClass(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SampleClass p2 = new SampleClass();
        p2.x = 55;   // OK
        Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
    }
    /*
     Output:
        p1: x=11, y=21, z=32
        p2: x=55, y=25, z=24
    */
}

W poprzednim przykładzie, jeśli korzystasz z instrukcji, podobnie jak w poniższym przykładzie:In the preceding example, if you use a statement like the following example:

p2.y = 66;        // Error

zostanie wyświetlony komunikat o błędzie kompilatora:you will get the compiler error message:

A readonly field cannot be assigned to (except in a constructor or a variable initializer)

Przykład struktury tylko do odczytuReadonly struct example

readonly Modyfikator na struct definicji oświadcza, że struktura niezmienne.The readonly modifier on a struct definition declares that the struct is immutable. Wszystkie pola wystąpienia struct muszą być oznaczone jako readonly, jak pokazano w poniższym przykładzie:Every instance field of the struct must be marked readonly, as shown in the following example:

public readonly struct Point
{
    public double X { get; }
    public double Y { get; }

    public Point(double x, double y) => (X, Y) = (x, y);

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

W poprzednim przykładzie użyto tylko do odczytu właściwości automatyczne można zadeklarować magazynu.The preceding example uses readonly auto properties to declare its storage. Która instruuje kompilator, aby utworzyć readonly kopii pola dla tych właściwości.That instructs the compiler to create readonly backing fields for those properties. Można również zadeklarować readonly pól bezpośrednio:You could also declare readonly fields directly:

public readonly struct Point
{
    public readonly double X;
    public readonly double Y;

    public Point(double x, double y) => (X, Y) = (x, y);

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

Dodawanie pola niezaznaczonych readonly generuje błąd kompilatora CS8340: "Wystąpienia pól struktur tylko do odczytu muszą być tylko do odczytu."Adding a field not marked readonly generates compiler error CS8340: "Instance fields of readonly structs must be readonly."

Przykład zwracane tylko do odczytu REFRef readonly return example

readonly Modyfikator na ref return wskazuje, że zwracane odwołanie nie może być modyfikowany.The readonly modifier on a ref return indicates that the returned reference cannot be modified. Poniższy przykład zwraca odwołanie do źródła.The following example returns a reference to the origin. Używa ona readonly modyfikator, aby wskazać, że obiekty wywołujące nie można zmodyfikować punkt początkowy:It uses the readonly modifier to indicate that callers cannot modify the origin:

private static readonly Point origin = new Point(0, 0);
public static ref readonly Point Origin => ref origin;

Typ zwracany nie musi być readonly struct.The type returned doesn't need to be a readonly struct. Dowolny typ, który może zostać zwrócony przez ref mogą być zwrócone przez ref readonly.Any type that can be returned by ref can be returned by ref readonly.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also