Compartilhar via


readonly (referência de C#)

Use a readonly palavra-chave como modificador em cinco contextos:

  • Em uma declaração de campo, readonly significa que você só pode atribuir o campo durante a declaração ou em um construtor na mesma classe. Você pode atribuir e reatribuir um campo readonly várias vezes dentro da declaração de campo e do construtor.

    Você não pode atribuir um readonly campo após a conclusão do construtor. Essa regra afeta tipos de valor e tipos de referência de forma diferente:

    • Como os tipos de valor contêm diretamente seus dados, um campo que é um readonly tipo de valor é imutável.
    • Como os tipos de referência contêm uma referência a seus dados, um campo que é um readonly tipo de referência deve sempre se referir ao mesmo objeto. Esse objeto pode não ser imutável. O readonly modificador impede a substituição do valor do campo por uma instância diferente do tipo de referência. No entanto, o modificador não impede que os dados da instância do campo sejam modificados através do campo de leitura única.

    Aviso

    Um tipo visível externamente que contém um campo somente leitura visível externamente que é um tipo de referência mutável pode ser uma vulnerabilidade de segurança e pode disparar o aviso CA2104 : "Não declare somente tipos de referência mutáveis de leitura".

  • Em uma readonly struct definição de tipo, readonly significa que o tipo de estrutura é imutável. Para obter mais informações, consulte a readonly seção struct do artigo Tipos de estrutura .

  • Em uma declaração de membro de instância dentro de um tipo de estrutura, readonly significa que um membro de instância não modifica o estado da estrutura. Para obter mais informações, consulte a seção membros dareadonly instância do artigo Tipos de estrutura.

  • Em um ref readonly retorno de método, o readonly modificador indica que o método retorna uma referência e as gravações não têm permissão para essa referência.

A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento do idioma.

A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.

Dica

Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.

Exemplo de campo Readonly

Neste exemplo, você não pode alterar o valor do year campo no ChangeYear método, mesmo que o construtor de classe atribua um valor a ele:

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

Você pode atribuir um valor a um readonly campo somente nos seguintes contextos:

  • Quando você inicializa a variável na declaração, por exemplo:

    public readonly int y = 5;
    
  • Em um construtor de instância da classe que contém a declaração de campo da instância.

  • No construtor estático da classe que contém a declaração de campo estático.

Esses contextos de construtor também são os únicos contextos nos quais é válido passar um readonly campo como um parâmetro de saída ou ref .

Observação

A readonly palavra-chave é diferente da palavra-chave const . Você só pode inicializar um const campo na declaração do campo. Você pode atribuir um readonly campo várias vezes na declaração de campo e em qualquer construtor. Portanto, readonly os campos podem ter valores diferentes dependendo do construtor usado. Além disso, embora um const campo seja 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 SamplePoint
{
    public int x;
    // Initialize a readonly field
    public readonly int y = 25;
    public readonly int z;

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

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

    public static void Main()
    {
        SamplePoint p1 = new SamplePoint(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SamplePoint p2 = new SamplePoint();
        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
    */
}

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

p2.y = 66;        // Error

você obtém a mensagem de erro do compilador:

Um campo somente para leitura não pode ter valor atribuído (exceto em um construtor ou um inicializador de variável)

Membros da instância readonly

Use o readonly modificador para declarar que um membro de instância não modifica o estado de um struct.

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

Observação

Para uma propriedade de leitura/gravação, você pode adicionar o readonly modificador ao get acessador. Alguns get acessadores executam um cálculo e armazenam em cache o resultado, em vez de simplesmente retornarem o valor de um campo privado. Ao adicionar o readonly modificador ao get acessador, você garante que o get acessador não modifique o estado interno do objeto armazenando em cache qualquer resultado.

Para obter mais exemplos, consulte a seção membros dareadonly instância do artigo Tipos de estrutura.

Exemplo de retorno de "ref readonly"

Um readonly modificador em um ref return indica que a referência retornada não pode ser modificada. O exemplo a seguir retorna uma referência à origem. Ele usa o readonly modificador para indicar que os chamadores não podem modificar a origem:

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

O tipo retornado não precisa ser um readonly struct. Qualquer tipo que ref possa retornar também pode ser retornado por ref readonly.

Exemplo de retorno readonly ref readonly

Você também pode usar um ref readonly return com readonly membros de instância em struct tipos:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

    public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
    {
        // _data = 1; // Compile error if uncommented.
        return ref reference;
    }
}

O método essencialmente retorna uma readonly referência junto com o membro da instância (nesse caso, um método) sendo readonly (não capaz de modificar nenhum campo de instância).

Especificação da linguagem C#

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

Consulte também