Em seu excelente livro, CLR Via C #, Jeffrey Richter disse que não gosta de propriedades e recomenda não usá-las. Ele deu algum motivo, mas eu realmente não entendo. Alguém pode me explicar por que devo ou não usar propriedades? No C # 3.0, com propriedades automáticas, isso muda?
Como referência, adicionei as opiniões de Jeffrey Richter:
• Uma propriedade pode ser somente leitura ou somente gravação; o acesso ao campo é sempre legível e gravável. Se você definir uma propriedade, é melhor oferecer os métodos de acesso get e set.
• Um método de propriedade pode lançar uma exceção; o acesso de campo nunca lança uma exceção.
• Uma propriedade não pode ser passada como parâmetro out ou ref para um método; um campo pode. Por exemplo, o código a seguir não será compilado:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
• Um método de propriedade pode levar muito tempo para ser executado; o acesso ao campo sempre é concluído imediatamente. Um motivo comum para usar propriedades é executar a sincronização do thread, o que pode interromper o thread para sempre e, portanto, uma propriedade não deve ser usada se a sincronização do thread for necessária. Nessa situação, um método é preferido. Além disso, se sua classe pode ser acessada remotamente (por exemplo, sua classe é derivada de System.MashalByRefObject), chamar o método de propriedade será muito lento e, portanto, um método é preferível a uma propriedade. Na minha opinião, as classes derivadas de MarshalByRefObject nunca devem usar propriedades.
• Se chamado várias vezes em uma linha, um método de propriedade pode retornar um valor diferente a cada vez; um campo retorna o mesmo valor todas as vezes. A classe System.DateTime tem uma propriedade Now somente leitura que retorna a data e hora atuais. Cada vez que você consultar essa propriedade, ela retornará um valor diferente. Isso é um erro, e a Microsoft deseja poder consertar a classe tornando o Now um método em vez de uma propriedade.
• Um método de propriedade pode causar efeitos colaterais observáveis; o acesso ao campo nunca o faz. Em outras palavras, um usuário de um tipo deve ser capaz de definir várias propriedades definidas por um tipo em qualquer ordem que ele escolher, sem perceber qualquer comportamento diferente no tipo.
• Um método de propriedade pode requerer memória adicional ou retornar uma referência a algo que não é realmente parte do estado do objeto, portanto, modificar o objeto retornado não tem efeito sobre o objeto original; a consulta de um campo sempre retorna uma referência a um objeto que é garantido como parte do estado do objeto original. Trabalhar com uma propriedade que retorna uma cópia pode ser muito confuso para os desenvolvedores e essa característica freqüentemente não é documentada.