为了正确封装,我应该使用带有Java手动getter方法的私有属性:
public class Foo {
private int Prop { get; set; }
public Foo
{
Prop = 1;
}
public int GetProp()
{
return Prop;
}
}
或者我应该只使用公共财产?
public class Foo {
public int Prop { get; private set; }
public Foo
{
Prop = 1;
}
}
答案 0 :(得分:2)
属性是在C#中创建getter和setter的方式,因此没有理由像在Java中那样创建getter方法。
换句话说:你应该使用第二个例子。
答案 1 :(得分:0)
通常,正确的方法是:
private int prop;
public int Prop
{
get { return prop; }
set { prop = value; } //do other stuff within set if needed.
}
通过这种方式,您可以访问所有内容,但如果需要,仍然可以执行自定义操作(通常是NotifyPropertyChanged)。
答案 2 :(得分:0)
属性只是c#中get_PropertyName
和set_PropertyName
方法的语法糖。
public class Foo
{
public int Prop { get; private set; }
}
相当于:
public class Foo
{
private int _prop;
private void set_prop(int value) { _prop = value; }
public int get_prop() { return _prop; }
}
最好在可能的情况下使用自动属性,并在需要将逻辑添加到各个字段的getter / setter时使用带有支持字段的属性。
如果属性将是private
,就像在第一个示例中那样,您应该只使用一个字段。
答案 3 :(得分:0)
属性的要点通常是你有一个get和set函数,它可以像变量一样使用。你的第一个例子真的很奇怪 - 为什么不让公开的吸气剂? Readonly和Writeonly属性并不罕见:
@WithJwt

关于Backing字段的一个重要规则:非常重要的是不要混淆Property及其支持字段,尤其是在类代码中。如果使用自动实现属性,则该危险不存在。如果您的代码比这更复杂,通常的方法是在支持字段名称后附加下划线(_)。道具/道具很容易混淆。 _Prop和Prop非常难以混淆,特别是自动完成功能。
答案 4 :(得分:0)
通常,方法表示操作,属性表示数据。虽然两个示例都可以相同地使用,但表示状态的“正确”方式是通过属性,并且使用属性正确地告诉消费者您的对象这表示状态,而不是动作。
您还应该考虑序列化和智能感知之类的东西是期望属性而不是方法。