O modificador const pode ser (e em geral deve ser) aplicado 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 (e em geral deve ser) aplicado a qualquer campo que não possa ser declarado const, cujo valor não mude durante o tempo de vida do programa e que seja definido por um inicializador embutido 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 à segurança (ou até simplesmente em uma base de código grande, onde as pessoas desenvolvedoras têm prioridades e objetivos diferentes), você deve evitar que a API pública de uma classe seja contornada ao aceitar e armazenar parâmetros mutáveis de um método ou ao expor um membro mutável de uma classe por meio de um valor de retorno ou como parâmetro out.
Embora o modificador readonly impeça que o valor ou a referência de um campo seja sobrescrito, ele não oferece nenhuma 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 fiquem protegidos, os campos podem ser declarados readonly e propriedades automáticas podem ser definidas sem um acessador set.
A Base Class Library (BCL) oferece algumas versões somente leitura de coleções para quando é preciso impedir que os membros de uma coleção sejam atualizados. Elas vêm na forma de wrappers:
ReadOnlyDictionary<T> expõe um Dictionary<T> como somente leitura.ReadOnlyCollection<T> expõe um List<T> como somente leitura.O sistema de autenticação que você viu pela última vez em developer-privileges precisa de atenção. Sua tarefa é fazer uma limpeza no código. Um projeto de limpeza como esse não só vai facilitar a vida de quem for manter o código no futuro, como também vai revelar e corrigir algumas vulnerabilidades de segurança.
Esta é uma tarefa de refatoração. Adicione o modificador const a qualquer membro de Authenticator ou Identity que você considere apropriado.
Esta é uma tarefa de refatoração. Adicione o modificador readonly a qualquer campo da classe Authenticator ou da struct Identity que você considere apropriado.
Remova o acessador set ou torne-o private em qualquer propriedade apropriada da classe Authenticator ou da struct Identity.
No momento, o campo de identidade do admin é retornado por uma chamada a Admin. Isso não é ideal, pois quem chama pode modificar o campo. Encontre uma forma de impedir que quem chama modifique os detalhes do admin no objeto Authenticator.
No momento, o dicionário que contém as identidades privilegiadas de desenvolvedores definidas diretamente no código é retornado por uma chamada a GetDevelopers(). Isso não é ideal, pois quem chama pode modificar o dicionário. Encontre uma forma de impedir que quem chama modifique os detalhes dos desenvolvedores no objeto Authenticator.
Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.