原则一:始终能的使用属性(property),而不是可直接访问的Data Member
    Always use properties instead of accessible data members.

为什么要使用属性:

1.Net的data binding只支持Property,而不支持public data member的访问

Data binding的目的就是把一个object的Property绑定到一个用户界面的control上,web control或者windows form control. Data binding是通过reflection来实现的,

如下例: textBoxCity.DataBindings.Add("Text", address, "City");

这段code就是把textBoxCity的Text Property绑定到address这个object的City Property上。

如果你把address的City Property改成public data member,这段code是不会运行的。

2.当有新的需求时,通过修改Property的实现方法来适应这个新的需求,要比在你的程序里修改所有的public data member去适应这个需求容易太多了。

比如说你以前定义了一个类customer,现在你发现由于当初的粗心没有强制customer姓名不能为空,如果你使用了Property,你可以非常轻松的添加一个检查机制,

如下面这段code:

 public class Customer
{
private string name;
public string Name
{
get
{
return name;
}
set
{
if ((value == null) || (value.Length == )) {
throw new ArgumentException("Name can not be blank", "Name");
}
name = value;
}
}
//...
}

如果你使用了public data member,你就要找遍你的程序,在每个地方都修改

3.Property是用methods实现的,所以添加multi-threaded的支持是非常方便的。

比如想要添加同步访问的支持:

 public class Customer
{
private string name;
public string Name
{
get
{
lock (this)
{
return name;
}
}
set
{
lock (this)
{
name = value;
}
}
}
}

4..Property是用methods实现的,所以它拥有methods所拥有的一切。Property可以被定义为virtual:

你也可以把Property扩展为abstract,甚至成为interface的一部分。

总结:

总而言之,当你想让你类内部的数据被外界访问到时(不管是public还是protected),一定要用Property。

对于序列和字典,使用indexer。你类的data member永远应该是private,绝无例外。

使用Property,你可以得到如下好处:

1.Data binding支持

2.对于需求变化有更强的适应性,更方便的修改实现方法

记住,现在多花1分钟使用Property,会在你修改程序以适应设计变化时,为你节约n小时。

Effective C# 学习笔记(原则一:始终能的使用属性(property),而不是可直接访问的Data Member)的更多相关文章

  1. Effective C# 学习笔记(原则二:为你的常量选择readonly而不是const)

    原则二.为你的常量选择readonly而不是const      Prefer readonly to const 对于常量,C#里面有两个不同的版本:运行时常量(readonly)和编译时常量(co ...

  2. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  3. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  4. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  6. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  7. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  9. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

随机推荐

  1. vc读写注册表

    注册表是Windows重要组成部分,注册表记录了大量有关电脑软硬件的信息.注册表中的值通过其名称标识.值名称由与键名相同的字符组成.值本身可以是字符串.二进制数据或者是32位无符号值.在这里我们主要运 ...

  2. Iptables 防火墙开放常见的22,53,80端口

    用iptables防火墙 iptables -F # 允许包从22端口进入 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许从22端口进入的包返回 ...

  3. unity3d学习重点记录

    本文主要是记录在学习unity3d中遇到的重点功能的实现,以及一些API的使用方法.以便在以后使用到的时候查找. 1,给一个UIButton添加执行的事件 // Use this for initia ...

  4. yii学习小结

    对yii框架搭建的平台运维过程中,会不断地发现很多新的特性和问题,现一一记录下来,便于后续学习~ 1.日志  在/runtime目录中    参考:http://www.cnblogs.com/you ...

  5. 应用OpenCV进行OCR字符识别

    opencv自带一个字符识别的例子,它的重点不是OCR字符识别,而主要是演示机器学习的应用.它应用的是UCI提供的字符数据(特征数据). DAMILES在网上发布了一个应用OpenCV进行OCR的例子 ...

  6. c# 将页面导出到word(含图片及控件)

    /// <summary> /// 创建word /// <param name="filePath">文件路径 </param> /// &l ...

  7. 设置lable文本内容的行间距

    NSMutableParagraphStyle *paragraphStyle =[ [NSMutableParagraphStyle alloc] init]; paragraphStyle.lin ...

  8. (笔记)angular material 选项卡用法

  9. Secure your iPhone with 6 digit passcode by upgrading to iOS9

    IP-Box could crack 4 digit passcode, what about 6 digit passcode??? All you need to do is to upgrade ...

  10. fstab

    开机后,挂载windows盘失败, 进入了一个检测shell,该shell下是以只读方式挂载根分区的,要使fstab可写,要执行mount -o remount,rw / /etc/fstab文件的解 ...