Pergunta

Pergunta rápida:? Quando você decidir usar propriedades (em C #) e quando você decidir usar métodos

Estamos ocupados a ter este debate e de ter encontrado algumas áreas onde é discutível se devemos usar uma propriedade ou um método. Um exemplo é o seguinte:

public void SetLabel(string text)
{
    Label.Text = text;
}

No exemplo, Label é um controle em uma página ASPX. Existe um princípio que pode governar a decisão (neste caso) se para tornar este um método ou uma propriedade.

Eu vou aceitar a resposta que é mais geral e abrangente, mas que também toca no exemplo que dei.

Foi útil?

Solução

A partir da Escolhendo entre propriedades e métodos seção do Guia de design para desenvolvimento bibliotecas de classe:

Em geral, os métodos representam ações e propriedades representam dados. As propriedades são feitos para serem usados ??como campos, o que significa que as propriedades não devem ser computacionalmente complexa ou produzir efeitos colaterais. Quando ela não viola as diretrizes a seguir, considerar o uso de uma propriedade, em vez de um método, porque os desenvolvedores menos experientes encontrar propriedades mais fácil de usar.

Outras dicas

Sim, se tudo que você está fazendo é a obtenção e configuração, use uma propriedade.

Se você está fazendo algo complexo que pode afectar vários membros de dados, um método é mais apropriado. Ou se o seu getter usa parâmetros ou seu setter preciso mais do que um parâmetro de valor.

No meio é uma área cinzenta onde a linha pode ser um pouco turva. Não há nenhuma regra dura e rápida e as pessoas diferentes, por vezes, irão discordar se algo deve ser uma propriedade ou um método. O importante é apenas para ser (relativamente) consistente com a forma como você fazê-lo (ou como sua equipe faz isso).

Eles são em grande parte intercambiáveis, mas uma propriedade sinais para o usuário que a implementação é relativamente "simples". Ah, e a sintaxe é um pouco mais limpo.

De um modo geral, a minha filosofia é que se você começar a escrever um nome de método que começa com get ou set e leva zero ou um parâmetro (respectivamente), então é um excelente candidato para uma propriedade.

Se você estiver configurando uma propriedade real de seu objeto, em seguida, você usa uma propriedade.

Se você está executando uma tarefa / funcionalidade, então você usar um método.

No seu exemplo, é uma propriedade que está sendo conjunto definido.

Se, no entanto, a sua funcionalidade era AppendToLabel então você usaria um método.

As propriedades são uma maneira de injetar ou recuperar dados de um objeto. Eles criam uma abstração sobre variáveis ??ou dados dentro de uma classe. Eles são análogos aos getters e setters em Java.

Métodos encapsular uma operação.

Em propriedades gerais que eu uso para expor pedaços individuais de dados, ou pequenos cálculos em uma classe, como imposto sobre vendas. Que é derivado do número de itens e seu custo em um carrinho de compras.

Eu uso métodos quando eu criar uma operação, como a recuperação de dados a partir do banco de dados. Qualquer operação que tem partes móveis, é um candidato para um método.

No seu exemplo código que eu iria envolvê-la em uma propriedade se eu precisar acessá-lo fora é contendo classe:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Definir o texto:

Title.Text = "Properties vs Methods";

Se eu estava apenas definindo a propriedade texto do rótulo é assim que eu iria fazê-lo:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Definir o texto:

Title = "Properties vs Methods";

Buscando através MSDN, eu encontrei uma referência sobre propriedades vs métodos que fornece algumas orientações para a criação de grandes métodos:

  • A operação é uma conversão, tal como Object.ToString.
  • A operação é bastante caro que você quer se comunicar com o usuário que eles devem considerar caching o resultado.
  • A obtenção de um valor de propriedade usando o acessor get teria um observável lado efeito.
  • Chamando o membro duas vezes consecutivas produz resultados diferentes.
  • A ordem de execução é importante. Note-se que as propriedades de um tipo deve ser capaz de ser definido e recuperadas em qualquer ordem.
  • O membro é estático, mas retorna um valor que pode ser alterado.
  • O membro retorna um array. Propriedades que matrizes de retorno pode ser Muito equivocadas. Geralmente é necessário devolver uma cópia do interno da matriz de modo que o utilizador não pode alterar o estado interno. Isso, juntamente com o fato de que um usuário pode facilmente assumir que é uma propriedade indexada, leva ao código ineficiente.
propriedades

Symantically são atributos de seus objetos. Métodos são comportamentos de seu objeto.

Label é um atributo e que faz mais sentido para torná-lo uma propriedade.

Em termos de Programação Orientada a Objetos você deve ter uma compreensão clara do que é parte do comportamento e que é meramente um atributo.

Car {a cores, Modelo, Brand}

Um carro tem cores, Modelo e atributos da marca, portanto, não faz sentido ter um SetColor método ou setModel porque symantically não pedimos Carro para definir sua própria cor.

Então, se você mapear o caso da propriedade / método para o objeto vida real ou olhar para ele a partir Symantic ponto de vista, a sua confusão vai realmente possam ir embora.

Você só precisa olhar para o próprio nome ... "Propriedade". O que isso significa? O dicionário define-lo de muitas maneiras, mas, neste caso, "um atributo essencial ou distintivo ou qualidade de uma coisa" se encaixa melhor.

Pense sobre o objetivo da ação. É você, de fato, alterar ou recuperar "um elemento essencial ou atributo distintivo"? No seu exemplo, você estiver usando uma função para definir uma propriedade de uma caixa de texto. Isso parece meio bobo, não é?

Propriedades são realmente funções. Eles todos para baixo de compilação para getXXX () e setXXX (). Ele apenas esconde-los em açúcar sintático, mas de açúcar que fornece um significado semântico ao processo.

Pense sobre imóveis como atributos. Um carro tem muitos atributos. Cor, MPG, Modelo, etc .. Nem todas as propriedades são setable, alguns são calculatable.

Enquanto isso, um método é uma ação. GetColor deve ser uma propriedade. GetFile () deve ser uma função. Outra regra de ouro é, se não alterar o estado do objeto, então deve ser uma função. Por exemplo, CalculatePiToNthDigit (N) deve ser uma função, uma vez que não está realmente alterando o estado do objecto matemática é ligado a.

Esta é talvez a divagar um pouco, mas ele realmente se resume a decidir o que seus objetos são, eo que eles representam. Se você não consegue descobrir se ele deve ser uma propriedade ou função, talvez não importa qual.

Eu prefiro usar propriedades para métodos add / set com 1 parâmetro. Se os parâmetros são mais, os métodos de uso.

Propriedades só deve ser simples conjunto e obter forros. Nada mais e ele realmente deve ser transferido para um método. código complexo deve estar sempre em métodos.

Eu só usar as propriedades para o acesso variável, ou seja, obter e definir variáveis ??individuais, ou obter e definir dados nos controles. Assim como é necessário qualquer tipo de manipulação de dados / realizada, eu uso métodos.

Também grande vantagem para propriedades é que o valor da propriedade pode ser visto no Visual Studio durante a depuração.

As propriedades são muito legal porque eles são acessíveis no designer visual do estúdio visual, desde que tenham acesso.

Eles usam ser usado eram você está apenas configurar e obter e talvez alguma validação que não acessa uma quantidade significativa de código. Tenha cuidado, porque a criação de objetos complexos durante a validação não é simples.

Qualquer coisa métodos else são a forma preferida.

Não é apenas sobre semântica. Usando propriedades inapropriado começar a ter estranheza ocorrer no designer visual studio visual.

Por exemplo, eu estava ficando um valor de configuração dentro de uma propriedade de uma classe. A classe de configuração realmente abre um arquivo e executa uma consulta SQL para obter o valor dessa configuração. Isto causou problemas em minha aplicação onde o arquivo de configuração iria ficar abertos e bloqueados por si visual studio em vez do meu pedido, porque não só foi ler, mas escrever o valor de configuração (através do método setter). Para corrigir isso eu apenas tive que mudá-lo para um método.

Por uma questão de propriedades de design representam dados ou atributos de objeto de classe, Enquanto os métodos são ações ou comportamentos de objeto de classe.

Na Net, mundo, existem outras implicações do uso de Propriedades:

  • Propriedades são utilizados em ligação de dados, enquanto get_ / métodos set_ não são.
  • propriedades do usuário serialização XML como mecanismo natural de serilization.
  • As propriedades são acessados ??por PropertyGrid controle e estagiário ICustomTypeDescriptor , que pode ser utilizada de forma eficaz se você estiver escrevendo uma biblioteca personalizada.
  • As propriedades são controladas por Atributos , pode-se usá-la sabiamente ao design Aspect softwares orientado.

Equívocos (IMHO) sobre o uso de Propriedades:

  • Usado para expor pequenos cálculos: ControlDesigner.SelectionRules 's obter bloco é executado em 72 linhas !!
  • Usado para expor as estruturas de dados internos: Mesmo se uma propriedade não mapeia para um membro de dados interna, pode-se usá-lo como propriedade, se o seu um atributo de sua classe. Vice-versa, mesmo que o seu atributo de suas propriedades de classe não são aconselháveis, para retornar matriz como membros de dados (em vez de métodos são usados ??para retornar cópia profunda de membros.)

No exemplo aqui poderia ter sido escrito, com mais significado negócio como:

public String Title
{
    set { Label.Text = text; }
}

Aqui está um bom conjunto de diretrizes para quando usar propriedades vs métodos de Bill Wagner

  • Use uma propriedade quando todas estas forem verdadeiras: Os getters deve ser simples e, portanto, pouco provável que lançar exceções. Note que isto implica sem acesso à rede (ou banco de dados). Ou pode falhar e, portanto, seria lançar uma exceção.
  • Eles não devem ter dependências entre si. Note-se que isso iria incluir o estabelecimento de uma propriedade e tê-lo afetar o outro. (Por exemplo, definindo a propriedade FirstName afetaria uma propriedade só de leitura FullName que compunham a + últimos propriedades de nome primeiro nome implica uma tal dependência)
  • Eles devem ser ajustável em qualquer ordem
  • O getter não tem um efeito colateral observável Nota essa diretriz não impede que algumas formas de avaliação preguiçosa em uma propriedade.
  • O método deve sempre retornar imediatamente. (Note que isso exclui uma propriedade que faz uma chamada de banco de dados de acesso, chamada de serviço web, ou outra operação semelhante).
  • Use um método se o membro retorna uma matriz.
  • Repetidos chamadas para o getter (sem intervir código) deve retornar o mesmo valor.
  • chamadas repetidas para o setter (com o mesmo valor) deve produzir nenhuma diferença a partir de uma única chamada.

  • O get não deve retornar uma referência a estruturas de dados internas (ver ponto 23). Um método pode retornar uma cópia de profundidade, e poderia evitar esse problema.

* Tomado de minha resposta a uma pergunta duplicada.

Esta é simples.

1: propriedade usar quando quiser os seus dados devem ser validados antes de armazenar em campo. Assim, deste modo propriedade fornece encapsulamento para os seus campos. Porque se você deixar seus campos usuário final público pode atribuir qualquer valor que pode ou não pode ser válida como por sua exigência de negócios como a idade deve ser maior que 18. Portanto, antes de valor é loja de campo é preciso verificar sua validade correspondente. Desta forma propriedades representam dados.

2: Use método quando desejar realizar alguma ação, como você está fornecendo alguns dados como parâmetro e seu método está fazendo algum processamento com base em valores fornecidos e retornando valor processado como saída. Ou você quer mudar o valor de algum campo por este cálculo. "Desta forma método representa a ação".

Eu venho de java um i usado obter .. Conjunto .. método por um tempo.

Quando eu escrever o código, eu não peço para minha auto: "acesso a esses dados é simples ou exigir um processo pesado?" , porque as coisas podem mudar (retrive hoje esta propriedade é simples, tomonrow pode exigir alguma ou processo pesado).

Hoje eu tenho um método setAge (idade int) tomonrow i terá também método setAge (data de nascimento) que calcular a idade utilizando a data de nascimento.

Fiquei muito decepcionado que o compilador transformar propriedade em get e set, mas não considero o meu Get ... e Set .. métodos como o mesmo.

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