可能重复:
What is Difference between Property and Variable in C#
几个星期前我开始使用C#,这确实让我烦恼。 C#允许这些所谓的“魔术”吸气剂和固定剂,也称为“语法糖”。所以,我可以这样做:
public int myInt { get; set; }
但从封装的角度来看,这是毫无意义的。首先,数据成员是 public ,我可以使用点运算符来获取/设置它。但是,如果我这样做:
private int myInt { get; set; }
我完全无法访问它,如myInt is inaccessible due to protection level
。这实际做什么?我认为这应该是完成数据封装的简单方法,所以我不必这样做:
private int myInt;
public void setMyInt(int i) { myInt = i; }
public int getMyInt() { return myInt; }
但事实并非如此。就像我所知,我只是将这些变量公之于众。我想也许我可以做像
这样的事情 public int myInt { get; }
因此,客户端可以get
,但不能set
,但不是,仍然允许公共访问。什么给出了什么?
修改 我不想做任何具体的事情,我只是想了解这实际上是如何运作的。澄清:
使变量public
无法完成封装,尤其是当我可以使用点运算符访问它时。为private
变量编写getter和setter允许您对变量进行更改,但可以更好地控制实际发生的变化。
答案 0 :(得分:7)
目的是通过将来的修改来保持封装。
如果您最初使用自动getter和setter编写课程:
public int Count { get; set; }
然后,如果您将其更改为
,它将保持完全相同的外部接口public int Count {
get { /* very complicated logic */ }
set { /* even more complicated logic */ }
}
自动启动只是为了帮助您完成简单的属性。
答案 1 :(得分:6)
你正在尝试写
public int MyInt { get; private set; }
编辑:自动实现属性的重点不是提供额外的封装,而是为了避免字段。
如果您使用公共字段(publit int MyInt;
)创建一个类,并且有人使用该字段,则您以后不能将其更改为属性,或者您将破坏使用它的任何已编译程序集。
使用自动属性为您提供与字段相同的简洁性和简洁性,但允许您稍后将其替换为完整的属性(包含其他逻辑)而不会破坏任何内容。
答案 2 :(得分:6)
这个“神奇”的getter和setter就像你调用它们一样,实际上最终会像在Java中一样创建方法。所以Encapsulation is
只是用更清洁的外观来维护,IMO。
属性本身,即使例如声明为public int Property {get;set;}
,实际上还有一个支持字段以及getter
和setter
方法。
见这个人为的例子:
class A
{
public int ID {get;set;}
}
现在,当您执行以下操作时:
A a = new A();
a.ID=5;
生成的IL代码如下所示:
A.get_ID: //getter method
IL_0000: ldarg.0
IL_0001: ldfld UserQuery+A.<ID>k__BackingField
IL_0006: ret
A.set_ID: //setter method
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld UserQuery+A.<ID>k__BackingField
IL_0007: ret
是的,做a.ID=5
; 看起来就像直接访问成员变量一样,但它实际上正在调用一个方法;在这种情况下,set_ID
方法。
答案 3 :(得分:0)
你只是把它公开 - 如果你想指定私人套装,你可以这样做:
int myInt { get; private set; }
答案 4 :(得分:0)
你可以这样做,这非常有用:
public int myInt {get;私人集; }