【笔记】《C#高效编程改进C#代码的50个行之有效的办法》第1章C#语言习惯(1)--属性的特性以及索引器(SamWang)...
**************************************************************************
书名:《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)...相关推荐
- C#高效编程 改进C#代码的50个行之有效的办法(第2版)
Effective C# 50 Specific Ways to Improve Your C# Sencond Edition 第一章 C#编程习惯 条目1 使用属性而不是访问的数据成员 条目2 ...
- C#高效编程:改进C#代码的50个行之有效的办法(第2版)(奋斗的小鸟)_PDF 电子书
下载地址:http://pan.baidu.com/share/link?shareid=1689099661&uk=721744522 QQ:2864670220 (提供电子书提取密码) ...
- C#高效编程--改进C#代码的50个行之有效的办法笔记
该书并不是简单的语言新特性介绍,而是介绍如何使用这些特性帮你解决每天都要遇到的实际问题. Item1 使用属性而不是可访问的数据成员 属性这个语言元素可以让你像访问数据成员一样使用,但其底层却使用方法 ...
- 《C++面向对象高效编程(第2版)》——2.20 什么是多线程安全类
本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第章,第2.20节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...
- C# list集合 重复元素 索引_C#学习笔记12--集合/索引器/扩展
在游戏开发的时候, 经常需要创建和管理相关对象组, 比如服务器列表, 商城物品列表等等. 在从服务器拿到这些数据的时候, 首先需要将他们存放到一个数据集合里面, 然后对集合中的数据循环遍历进行处理. ...
- C#学习笔记--this关键字和索引器
一.this关键字 在C#中,this关键字有以下3种常见的用法: 1.用在类的属性.实例方法或实例构造方法中,区分成员名和本地变量(或参数).下面的示例声明一个名为Myclass的类,类中包括 ...
- 【Python】python初学者应该知道与其他语言差异化的高效编程技巧(附测试代码+详细注释)
目录 1. 交换变量 2. 集合去重 3. 列表推导.集合推导和字典推导 4. 统计字符串中各个字符出现的次数 5.优雅地打印JSON数据 6.行内的if语句 6. 符合正常逻辑的数值比较 7. 田忌 ...
- c语言函数除法代码,C语言高效编程与代码优化~
原标题:C语言高效编程与代码优化~ 译文链接:http://www.codeceo.com/article/c-high-performance-coding.html 英文原文:https://ww ...
- 如何高效的学习TensorFlow代码?
如何高效的学习TensorFlow代码? 如题,或者如何掌握TensorFlow,应用到任何领域? 添加评论分享 10 个回答 爱琳李,老李,明天就辍学了 8 人赞同 本来都忘了这个问题了,不过看到很 ...
最新文章
- 利用logistic回归构建申请信用评级案例
- say小组KTV点歌系统简介
- python压缩教程_Python压缩模块zipfile实现原理及用法解析
- vue组件穿方法_vue组件中的数据传递方法
- Java基础知识之方法的返回值与重载
- [Informix] unload load
- 常用数据库优化方案(五)
- ccflow 驰骋工作流引擎的共享任务,应用背景,设置,设计,sdk接口
- android整合极光im与极光推送,极光IM + 极光推送,集成中遇到的问题
- 基于spring boot的Java开源商城系统(附完整版源码)
- Word文档多级标题自动编号设置
- Python制作翻译软件(中英文互译)
- 思科ASA防火墙端口映射
- 华为mate7 刷机出现android,华为Mate7怎么刷机 华为Mate7刷机教程【步骤详解】
- 供应商管理系统SRM
- 数字正交下变频(多相滤波法)
- 小米的云备份服务器在哪里,用小米手机一定要知道云服务还有这些功能,要不然手机真白买了...
- mysql如何修改字段允许为空
- 企业微信的聊天记录可以被领导看到吗?这样算不算被窥探隐私?
- C++题目:日元硬币