readonly (Referência de C#)

O readonly palavra-chave é um modificador que pode ser usado em campos. Quando uma declaração de campo inclui uma 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 somente nos seguintes contextos:

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

    public readonly int y = 5;
    
  • Para um campo de instância, nos 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. Estes também são os contextos somente é válido para passar um readonly campo como um check-out ou ref parâmetro.

Dica

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 você obtém ao tentar atribuir um valor a uma constante.

Especificação da linguagem C#

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

Consulte também

Referência

Palavras-chave C#

Modificadores (Referência de C#)

const (Referência de C#)

Campos (Guia de Programação em C#)

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#