1. ホーム
  2. c#

[解決済み] ゲッター、セッター、プロパティのベストプラクティス。JavaとC#の比較

2023-01-26 17:26:39

質問

私は今C#のクラスを取っていて、物事を行うための最良の方法を見つけようとしています。私は Java のバックグラウンドを持っているので、Java のベストプラクティスのみを知っています。

Javaでは、もし私がプライベートプロパティを持っているならば、私はこれを行います。

private String name;

public void setName(String name) {
   this.name = name;
}

public String getName() {
   return this.name;
}

C#では、いろいろなやり方があるようですね。

Javaみたいにできるんだ。

private string name;

public void setName(string name) {
   this.name = name;
}

public string getName() {
   return this.name;
}

あるいは、このようにすることもできます。

private string name;

public string Name {
   get { return name; }
   set { name = value; }
}

または

public string Name { get; set; }

どれを使うべきか、またそれぞれのアプローチに関わる注意点や微妙な点は何でしょうか?クラスを作成するとき、私はJavaから知っている一般的なベストプラクティスに従います(特にEffective Javaを読んで)。例えば、私は不変性(必要なときだけセッターを提供する)を好んでいます。これらのプラクティスが C# でセッターとゲッターを提供するさまざまな方法とどのように適合するのか、基本的に、Java の世界でのベストプラクティスを C# にどのように翻訳すればよいのでしょうか。

EDIT

Jon Skeetさんの回答へのコメントとして投稿していたのですが、長くなってしまったので。

非自明なプロパティ(すなわち、おそらく重要な処理と検証を伴う)についてはどうでしょうか? パブリック プロパティを通じて公開することは可能ですが、ロジックを getset ? なぜ、専用のセッターとゲッターメソッド(関連する処理と検証ロジック付き)を持つことよりも、これを行う必要があるのでしょうか?

どのように解決するのですか?

プレC# 6

このうち最後のものは、些細なプロパティのために使うことにします。なお、私はこれを パブリック プロパティと呼ぶことにします。

不変性は自動実装されたプロパティでは少し厄介です。ゲッターだけを持つ自動プロパティは書けません。最も近いのは

public string Foo { get; private set; }

本当に というのは、クラスの外では不変であるからです。そのため 本当の の読み取り専用プロパティを使用するとよいでしょう。

private readonly string foo;
public string Foo { get { return foo; } }

を書くのは絶対にやめましょう。 getName()setName() . で いくつかの の場合、プロパティを使用するよりも Get/Set メソッドを書く方が理にかなっています。特に、プロパティが高価である可能性があり、それを強調したい場合です。しかし、メソッドについては .NET の命名規則である PascalCase に従いたいでしょうし、このような些細なプロパティは通常のメソッドで実装されたくはないでしょう - ここではプロパティがより一般的です。

C# 6

万歳!ついに適切な読み取り専用の自動実装プロパティを手に入れました。

// This can only be assigned to within the constructor
public string Foo { get; }

同様に、読み取り専用のプロパティで を行う が必要な読み取り専用のプロパティには、メンバーボディプロパティを使用することができます。

public double Area => height * width;