C#では、次のコードが有効です
interface I{
int property{get;set;}
}
これは私には意味がありません。これは、インターフェースの最も重要な原則の1つ、つまり状態の欠如(つまり、フィールドなし)を破っているようです。プロパティは暗黙のプライベートフィールドを作成しませんか?それはインターフェースにとって本当に悪いことではないでしょうか?
C#では、次のコードが有効です
interface I{
int property{get;set;}
}
これは私には意味がありません。これは、インターフェースの最も重要な原則の1つ、つまり状態の欠如(つまり、フィールドなし)を破っているようです。プロパティは暗黙のプライベートフィールドを作成しませんか?それはインターフェースにとって本当に悪いことではないでしょうか?
回答:
紛らわしい部分はint Property { get; set; }
、クラス内に記述した場合、暗黙のバッキングフィールドを持つ自動プロパティだということです。
ただし、インターフェイスにまったく同じことを記述した場合、それはauto-propertyではなく、プロパティがインターフェイスの一部であり、インターフェイスを実装するすべての型がそのプロパティを含む必要があることを宣言するだけです(auto-propertyまたは)、ただし、バッキングフィールドは作成されません。
違いを確認する1つの方法は、次のように記述することint Property { get; }
です。これはインターフェイスで有効であり、ゲッターのみを持ちセッターを持たないプロパティを宣言します。ただし、自動プロパティにはセッターが必要なため、クラスでコンパイルされません(C#6.0を使用している場合を除く)。
示したようにプロパティを定義することは、メソッドint GetProperty()
とを定義することと同じvoid SetProperty(int i)
です。プロパティはC#の強力な略記です。
プロパティは、C#でプライベートフィールドを暗黙的に作成しません。auto-property
たとえば、これはのデフォルトの実装ですpublic string MyString { get; set;}
-ただし、get
メソッドのカスタムロジックを定義するプロパティは、暗黙的なプライベートフィールドを生成しません。
最後に、インターフェイスはパブリック APIに関係しているので、インターフェイスプロパティの実装がプライベートフィールドに依存している場合、それが暗黙的であるかそうでないかは重要ですか?それは、インターフェースのコンシューマーには関係なく隠されています。
プロパティはメソッドです!インターフェースを実装するクラスにバッキングフィールドが追加されます(手動または自動プロパティを使用)。