**************************************************************************

书名:《C#高效编程改进C#代码的50个行之有效的办法》

**************************************************************************

第1章 C#语言习惯/1

--------------------------------------------------------------

建议1: 使用属性而不是可访问的数据成员/ 1

--------------------------------------------------------------

  该建议点主要介绍属性的特性以及索引器的使用。

  使用建议:

      1.无论何时需要在类型的公有或保护接口中暴露数据,都应该使用属性。

      2.你也应该使用索引器来暴露序列或字典。

      3.所有的数据成员都应该是私有的,没有任何例外。

  本人测试代码:  

  

  1 /******************************************************************
  2  * 创 建 人:  王申和
  3  * 创建时间:  2012-11-1 15:45
  4  * 描    述:
  5  *             测试属性相关功能:属性特性与索引器
  6  * 环    境:  VS2010
  7 ******************************************************************/
  8 using System;
  9 using System.Collections.Generic;
 10 using System.Linq;
 11 using System.Text;
 12 using System.Threading;
 13
 14 namespace _01_UseProperty
 15 {
 16     class Program
 17     {
 18         static void Main(string[] args)
 19         {
 20             try
 21             {
 22                 var c = new Customer<string>();
 23                 //c.Name = null;
 24                 c.Text = "测试无字段属性";
 25                 Console.WriteLine(c.Text);
 26
 27                 //测试索引器
 28                 c[30] = "测试一维序列索引器";
 29                 Console.WriteLine(c[30]);
 30                 Console.WriteLine(c[120]);
 31
 32                 c["字典1"] = "测试字典索引器";
 33                 Console.WriteLine("内容:" + c["字典2"]);
 34                 Console.WriteLine("内容:" + c["字典1"]);
 35
 36                 Name name = new Name("王", "五");
 37                 c[name] = "测试字典索引器:参数为类";
 38                 Console.WriteLine("内容:" + c[name]);
 39
 40                 c[10, 20, 30] = "测试多维序列索引器";
 41                 Console.WriteLine("内容:" + c[10, 20, 30]);
 42
 43                 c["张", "三"] = "测试多维字典索引器";
 44                 Console.WriteLine("内容:" + c["张", "三"]);
 45
 46                 c[2, "李四"] = "四个人才";
 47                 Console.WriteLine("内容:" + c[2, "李四"]);
 48
 49             }
 50             catch (ArgumentException ex)
 51             {
 52                 Console.WriteLine(ex.Message);
 53             }
 54             Console.ReadLine();
 55         }
 56     }
 57
 58     public class Customer<T>
 59     {
 60         #region 属性两种写法
 61         //尽量不要使用可访问的数据成员,应使用属性
 62         //public string text;
 63
 64         //无字段属性,等同于下面
 65         public string Text { get; set; }
 66
 67         //有字段属性
 68         //private string text;
 69         //public string text
 70         //{
 71         //    get { return text; }
 72         //    set { text = value; }
 73         //}
 74         #endregion
 75
 76         #region 属性为方法,可加异常处理
 77         private string name;
 78         public string Name
 79         {
 80             get { return name; }
 81             set
 82             {
 83                 if (string.IsNullOrEmpty(value))
 84                     throw new ArgumentException("Name cannot be blank", "Name");
 85                 name = value;
 86             }
 87         }
 88         #endregion
 89
 90         #region 属性支持interface、virtual、abstract(属性拥有方法的所有语言特性)
 91         public interface INameValuePair<T>
 92         {
 93             string Name { get; }
 94             T Value { get; set; }
 95         }
 96
 97         public virtual string vtest
 98         {
 99             get;
100             protected set;
101         }
102
103         public abstract class AbsClass
104         {
105             public abstract string atest { get; set; }
106         }
107         #endregion
108
109         #region 支持多线程:访问器中增加锁
110         private object Sync = new object();
111         private int count;
112         public int Count
113         {
114             get
115             {
116                 lock (Sync)
117                     return count;
118             }
119             set
120             {
121                 lock (Sync)
122                     count = value;
123             }
124         }
125         #endregion
126
127         #region 属性索引器
128         //1.索引器都使用this关键字声明。C#不支持为索引器命名
129         //2.索引器是属性的一种,它本质上和属性一样是方法。
130         //3.索引器可以重载,因此一个类中可以有多个索引器。
131
132         //一维序列索引器,注意索引器范围
133         string[] theValues = new string[100];
134         public string this[int index]
135         {
136             get
137             {
138                 if (index > 99)
139                     return default(string);
140                 return theValues[index];
141             }
142             set { theValues[index] = value; }
143         }
144
145         //字典索引器
146         Dictionary<T, T> dic = new Dictionary<T, T>();
147         public T this[T key]
148         {
149             get
150             {
151                 if (!dic.ContainsKey(key))
152                     return default(T);
153                 return dic[key];
154             }
155             set { dic[key] = value; }
156         }
157
158         //字典索引器:参数为类
159         Dictionary<Name, T> dicClass = new Dictionary<Name, T>();
160         public T this[Name key]
161         {
162             get
163             {
164                 if (!dicClass.ContainsKey(key))
165                     return default(T);
166                 return dicClass[key];
167             }
168             set { dicClass[key] = value; }
169         }
170
171         //多维序列索引器
172         T[, ,] multArray = new T[100, 100, 100];
173         public T this[int x, int y, int z]
174         {
175             get { return multArray[x, y, z]; }
176             set { multArray[x, y, z] = value; }
177         }
178
179         //多维字典索引:此处利用了结构体为值类型的特性。
180         struct PeopleName
181         {
182             public PeopleName(string fn, string ln)
183                 : this() //结构体的构造函数重载需要调用默认构造函数
184             {
185                 FirstName = fn;
186                 LastName = ln;
187             }
188             public string FirstName { get; set; }
189             public string LastName { get; set; }
190         }
191         Dictionary<PeopleName, T> dicMult = new Dictionary<PeopleName, T>();
192         public T this[string fn, string ln]
193         {
194             get
195             {
196                 var pn = new PeopleName(fn, ln);
197                 if (!dicMult.ContainsKey(pn))
198                     return default(T);
199                 return dicMult[pn];
200             }
201             set { dicMult[new PeopleName(fn, ln)] = value; }
202         }
203
204         //多维字段索引:采用嵌套(嵌套有很多种,如数组嵌套字典、字典嵌套字典、甚至可以嵌套类等等)
205         Dictionary<T, T>[] dics = new Dictionary<T, T>[100];
206         public T this[int i, T key]
207         {
208             get
209             {
210                 if (i>99 || !dics[i].ContainsKey(key))
211                     return default(T);
212                 return dics[i][key];
213             }
214             set
215             {
216                 if (dics[i] == null)
217                     dics[i] = new Dictionary<T, T>();
218                 dics[i][key] = value;
219             }
220         }
221         #endregion
222     }
223
224     public class Name
225     {
226         public Name(string fn, string ln)
227         {
228             FirstName = fn;
229             LastName = ln;
230         }
231         public string FirstName { get; set; }
232         public string LastName { get; set; }
233     }
234 }

