|
用字段和方法,确实足以代替属性。只不过问题中的“多此一举”一词,有点偏向贬义词 :)
1、用字段和方法代替属性
比如一个简单的变量访问,外部需要读取名字,但不希望外部修改名字。用一个字符串保存名字很、用一个公开方法获取名字,很方便。
class 学生
{
protected string name;
public string GetName()
{
return name;
}
}
但是变量多了,到处是GetXXX() 并不舒服。用属性清爽多了:
class 学生
{
public string Name { get; protected set; }
}
如果不是单纯的get数据,而是要做一点处理,那么就不能省略变量定义。属性会退化成和函数差不多的写法:
class 学生
{
protected string name;
public string Name
{
get
{
return name + "弟弟";
}
}
}
其实从以上例子看,属性并不是特别必须的东西,没它也行,有它更好。在Unity游戏开发中,我个人觉得属性可用可不用,到底用不用取决于团队的编码规范或个人习惯。
2、在WPF/UWP等程序开发中,属性变得很重要
个人觉得,属性真正的用武之地,是比较复杂的应用程序设计,特别是图形界面方面的开发。
现代图形界面开发,往往需要让变量(字段或属性)直接和界面元素绑定,比如string name直接绑定到界面上的标签,这样给name赋值,界面就会变。
比如搜索框里的文字,直接对应到某个变量。t=“abc”,搜索框里就变成abc
这样就带来一个问题,需要对成员变量name进行简单的封装。在修改它的值时,界面也跟着刷新内容。
而且更进一步,这种变量的绑定还有各种具体情况,有只写的、只读的、会主动变的、只会跟着别的字段变化而变的(依赖性的)。
要想满足这些需求,并且让程序员用着方便,就得封装一些合适的写法,否则一大堆代码看着太头疼了。
所以属性在较复杂的GUI框架设计中变得十分有用,不可或缺。缺了的话可会让代码膨胀很多而且看着很乱。
比如在网上随便摘抄了一段WPF程序:
// 1. 使类型继承DependencyObject(依赖性的对象)
public class Person : DependencyObject
{
// 2. 声明一个静态只读的DependencyProperty 字段
public static readonly DependencyProperty nameProperty;
static Person()
{
// 3. 注册定义的依赖属性
nameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Person),
new PropertyMetadata("Learning Hard",OnValueChanged));
}
// 4. 属性包装器,通过它来读取和设置我们刚才注册的依赖属性
public string Name
{
get { return (string)GetValue(nameProperty); }
set { SetValue(nameProperty, value); }
}
private static void OnValueChanged(DependencyObject dpobj, DependencyPropertyChangedEventArgs e)
{
// 当只发生改变时回调的方法
}
}
虽然看起来繁琐一些,但是这样写的属性可以和界面元素互动,还能添加各种响应事件,实际上节约了很多工作量。
总结:如果在自己写的代码中,用属性或者用字段效果差不多,那完全可以不用。而在某些框架比如WPF中,不得不用属性。
千万不要为了用属性而用属性,完全没必要。但也不需要怀疑它存在的意义。
C#中有大量日常用不到的特性和关键字,但它们确实是为了实际应用而设计的。只不过在不同的开发领域,常用的特性不相同而已。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|