变量和属性之间的差异?

时间:2011-02-17 10:21:44

标签: c# variables properties

  

可能重复:
  What is the difference between a field and a property in C#?

我想知道变量和属性之间的区别。任何一个解释

3 个答案:

答案 0 :(得分:3)

属性实际上是一个带有get方法和set方法的特殊函数。 get和set方法可以提供一些逻辑,比如字段不能验证。

您可以使用私人字段支持您的媒体资源,例如

private int age;

public int Age
{
    get { return age; }
    set
    {
        if (value < 0)
             throw new ArgumentException("Must be > 0");
        age = value;
    }
}

您也可以只实现get部分并计算结果

private int a;
private int b;

public int Sum
{
    return a + b;
}

答案 1 :(得分:2)

您无法验证存储在变量中的数据,但可以在属性中验证。 Propery更像是一种方法,因为它具有get&amp;您定义用于处理数据的set方法。

它们在数据绑定中也很有用。

属性公开字段。字段应该(几乎总是)保持对类的私有,并通过get和set属性进行访问。属性提供了一个抽象级别,允许您更改字段,同时不影响使用您的类的东西访问它们的外部方式。


实施例

就像出生日期一样。您需要验证年龄是否低于今天的日期:

在字段中,这是有效的:

DateTime age = new DateTime(2012,12,1);//1 december 2012

但是在一个属性中你可以验证它:

private DateTime _dob;
public DateTime dob
{
    get
    {
        if(_dob!= null) return _dob;
    }
    set
    {
        if(DateTime.Compare(value, DateTime.Today) <= 0)
        {
             _dob= value;
        }
        else
        {
               throw new System.InvalidOperationException("Date of Birth should be less then today's date");
        }
    }
}

答案 2 :(得分:2)

属性或“自动属性”只是编写完整实现的一种更简单的方法。这是一种使代码更易读,更易于管理的方法。

在方法之外的类中,C#中的field可能如下所示:

private object _obj;

但是,如果您想将此“公开”给使用您的课程的其他课程,您不仅要将其public。因为这不会让你控制它设置的值。

因此,对于此特定getter,您可能需要setterfield

实现这一点的一种方法,以及在大多数其他语言中非常常见的方法是使用两种方法:

<强>吸气剂

public object getObj() { return _obj; }

<强>设置器

public void setObj(object value) { _obj = value; }

但是,为所有fields执行此操作会产生许多您不需要的行,这是一个微不足道的问题,因此C#将通过为您提供定义“属性”的方法来帮助您

C#1.0中的属性

在C#1.0中你写了一个这样的属性:

private object _obj;
public object Obj
{
    get { return _obj; }
    set { _obj = value; }
}

你仍然需要private field,这仍然是一个开销。

C#2.0及更高版本中的属性

在C#的更高版本中,您可以让自己更轻松,在C#2.0中,您可以编写如下内容:

public object Obj { get; set; }

哪会在你的IL中自动生成上述内容,最终看起来与使用方法时的第一个示例相同。

在C#3.0中,一个问题已经解决了,你如何创建一个公共getter而不是私有的setter?

现在你可以像这样写:

public object Obj { get; private set; }

这将让您公开对象,但让它只读! (不是真正的只读,因为你可以在你的课堂内操作它。)

如此简单地解释,字段是在类内部或外部暴露的变量,但是您无法控制直接访问它的人决定将其设置为的值。

属性是一种向您的字段公开setter / getters的方法,可以更轻松地管理您的字段输入/输出。