ReadOnly (referência de C#)

O readonly palavra-chave é um modificador que pode ser usado em campos. Quando uma declaração de campo incluir um readonly modificador, atribuições para os campos introduzidos pela declaração só podem ocorrer como parte da declaração ou em um construtor na mesma classe.

Exemplo

Neste exemplo, o valor do campo year não pode ser alterado no método ChangeYear, mesmo que ele é atribuído um valor no construtor da classe:

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

Você pode atribuir um valor para um readonly campo apenas nos seguintes contextos:

  • Quando a variável é inicializada na declaração, por exemplo:

    public readonly int y = 5;
    
  • Para um campo de instância em construtores de instância da classe que contém a declaração de campo ou para um campo estático, no construtor estático da classe que contém a declaração de campo. Também são os contextos somente é válido para passar um readonly campo como um check-out ou ref parâmetro.

ObservaçãoObservação

O readonly palavra-chave é diferente do const palavra-chave. A const campo somente pode ser inicializado na declaração do campo. A readonly campo pode ser inicializado na declaração ou em um construtor. Portanto, readonly campos podem ter valores diferentes dependendo do construtor usado. Além disso, enquanto um const campo é uma constante de tempo de compilação, o readonly campo pode ser usado para constantes de tempo de execução como no exemplo a seguir:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
    public class ReadOnlyTest
    {
       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;
          }
       }

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

No exemplo anterior, se você usar uma instrução como esta:

p2.y = 66; // Error

Você receberá a mensagem de erro do compilador:

The left-hand side of an assignment must be an l-value

qual é o mesmo erro que quando você tentar atribuir um valor a uma constante.

Especificação da linguagem C#

Para obter mais informações, consulte C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

C# Keywords

Modifiers (C# Reference)

Const (referência de C#)

Campos (guia de programação de C#)

Conceitos

C# Programming Guide

Outros recursos

C# Reference