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

时间:2012-05-31 04:11:12

标签: 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; 
      }
}

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

7 个答案:

答案 0 :(得分:16)

它们只是访问者和变异者。这就是在C#

中实现属性的方式

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

public int MyProperty { get; set; }

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

public int MyProperty { get; private set; }

在上一个示例中,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;
   }
}

答案 1 :(得分:10)

似乎你理解了getter和setter的功能,而其他人回答了这个问题。 “Normal”类变量(没有getter和setter)称为“fields”,“properties”(包含getter和setter)封装了字段。

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

private int dataID;

public int DataID {
    get { return dataID; }
}

您还可以将setter设为私有,并实现相同的只读功能。

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

private Object instance;

public Object Instance {
    get {
        if (instance == null)
            instance = new Object();
        return instance;
    }
}

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

//in class named DataSet

private List<int> members;

public int this[int index] {
    get { return members[index]; }
}

定义了索引器后,您可以像这样访问DataSet实例:

int member = dataSet[3];

答案 2 :(得分:3)

检查这些链接,......它们给出了明确的解释。

http://www.dotnetperls.com/property

http://code.anjanesh.net/2008/02/property-getters-setters.html

如果UserName和UserPwd是类变量,最好像这样使用

_userName 
_userPwd

答案 3 :(得分:2)

实施properties in C#的标准方式。 UserNameUserPwd是定义了这两种方法的类的私有成员变量(string类型)。

答案 4 :(得分:2)

HTTP_USER_NAMEHTTP_USER_PASSWORD是您班级的公共属性。 UserNameUserPwd可能是您的私人字段。而且您允许其他人通过这些公共属性设置或获取值。没有直接访问私人的权利。你也可以在属性的get方法中做一些逻辑.Ex:你将有一个名为Age的公共属性,在你的get方法中,你可以读取你的私有字段的值“{{1 “并进行一些计算(CurrentYear-dateOfBirth)并将其作为年龄返回。

答案 5 :(得分:2)

属性只是字段上的访问者。它们允许执行某些操作(如果需要),并提供对字段的受控访问。

如果您想知道何时使用“属性”,以及何时使用“仅”字段,请选中链接Properties vs Fields – Why Does it Matter? (Jonathan Aneja)

答案 6 :(得分:1)

来自Properties (C# Programming Guide)

属性是一种成员,它提供了一种灵活的机制来读取,写入或计算私有字段的值。属性可以像它们是公共数据成员一样使用,但它们实际上是称为访问器的特殊方法。这样可以轻松访问数据,并且仍然有助于提高方法的安全性和灵活性。

在此示例中,TimePeriod类存储时间段。在内部,类以秒为单位存储时间,但名为Hours的属性使客户端能够以小时为单位指定时间。 “小时”属性的访问者执行小时和秒之间的转换。

示例

class TimePeriod
{
    private double seconds;

    public double Hours
    {
        get { return seconds / 3600; }
        set { seconds = value * 3600; }
    }
}


class Program
{
    static void Main()
    {
        TimePeriod t = new TimePeriod();

        // Assigning the Hours property causes the 'set' accessor to be called.
        t.Hours = 24;

        // Evaluating the Hours property causes the 'get' accessor to be called.
        System.Console.WriteLine("Time in hours: " + t.Hours);
    }
}
// Output: Time in hours: 24

属性概述

  • 属性使类能够公开获取和设置值的公共方式,同时隐藏实现或验证代码。

  • get属性访问器用于返回属性值,set访问器用于分配新值。这些访问者可以具有不同的访问级别。有关详细信息,请参阅Restricting Accessor Accessibility (C# Programming Guide)

  • value关键字用于定义设置访问者分配的值。

  • 未实现 set 访问者的属性是只读的。

  • 对于不需要自定义访问者代码的简单属性,请考虑使用自动实现属性的选项。有关详细信息,请参阅Auto-Implemented Properties (C# Programming Guide)