在需求变更中,属性比数据成员更容易修改,例:客户对象不该与空白名称,若你使用公有属性封装Name,那么现在修改一处,而数据成员则可能要修改多处

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

因为属性是使用方法实现的,所以添加多线程支持也非常简单

public class Customer
{
private object syncHandle = new object(); private string name;
public string Name
{
get
{
lock(syncHandle)
return name;
}
set
{
if(string.IsNullOrEmpty(value))
throw new ArgumentException("Name can not be blank","Name");
lock(syncHandle)
name = value;
}
}
}

属性还可以拥有方法所有语言特性。例如:属性可以为虚的(virtual):

public class Customer
{
public virtual string Name { get; set; }
}

还可以将属性声明为抽象的(abstract),以类似隐式属性语法的形式将其定义在接口中

public interface INameValuePair<T>
{
string Name { get;set; }
T Value { get;set; }
}

还可以为get和set访问器定制不同的访问权限

public class Customer
{
public virtual string Name
{
get;
protected set;
}
}

还可以使用索引器(即支持参数的属性)

public int this[int index]
{
get { return theValues[index]; }
set { theValues[index] = value; }
}
//使用索引器
int value = someObject[1];

需要注意的是,所有的索引器都使用this关键字声明。C#不支持为索引器命名。因此,类型中每个不同的索引器都必须有不同的参数列表,以免混淆。

属性的功能很强大,但最后需要注意的是,如果之前是用数据成员实现,后面再改为属性,不能单一的编译一个程序集,必须把引用这个数据成员的所有程序集都重新编译。因为属性访问和数据访问会生成不同MSIL指令。

《C#高效编程》读书笔记01-使用属性而不是可访问的数据成员的更多相关文章

  1. 《Effective C#》读书笔记-1.C# 语言习惯-1.使用属性而不是可访问的数据成员

    思维导图: 大纲: 1.使用属性而不是可访问的数据成员    属性        指定不同的访问权限        隐式属性降低了声明属性的工作量        允许将数据成员作为公共接口的一部分暴露 ...

  2. 改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)

    改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员 序 为什么我们的程序运行得棒棒的,还要改呢?Why? 答:我们要让程序运行得更快,执行的效率更高,代码的可读性更强,维护的成本更低.. ...

  3. [读书笔记]Linux命令行与shell编程读书笔记01

    1. Linux的组成部分 1)linux内核(kernel) 2)GNU工具链 3)GUI/CLI工作几面(shell) 4)应用程序(app) 2Linux内核的主要工作: 1) 管理内存 2)管 ...

  4. 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化

    <深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...

  5. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  6. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  7. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  8. 《The Linux Command Line》 读书笔记01 基本命令介绍

    <The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...

  9. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

随机推荐

  1. dubbo的扩展点重构

    可扩展设计是框架要重点考虑的设计,因为它直接影响到框架的稳定性和功能的扩展,Dubbo扩展点重构.它在扩展性设计上踩过的坑,值得框架设计者借鉴学习. 第一步,微核心,插件式,平等对待第三方 即然要扩展 ...

  2. 《c# 实现p2p文件分享与传输系统》 二、 设计

    c#实现P2P文件分享与传输系统 二.设计 在上一篇文章中,介绍了P2P网络的常用模型,并确定了EasyP2P系统的框架,本文将就此设计完成它的主要结构和运作流程. 1. 首先是Tracker Ser ...

  3. Mysql 5.7.18忘记密码

    5.7.18密码修改发生了变化,旧版的方法不再奏效. 1. ps -ef | grep mysqld,kill掉启动的mysql服务: 2. 创建/etc/my.cnf,添加: [mysqld] sk ...

  4. 洛谷P1525关押罪犯——二分做法

    题目:https://www.luogu.org/problemnew/show/P1525 二分答案,二分图染色判断是否可行. 代码如下: #include<iostream> #inc ...

  5. Happy Great BG-卡精度

    Happy Great BG Time Limit: 2000ms Case Time Limit: 2000ms Memory Limit: 65536KB   64-bit integer IO ...

  6. The specified named connection is either not found in the configuration, not intended to be used

    今天用EF遇到一个问题, The specified named connection is either not found in the configuration, not intended t ...

  7. Mysql 创建存储过程 更新表

    DELIMITER // use protocoldb// drop procedure if exists sp_protocol_Update// create procedure sp_prot ...

  8. Arduino 视频教程

    http://v.youku.com/v_show/id_XNDU1MjI4MzA4.html?from=y1.2-1-176.3.12-2.1-1-1-11

  9. JSP环境探针-当前电脑所有系统参数

    1 <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.u ...

  10. linux中syslog自定义存储路径的方法

    方法一: 1. su  //切换到root用户下2. cp /etc/sysconfig/rsyslog /etc/sysconfig/rsyslogbak //备份vim /etc/sysconfi ...