公共区别{get; set}和编程getter和setter

时间:2012-07-25 14:32:57

标签: c# encapsulation

  

可能重复:
  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允许您对变量进行更改,但可以更好地控制实际发生的变化。

5 个答案:

答案 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;},实际上还有一个支持字段以及gettersetter方法。

见这个人为的例子:

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;私人集; }