可能重复:
What is the difference between a field and a property in C#?
我想知道变量和属性之间的区别。任何一个解释
答案 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
,您可能需要setter
和field
。
实现这一点的一种方法,以及在大多数其他语言中非常常见的方法是使用两种方法:
<强>吸气剂强>
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的方法,可以更轻松地管理您的字段输入/输出。