Existe uma diferença entre const privado e variáveis ??somente leitura privados em C #?

StackOverflow https://stackoverflow.com/questions/410723

  •  03-07-2019
  •  | 
  •  

Pergunta

Existe uma diferença entre ter uma variável private const ou uma variável private static readonly em C # (outro do que ter de atribuir o const uma expressão em tempo de compilação)?

Uma vez que eles são ambos privado, não há nenhuma ligação com outras bibliotecas. Então, isso faria alguma diferença? ele pode fazer uma diferença de desempenho, por exemplo? cordas internados? Algo semelhante?

Foi útil?

Solução

Bem, você pode usar consts em atributos, já que eles existem como tempo de compilação. Você não pode prever o valor de uma estática somente leitura variável, uma vez que o .cctor conseguiu inicializar-lo de configuração etc.

Em termos de utilização, constantes são queimados no código de chamada. Isto significa que se você recompilar um biblioteca dll para mudar a public constante, mas não mudam os consumidores, então ele os consumidores ainda usará o valor original. Com uma variável readonly isso não vai acontecer. A face desta situação é que constantes são (muito, muito ligeiramente) mais rápido, uma vez que simplesmente carrega o valor (em vez de ter de-referência-lo).

Re internar; embora você pode fazer isso manualmente, este é mais comumente uma característica do compilador / runtime de literais; Se o init um campo somente leitura através de um literal:

someField = "abc";

então o "abc" será internado. Se você lê-lo de configuração, ele não será. Porque uma string constante deve ser um literal, ele também será internado, mas é acessado de forma diferente: mais uma vez, a leitura do campo é uma referência de, em vez de um ldstr .

Outras dicas

Na verdade, os dois tipos não pode ser alterado depois que eles foram inicializados, mas existem algumas diferenças entre eles:

  • 'const' deve ser inicializado onde eles são declarados (em tempo de compilação), enquanto que 'somente leitura' pode ser inicializado onde é declarado ou dentro do construtor (ar runtime).

Por exemplo const poderia ser usado nesta situação:

public class MathValues
{
  public const double PI = 3.14159;
}

E somente leitura seria melhor para este caso:

public class Person
{
    public readonly DateTime birthDate;

    public Person(DateTime birthDate)
    {
        this.birthDate = birthDate;
    }
}

ou

public class Person
{
    public readonly DateTime birthDate = new DateTime(1986, 1, 24);
}
  • 'const' é estático, por isso é compartilhado entre todas as instâncias dessa classe e pode ser acessado diretamente (como MathValues.PI), enquanto que 'somente leitura' não é estática. Como consequência, uma declaração como 'const estático' é ilegal porque const é estático, mas 'estático readonly' é legal

  • 'const' pode conter apenas tipo integral (sbyte, byte, short, ushort, int, uint, longo, ulong, char, float, double, decimal, bool, ou string), uma enumeração, ou um referência a nula (não classes ou estruturas porque eles são inicializados em tempo de execução, com a palavra chave 'novo'), enquanto que 'somente leitura' pode conter tipos complexos, estruturas ou classes (usando a nova palavra-chave na inicialização), mas não pode conter enumerações

Algo a nota sobre constantes é que eles são realmente armazenados no seu executável, então declarar um monte deles irá aumentar o tamanho do arquivo executável.

Normalmente, isso não é um problema enorme, mas um amigo meu trabalhou na empresa que aplicada uma "tudo deve ser const" regra e conseguiu aumentar significativamente seu tamanho executável compilado.

Aqui estão as diferenças entre C # .NET const , somente leitura e estática somente leitura campos (de este artigo ).

Constantes :

  • estática por padrão
  • Deve ter valor em tempo de compilação (ou seja .: você pode ter "A" + "B", mas não pode ter chamadas de método)
  • Pode ser usado em atributos
  • são copiados para cada conjunto que usa-los (cada conjunto recebe uma cópia local de valores)
  • Pode ser declarada dentro de funções

campos instância somente leitura de :

  • são avaliadas quando instância é criada
  • Deve ter valor definido pelo tempo construtor saídas

estático readonly campos :

  • são avaliados quando a execução de código atinge referência de classe (ou seja .: nova instância é criada ou método estático é executado)
  • valor deve ter avaliado pelo construtor tempo estático é feito
  • Você realmente não quer colocar ThreadStaticAttribute sobre estes (desde construtor estático será executado em apenas um segmento e que irá definir o valor para o seu fio, todos os outros tópicos terá este valor não inicializado)

Não há diferença notável entre const e somente leitura campos em C # .Net

