我在 c# 中看到过这种代码:
private int id {get;set;}
但我只会为该字段创建 getter,因为如果有 get 并为其设置它与 public 字段相同,唯一的方法是:
public int getId(){return id;}
如何在VS2010中只自动生成getter
我在 c# 中看到过这种代码:
private int id {get;set;}
但我只会为该字段创建 getter,因为如果有 get 并为其设置它与 public 字段相同,唯一的方法是:
public int getId(){return id;}
如何在VS2010中只自动生成getter
你的意思是你如何实现一个只读属性?如果是这样尝试:
public int Id { get; private set;}
你已经实现的被称为Automatic Property
它们看起来像这样:
private string Name { get; set; }
自动属性只是语法糖,实际上,提供了一种简洁、快速的方法来实现此代码:
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
您可以忽略自动属性,使用手动属性并简单地删除get
. get
或者使用自动属性并通过使用 private 访问修饰符标记来使属性的值只读给外部成员:
public string Name { get; private set; }
您说您通常会使用的代码在 C# 中从未真正需要,因为属性实际上只是伪装的方法,应该用作更好的约定:
public int getId(){return id;} //bad
右击字段,重构,封装字段
不,它们不一样。一个属性编译成一个或两个绑定到一个属性的方法。例如:
public int Foo { get; private set; }
编译成这样工作的 IL 代码:
private int _foo;
public int Foo { get_Foo = get, set_Foo = set }
public int get_Foo() { return _foo; }
private void set_Foo(int value) { _foo = value; }
换句话说:属性是方法,而字段不是。这就是为什么您可以执行以下操作:
public int Foo { get { return 0; } }
编译为:
public int Foo { get_Foo = get }
public int get_Foo() { return 0;}
更新
好的,现在我明白了你的问题......答案是最后一部分,它显示了 getter-only 如何工作以及它的作用:-)
我认为您想要一个公开可用的属性,但只能由班级设置。是这样的吗:
public class Entity
{
public void Entity()
{
ID = ...; // Some unique id
}
public int ID { get; private set; }
}
这允许Entity类读取和写入ID,但其他类只能读取ID。