我在C#中见过这样的代码:
private int id {get;set;}
但我只会为该字段创建 getter,因为如果有 get 和 set 则与公共字段相同是唯一的方法是:
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
。或者使用自动属性,并通过使用 private 访问修饰符标记 get
,使属性的值只读给外部成员:
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。