作者:SamWang
出处:http://wangshenhe.cnblogs.com/
本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。

【笔记】《C#高效编程改进C#代码的50个行之有效的办法》第1章C#语言习惯(1)--属性的特性以及索引器(SamWang)...相关推荐

  1. C#高效编程 改进C#代码的50个行之有效的办法(第2版)

    Effective  C# 50 Specific Ways to Improve Your C# Sencond Edition 第一章 C#编程习惯 条目1 使用属性而不是访问的数据成员 条目2 ...

  2. C#高效编程:改进C#代码的50个行之有效的办法(第2版)(奋斗的小鸟)_PDF 电子书

    下载地址:http://pan.baidu.com/share/link?shareid=1689099661&uk=721744522 QQ:2864670220  (提供电子书提取密码) ...

  3. C#高效编程--改进C#代码的50个行之有效的办法笔记

    该书并不是简单的语言新特性介绍,而是介绍如何使用这些特性帮你解决每天都要遇到的实际问题. Item1 使用属性而不是可访问的数据成员 属性这个语言元素可以让你像访问数据成员一样使用,但其底层却使用方法 ...

  4. 《C++面向对象高效编程(第2版)》——2.20 什么是多线程安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第章,第2.20节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

  5. C# list集合 重复元素 索引_C#学习笔记12--集合/索引器/扩展

    在游戏开发的时候, 经常需要创建和管理相关对象组, 比如服务器列表, 商城物品列表等等. 在从服务器拿到这些数据的时候, 首先需要将他们存放到一个数据集合里面, 然后对集合中的数据循环遍历进行处理. ...

  6. C#学习笔记--this关键字和索引器

     一.this关键字 在C#中,this关键字有以下3种常见的用法: 1.用在类的属性.实例方法或实例构造方法中,区分成员名和本地变量(或参数).下面的示例声明一个名为Myclass的类,类中包括 ...

  7. 【Python】python初学者应该知道与其他语言差异化的高效编程技巧(附测试代码+详细注释)

    目录 1. 交换变量 2. 集合去重 3. 列表推导.集合推导和字典推导 4. 统计字符串中各个字符出现的次数 5.优雅地打印JSON数据 6.行内的if语句 6. 符合正常逻辑的数值比较 7. 田忌 ...

  8. c语言函数除法代码,C语言高效编程与代码优化~

    原标题:C语言高效编程与代码优化~ 译文链接:http://www.codeceo.com/article/c-high-performance-coding.html 英文原文:https://ww ...

  9. 如何高效的学习TensorFlow代码?

    如何高效的学习TensorFlow代码? 如题,或者如何掌握TensorFlow,应用到任何领域? 添加评论分享 10 个回答 爱琳李,老李,明天就辍学了 8 人赞同 本来都忘了这个问题了,不过看到很 ...

