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
Modificadores (Referência de C#)
Campos (Guia de Programação em C#)