在C#中,是什么使字段与属性不同?何时应该使用字段而不是属性?
当前回答
我将举几个使用财产的示例,这些属性可能会使齿轮转动:
惰性初始化:如果您有一个对象的属性,该属性的加载成本很高,但在正常运行代码时无法访问,则可以通过该属性延迟加载。这样,它就只是坐在那里,但当另一个模块第一次尝试调用该属性时,它会检查基础字段是否为空-如果为空,它会继续加载它,调用模块不知道。这可以大大加快对象初始化。肮脏追踪:这是我从StackOverflow上的问题中了解到的。当我有很多对象的值可能在运行期间发生了变化时,我可以使用该属性来跟踪它们是否需要保存回数据库。如果对象的任何一个属性都没有改变,IsDirty标志都不会被触发,因此保存功能在决定需要返回数据库时会跳过它。
其他回答
财产显示字段。字段应该(几乎总是)对类保持私有,并通过get和set财产进行访问。财产提供了一个抽象级别,允许您更改字段,同时不影响使用类的事物访问字段的外部方式。
public class MyClass
{
// this is a field. It is private to your class and stores the actual data.
private string _myField;
// this is a property. When accessed it uses the underlying field,
// but only exposes the contract, which will not be affected by the underlying field
public string MyProperty
{
get
{
return _myField;
}
set
{
_myField = value;
}
}
// This is an AutoProperty (C# 3.0 and higher) - which is a shorthand syntax
// used to generate a private field for you
public int AnotherProperty { get; set; }
}
@Kent指出,财产不需要封装字段,它们可以对其他字段进行计算,也可以用于其他目的。
@GSS指出,您还可以在访问属性时执行其他逻辑,例如验证,这是另一个有用的功能。
字段是类中的变量。字段是可以通过使用访问修饰符封装的数据。
财产与字段类似,它们定义与对象关联的状态和数据。
与字段不同,属性有一种特殊的语法来控制用户如何读取数据和写入数据,这些被称为get和set运算符。集合逻辑通常可用于进行验证。
财产用于显示字段。它们使用访问器(set、get),通过这些访问器可以读取、写入或操作私有字段的值。
财产不指定存储位置。相反,它们具有读取、写入或计算其值的访问器。
使用财产,我们可以对字段上设置的数据类型进行验证。
例如,我们有一个私有整数字段age,我们应该允许正值,因为age不能为负值。
我们可以使用getter和setter以及使用property两种方式来实现这一点。
Using Getter and Setter
// field
private int _age;
// setter
public void set(int age){
if (age <=0)
throw new Exception();
this._age = age;
}
// getter
public int get (){
return this._age;
}
Now using property we can do the same thing. In the value is a key word
private int _age;
public int Age{
get{
return this._age;
}
set{
if (value <= 0)
throw new Exception()
}
}
如果我们在get和set访问器中没有逻辑,我们可以使用自动实现的属性。
当使用自动实现的属性编译时,将创建一个只能通过get和set访问器访问的私有匿名字段。
public int Age{get;set;}
抽象财产抽象类可以具有抽象属性,该属性应在派生类中实现
public abstract class Person
{
public abstract string Name
{
get;
set;
}
public abstract int Age
{
get;
set;
}
}
// overriden something like this
// Declare a Name property of type string:
public override string Name
{
get
{
return name;
}
set
{
name = value;
}
}
我们可以私下设置房产在这种情况下,我们可以私下设置auto属性(在类中设置)
public int MyProperty
{
get; private set;
}
您可以使用此代码实现相同的效果。在该属性集中,由于我们必须直接将值设置为字段,因此功能不可用。
private int myProperty;
public int MyProperty
{
get { return myProperty; }
}
其他信息:默认情况下,get和set访问器与属性本身一样可访问。通过对访问器应用更严格的访问修饰符,可以分别控制/限制访问器的可访问性(对于get和set)。
例子:
public string Name
{
get
{
return name;
}
protected set
{
name = value;
}
}
这里get仍然是公共访问的(因为属性是公共的),但set是受保护的(一个更受限制的访问说明符)。
财产封装字段,从而使您能够对要设置或检索的值执行附加处理。如果您不需要对字段值进行任何预处理或后处理,那么使用财产通常是过分的。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何创建类属性?
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?