C#中"get"和"set"属性的目的是什么?

Tec*_*Guy 7 c# asp.net c#-4.0

我看到一些get set方法来设置值.有谁能告诉我这个的目的?

public string HTTP_USER_NAME
{
      get 
      {
            return UserName; 
      }
      set 
      {
            UserName = value; 
      }
}

public string HTTP_USER_PASSWORD
{
      get 
      {
            return UserPwd; 
      }
      set 
      {
            UserPwd = value; 
      }
}
Run Code Online (Sandbox Code Playgroud)

其实为什么要用这些东西.对于全球访问,还是有其他原因导致此类事情?

Jup*_*aol 16

它们只是访问者和变异者.这就是在C#中实现属性的方式

在C#3中,您可以使用如下自动实现的属性:

public int MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

这段代码由编译器自动翻译成类似于你发布的代码,这段代码更容易声明属性,如果你不想在set或者get方法中实现自定义逻辑,它们是理想的,你甚至可以使用不同的代码set使该属性不可变的方法的访问器

public int MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,MyProperty将只在声明它的类之外读取,唯一的变异方法是通过公开方法来完成它或仅通过类的构造函数.当您想要控制并明确实体的状态更改时,这非常有用

当你想为属性添加一些逻辑时,你需要手动编写属性来实现getset你发布的方法一样:

实现自定义逻辑的示例

private int myProperty;
public int MyProperty
{
   get
   {
       return this.myProperty;
   }
   set
   {
       if(this.myProperty <=5)
          throw new ArgumentOutOfRangeException("bad user");
       this.myProperty = value;
   }
}
Run Code Online (Sandbox Code Playgroud)


小智 10

看起来好像你理解了getter和setter的功能,而其他人回答了这个问题."普通"类变量(没有getter和setter)称为"fields","properties"(具有getter和setter)封装字段.

属性的目的是控制对字段的外部访问.如果您希望变量对外部逻辑是只读的,则可以省略setter,如下所示:

private int dataID;

public int DataID {
    get { return dataID; }
}
Run Code Online (Sandbox Code Playgroud)

您还可以将setter设置为private,并实现相同的只读功能.

如果对象有可能为null(无论出于何种原因),则可以保证实例始终存在,如下所示:

private Object instance;

public Object Instance {
    get {
        if (instance == null)
            instance = new Object();
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

属性的另一个用途是定义索引器.

//in class named DataSet

private List<int> members;

public int this[int index] {
    get { return members[index]; }
}
Run Code Online (Sandbox Code Playgroud)

在定义了索引器的情况下,您可以像这样访问DataSet的实例:

int member = dataSet[3];
Run Code Online (Sandbox Code Playgroud)