O modificador const pode ser aplicado (e, em geral, deve ser) a qualquer campo cujo valor seja conhecido em tempo de compilação e não mude durante o tempo de vida do programa.
private const int num = 1729;
public const string title = "Grand" + " Master";
O modificador readonly pode ser aplicado (e, em geral, deve ser) a qualquer campo que não possa ser declarado const, cujo valor não mude durante o tempo de vida do programa e seja definido por um inicializador inline ou durante a instanciação (pelo construtor ou por um método chamado pelo construtor).
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
Em situações sensíveis do ponto de vista da segurança (ou até simplesmente numa base de código grande, onde os programadores têm prioridades e objetivos diferentes) deves evitar que a API pública de uma classe seja contornada, aceitando e guardando parâmetros mutáveis de um método ou expondo um membro mutável de uma classe através de um valor devolvido ou como parâmetro out.
Embora o modificador readonly impeça que o valor ou a referência de um campo seja substituído, não oferece qualquer proteção para os membros de um tipo de referência.
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
Para garantir que todos os membros de um tipo de referência ficam protegidos, os campos podem ser declarados readonly e as propriedades automáticas podem ser definidas sem um acessor set.
A Base Class Library (BCL) fornece algumas versões só de leitura de coleções para quando é preciso impedir que os membros de uma coleção sejam atualizados. Surgem na forma de wrappers:
ReadOnlyDictionary<T> expõe um Dictionary<T> como só de leitura.ReadOnlyCollection<T> expõe uma List<T> como só de leitura.O sistema de autenticação que viste pela última vez em developer-privileges precisa de alguma atenção. Foi-te atribuída a tarefa de limpar o código. Um projeto de limpeza destes não só facilita a vida aos futuros responsáveis pela manutenção, como também revela e corrige algumas vulnerabilidades de segurança.
Esta é uma tarefa de refatoração. Adiciona o modificador const a todos os membros de Authenticator ou Identity que consideres adequados.
Esta é uma tarefa de refatoração. Adiciona o modificador readonly a todos os campos da classe Authenticator ou da estrutura Identity que consideres adequados.
Remove o acessor set ou torna-o private em qualquer propriedade adequada da classe Authenticator ou da estrutura Identity.
Neste momento, o campo de identidade do administrador é devolvido por uma chamada a Admin. Isto não é o ideal, pois quem chama pode modificar o campo. Encontra uma forma de impedir que quem chama modifique os dados do administrador no objeto Authenticator.
Neste momento, o dicionário que contém as identidades de programadores privilegiados codificadas diretamente é devolvido por uma chamada a GetDevelopers(). Isto não é o ideal, pois quem chama pode modificar o dicionário. Encontra uma forma de impedir que quem chama modifique os dados dos programadores no objeto Authenticator.
Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.