最新文章

  1. 利用logistic回归构建申请信用评级案例
  2. say小组KTV点歌系统简介
  3. python压缩教程_Python压缩模块zipfile实现原理及用法解析
  4. vue组件穿方法_vue组件中的数据传递方法
  5. Java基础知识之方法的返回值与重载
  6. [Informix] unload load
  7. 常用数据库优化方案(五)
  8. ccflow 驰骋工作流引擎的共享任务,应用背景,设置,设计,sdk接口
  9. android整合极光im与极光推送,极光IM + 极光推送,集成中遇到的问题
  10. 基于spring boot的Java开源商城系统(附完整版源码)
  11. Word文档多级标题自动编号设置
  12. Python制作翻译软件(中英文互译)
  13. 思科ASA防火墙端口映射
  14. 华为mate7 刷机出现android,华为Mate7怎么刷机 华为Mate7刷机教程【步骤详解】
  15. 供应商管理系统SRM
  16. 数字正交下变频(多相滤波法)
  17. 小米的云备份服务器在哪里,用小米手机一定要知道云服务还有这些功能,要不然手机真白买了...
  18. mysql如何修改字段允许为空
  19. 企业微信的聊天记录可以被领导看到吗?这样算不算被窥探隐私?
  20. C++题目:日元硬币

热门文章

  1. 3140: [Hnoi2013]消毒
  2. 项目团队中的五种人(之一)
  3. (libgdx学习)Polling
  4. 使用UInput模拟系统键盘鼠标动作 UInput driver分析
  5. left join条件放在on和where的区别
  6. 前端项目集成 stylelint
  7. console错误合集
  8. 大话RabbitMQ 基础入门
  9. springcloud(十):服务网关zuul初级篇
  10. WatchStor观察:冰岛身陷困境也不会停止数据中心项目