如上面所说的,这是面向对象的一个基本要求,至于为什么这样做么,有2个原因。 1.这样写,日后便于升级维护,例如public class Employee { public int age; }Employee a = new Employee(); a.age = 100;//如果到了明年,我需要统一更新所有员工的年龄。//如果用属性,就会很方便 public class Employee { public readonly DateTime birthday; public int age { get { return (DateTime.Now - birthday).Days;} } }这样你任何时候访问age都不会有问题,也不需要更新,你也许会注意到birthday不是属性,事实上,那个标准是尽量的要求达到,个人还是觉得没必要所有都用属性,毕竟那样会慢一点。相当于一个函数调用嘛。但是,是不是我先写成成员变量,日后需要时候再修改为属性就可以了呢?不是!这就是第二个用属性的原因。 2.属性被编译器转换为函数调用,而成员变量则是个直接访问。 问题在哪里呢,如果你写了一个dll给别人,有一天,你吧变量修改为属性了。你认为你这样高明的做法是最小化改动么?你错了,使用你dll的人需要重新编译,否则无法使用的,因为对dll来说,编译后,你原本是变量的引用,被修改成函数调用了。在没有重新编译调用你dll的程序时,程序将依然用读取变量的方式来访问,而你的变量已经不存在,变成属性了。导致扩展性不好。处于这一点,还是尽量的使用属性。
尽量用属性,字段全部用私有等,不要直接暴露在外面,属性可以一个简单的应用是验证有效性 比如 public int aaa; 这个 obj.aaa="1000";//直接暴露了,如果只想0-100之间,不像让别人直接这样用,太不安全 这样 private int aaa; Public int AAA { set{if(判断下value值)然后在赋值给aaa;} }
C#使用属性有以下几点好处: 1.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不 被支持的内容。看看.net里的属性面板,你会明白的。 2、数据安全性检测; 属性本质上是两个函数,只是因为C#的特殊语法,但我们可以像访问成员一样的访问它。因此我们可以 在属性设计上添加更多更灵活的内容,对属性进行管理。其中对属性数据的检测是其中之一。 在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决 如在这 private string _name; public String Name { get { return this._name; } set { if(条件) { 如果不满足条件可以跑出异常 esle this._name = value; } } }3、线程同步 对实例的属性可以进行线程同步,而与访问者无关 4、属性可以是抽象的,而数据成员不能是抽象的,这为我们设计出兼容性更强,扩展性更强的类提供了好 的解决方案。 5、属性可以以接口的形式表现。接口里不能定义数据成员,这在一定程度上限制我们的设计。请用属性来 解决这个问题吧。 6基于属性可以实现索引器
不直接把类成员对外界公开。
属性可以完成封装。数据绑定, ORM都需要用到属性。而且这正是他做最合适的事。楼主注意结帖率。
把所有的字段都设为私有字段,则把它们封装成属性,字段就是作用于整个类的变量。
属性的实质是方法(get和set方法),数据安全
1.这样写,日后便于升级维护,例如public class Employee
{
public int age;
}Employee a = new Employee();
a.age = 100;//如果到了明年,我需要统一更新所有员工的年龄。//如果用属性,就会很方便
public class Employee
{
public readonly DateTime birthday;
public int age { get { return (DateTime.Now - birthday).Days;} }
}这样你任何时候访问age都不会有问题,也不需要更新,你也许会注意到birthday不是属性,事实上,那个标准是尽量的要求达到,个人还是觉得没必要所有都用属性,毕竟那样会慢一点。相当于一个函数调用嘛。但是,是不是我先写成成员变量,日后需要时候再修改为属性就可以了呢?不是!这就是第二个用属性的原因。
2.属性被编译器转换为函数调用,而成员变量则是个直接访问。
问题在哪里呢,如果你写了一个dll给别人,有一天,你吧变量修改为属性了。你认为你这样高明的做法是最小化改动么?你错了,使用你dll的人需要重新编译,否则无法使用的,因为对dll来说,编译后,你原本是变量的引用,被修改成函数调用了。在没有重新编译调用你dll的程序时,程序将依然用读取变量的方式来访问,而你的变量已经不存在,变成属性了。导致扩展性不好。处于这一点,还是尽量的使用属性。
比如
public int aaa;
这个
obj.aaa="1000";//直接暴露了,如果只想0-100之间,不像让别人直接这样用,太不安全
这样
private int aaa;
Public int AAA
{
set{if(判断下value值)然后在赋值给aaa;}
}
1.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不
被支持的内容。看看.net里的属性面板,你会明白的。
2、数据安全性检测;
属性本质上是两个函数,只是因为C#的特殊语法,但我们可以像访问成员一样的访问它。因此我们可以
在属性设计上添加更多更灵活的内容,对属性进行管理。其中对属性数据的检测是其中之一。
在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决
如在这
private string _name;
public String Name
{
get
{
return this._name;
}
set
{
if(条件)
{
如果不满足条件可以跑出异常
esle
this._name = value;
}
}
}3、线程同步
对实例的属性可以进行线程同步,而与访问者无关
4、属性可以是抽象的,而数据成员不能是抽象的,这为我们设计出兼容性更强,扩展性更强的类提供了好
的解决方案。
5、属性可以以接口的形式表现。接口里不能定义数据成员,这在一定程度上限制我们的设计。请用属性来
解决这个问题吧。
6基于属性可以实现索引器
虽然直接使用公共成员的效率比使用属性要高那么一点点,但是那种影响是很微不足道的。。
在effective C#中
这作为第一条来讲,可见其重要性了吧。。
以下是简单的属性示例:
public class MyProperty
{
//定义字段
private string _name;
private int _age; //定义属性,实现对_name字段的封装
public string Name
{
get { return (_name == null) ? string.Empty : _name; }
set { _name = value; }
} //定义属性,实现对_age字段的封装
//加入对字段的范围控制
public int Age
{
get { return _age; }
set
{
if ((value > 0) && (value < 150))
{
_age = value;
}
else
{
throw new Exception( "Not a real age");
}
}
}
} public class MyTest
{
public static void Main(string[] args)
{
MyProperty myProperty = new MyProperty();
//触发set访问器
myProperty.Name = "Anytao";
//触发get访问器
Console.WriteLine(myProperty.Name);
myProperty.Age = 66;
Console.WriteLine(myProperty.Age.ToString());
Console.ReadLine();
}
}