Por que o C # permite propriedades nas interfaces?

43

Em C #, o seguinte código é válido

interface I{
    int property{get;set;}
}

O que não faz sentido para mim. Isso parece quebrar um dos princípios mais importantes das interfaces: falta de estado (em outras palavras, nenhum campo). A propriedade não cria um campo privado implícito? Isso não seria muito ruim para interfaces?

    
por David Grinberg 23.07.2014 / 22:57
fonte

3 respostas

57

Acho que a parte confusa é que, se você escreve int Property { get; set; } dentro de uma classe, então é uma propriedade automática com campo de apoio implícito.

Mas se você escreve exatamente a mesma coisa em uma interface, então não é auto-propriedade , ele apenas declara que a propriedade é parte da interface e que qualquer tipo que implemente a interface tem que contém essa propriedade (como auto-propriedade ou não), mas não cria o campo de apoio.

Uma maneira de ver a diferença é escrever int Property { get; } : isso é válido em uma interface e declara uma propriedade que tem apenas um getter, mas nenhum setter. Mas ele não será compilado em uma classe (a menos que você esteja usando o C # 6.0), porque a propriedade automática precisa ter um setter.

    
por 02.08.2014 / 14:01
fonte
17

Definir a propriedade conforme mostrado é o mesmo que definir os métodos int GetProperty() e void SetProperty(int i) . Propriedades são poderosas em C #.

Uma propriedade não cria implicitamente um campo privado em C #. Essa é a implementação padrão de um auto-property , por exemplo, public string MyString { get; set;} - no entanto, uma propriedade que define a lógica personalizada no método get não gera um campo privado implícito.

Por fim, como as interfaces estão relacionadas à API pública , o que seria importante se a implementação de uma propriedade de interface dependesse de um campo privado - implícito ou não? Isso está escondido dos consumidores da interface, independentemente disso.

    
por 23.07.2014 / 23:13
fonte
9

Propriedades são métodos! Um campo de apoio será adicionado à classe que implementa a interface (manualmente ou através de uma propriedade automática).

    
por 23.07.2014 / 23:15
fonte