重複の可能性:
C#.NET3.5以降のプロパティとフィールドの違い
使用の違いは何ですか
public string Username { get; set; }
と使用
public string Username;
私はいつも最初のものを使用していますが、2つの間に違いがあるかどうか、および一方が他方よりも優先する必要があるシナリオを理解したいと思いました。
重複の可能性:
C#.NET3.5以降のプロパティとフィールドの違い
使用の違いは何ですか
public string Username { get; set; }
と使用
public string Username;
私はいつも最初のものを使用していますが、2つの間に違いがあるかどうか、および一方が他方よりも優先する必要があるシナリオを理解したいと思いました。
public string Username { get; set; }
その間
public string Username;
より多くの比較のために、
その他のリンク
フィールドでは実行できないプロパティで実行できることの1つは、setterまたはgetterのいずれかの可視性を制限することです。
public string MyProperty { get; private set; }
私がよく使うもの。
そして、フィールドではできない(より強力な)何かは、インターフェース内でフィールドを定義することです。クラスの実装に特定のプロパティを持たせる必要があるインターフェイスが必要だとします。
public interface MyInterface
{
string MyProperty { get; }
}
ここにセッターは必要ないことに注意してください。MyPropertyをどのように設定するかを決定するのは、完全にクラスの実装次第です。
これは、単に文字列を使用するのではなく、文字列プロパティを使用できる1つの方法の非常に小さな例です。
次のようなプライベート変数があるとします。
private string _name;
ここで、その文字列を読み取り専用にしたいとしましょう。つまり、値を変更することはできません。次を使用できます。
public string Name
{
get { return _name; }
}
それはあなたがその値へのアクセスを制御することを可能にすることができます。または、次のことを実行する場合にのみ変数を書き込むことができるようにすることもできます。
public string Name
{
set { _name = value; }
}
これを組み合わせると、値に設定したり、単に値を取得したりできるようになります。以下を参照してください。
public string Name
{
get { return _name; }
set { _name = value; }
}
もちろん、通常の文字列でも同じことができるように見えるので、それが何を意味するのか疑問に思われるかもしれませんが、これは、そのクラスから派生していない外部クラスからの_name変数への直接アクセスを制御します。
では、その値の設定方法を制御したい場合はどうでしょうか。計算を実行したい場合、またはその値にプレフィックスまたはサフィックスを追加したい場合はどうなりますか?次のことを行います。
public string Name
{
get
{
return _name;
}
set
{
if (value.ToLower() == "bilbo")
_name = "Bilbo Baggins";
}
}
これで、クラスのNameプロパティをbilboに設定すると、プロパティをAmyに設定した場合とは対照的に、_nameの値はBilbo Bagginsに設定され、_name変数には単純にamyが含まれます。
これを行うと、プロパティが設定されている値が自動的に大文字または小文字になることが保証されます。あるいは、値などの検証を行うことができます。
これがプロパティの使用法と、プロパティを複雑にしすぎずにどのように役立つかを説明していることを願っています。
プロパティは、特に.NETでより柔軟性を提供します。C#はプロパティへのバイアスを示しているので、それを覚えておいてください。ただし、原則として、取得または設定に「処理」または付随するアクションが必要な場合は、アクセサー/ミューテーターを使用してください。値を保持するためにフィールドを使用します。例えば、
public class Name
{
public string First;
public string Last;
public string Full{ get { return this.First + " " + this.Last; } }
}