const é de estática e necessidades padrão a ser inicializado com valor constante, que não pode ser modificado mais tarde. Mudança de valor não é permitido em construtores também. Ele não pode ser usado com todos os tipos de dados. Para DateTime ex. Ele não pode ser usado com DateTime tipo de dados.

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public readonly string Name = string.Empty; //No error, legal

readonly pode ser declarado como estático, mas não necessário. Não há necessidade de inicializar no momento da declaração. Seu valor pode ser atribuídas ou alteradas usando construtor. Então, dá vantagem quando usado como membro da classe instância. Dois instanciação diferente pode ter um valor diferente de campo somente leitura. Para ex -

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

Depois campo somente leitura pode ser inicializado com os valores instantâneo específicos, como se segue:

A objOne = new A(5);
A objTwo = new A(10);

Aqui, instância objOne terá valor do campo somente leitura como 5 e objTwo tem 10. O que não é possível usando const.

Em uso? Na verdade não. Consts são avaliadas em tempo de compilação, enquanto somente leitura são avaliadas em tempo de execução. Você também pode atribuir uma variável readonly um valor no construtor.

Só mais uma coisa. Eu não vi isso nos comentários acima, embora eu possa não ter percebido. Você não pode criar uma matriz constante.

private const int[] values = new int[] { 1, 2, 3 };

Mas você pode criá-lo usando um campo somente leitura estático.

private static readonly int[] values = new int[] { 1, 2, 3 };

Então, se você precisa de uma constante de matriz, tais como uma lista de valores permitidos, e uma enumeração não seria apropriado, em seguida, o estático readonly é o único caminho a percorrer. Por exemplo, se a matriz eram de inteiros anuláveis, como este:

private static readonly int?[] values = new int?[] { null, 1, 2, 3 };

Não é possível fazer que com uma constante, pode ya?

A diferença é que o valor de um campo estático só de leitura é ajustada em tempo de execução, e pode, assim, ser modificado por classe que contém, enquanto que o valor de um campo const é definida como uma constante de tempo de compilação.

No caso de somente leitura estático, a classe que contém é permitido para modificar só

na declaração da variável (por meio de um inicializador de variável) no construtor estático (exemplo construtores, se não é estática) estática somente leitura é normalmente usado se o tipo de campo não é permitido em uma declaração const, ou quando o valor não é conhecido em tempo de compilação.

instância somente leitura campos também são permitidos.

Lembre-se que para tipos de referência, em ambos os casos (estáticos e de instância), o único readonly modificador o impede de atribuir uma nova referência para o campo. É especificamente não faz imutável objeto apontado pela referência.

class Program

{

  public static readonly Test test = new Test();

  static void Main(string[] args)

  {

     test.Name = "Program";

     test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

  }

}

class Test

{

   public string Name;

}

A diferença é que estática somente leitura pode ser modificado pela classe que contém, mas const nunca pode ser modificado e deve ser inicializada com uma constante de tempo de compilação. Para expandir a estática somente leitura caso um pouco, a classe contendo só pode modificá-lo:

-. Na declaração da variável (por meio de um inicializador de variável)

-. No construtor estático (construtores de instância, se não é estática)


Const palavra-chave em C # .NET

Exemplo: public const string abc = “xyz”; Inicializada apenas com declaração. Valor é avaliada em tempo de compilação e não pode ser alterado em tempo de execução. Uma tentativa de mudar isso irá causar um erro de compilação. Const já é tipo de estática. Desde classes e estruturas são inicializadas em tempo de execução com a nova palavra-chave, você não pode definir uma constante para uma classe ou estrutura. Mas, tem que ser um dos tipos integrais. Somente leitura de palavras-chave em C # .NET

Exemplo: public readonly string abc; Pode ser inicializado no código de declaração ou código consturctor. Valor é avaliada em tempo de execução. Pode ser declarado como atributo nível estático ou instância. A leitura único campo pode conter um objeto complexo usando a nova palavra-chave em tempo de execução.

readonly campos pode ser inicializado quer na declaração ou em um construtor de uma classe. Portanto somente leitura campos pode ter valores diferentes dependendo do construtor usado .

Um membro somente de leitura também pode ser usado para execução constantes como no exemplo a seguir:

public static readonly uint currentTicks = (uint)DateTime.Now.Ticks;

readonly campos são não implicitamente estático, e, portanto, o estático palavra-chave pode (deve) ser aplicada a um campo somente leitura explicitamente, se necessário. Isto não é permitido para os campos de const, que são implicitamente estático.

membros somente leitura de pode segurar objetos complexos, utilizando o nova palavra-chave na inicialização .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top