1.泛型

  基于泛型,我们可以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,

确保类型安全。

  1)总是优先考虑泛型

    优点:可重用性,类型安全,高效率。

  2)避免在泛型类中声明静态成员

    T指定不同的数据类型,MyList<T> 相应的也变成了不同的数据类型,在他们之间不共享静态成员。但是,若T

所指的数据类型一致,那么两个泛型对象间还是可以共享静态成员的。

  3) 为泛型设定约束

    “约束” 这个词可能会引起歧义,有些人可能认为对泛型参数设定约束是限制参数的使用,实际情况正好相反。

没有约束的泛型参数作用很有限,只有object的属性和行为,几乎不能在方法中对他们做任何操作。

    倒是“约束” 让泛型参数具有了更多的行为和属性。

    ①指定参数是值类型,可以如下

    

    ②指定参数是引用类型(注意object不能约束,默认约束)

    ③指定参数具有无参数的公共构造方法

    ④可以对同一类型的参数应用多个约束,并且约束本身可以是泛型类型

     编码过程中,应该始终考虑为泛型参数设定约束。约束使泛型参数成为一个实实在在的对象,让它具有了

我们想要的行为和属性。而不是一个object

  

  4)使用default为泛型类型变量指定初始值

    值类型的默认初始值为0,而引用类型默认初始为null。这样 T t = 0;//会造成编译错误。(参考下列代码)

    

 class Salary
{
public void Compute<T> (T t1,T t2) where T : TestItem
{
Console.WriteLine(t1.name);
Console.WriteLine(t1.GetHashCode());
} public void Compute<T>(T t)
{
Console.WriteLine(t.GetHashCode());
} public T FuncTest<T> ()
{
T t = default(T);//设置默认值。
return t;
}
} class TestItem
{
public int num;
public string name;
}

2.委托

  1)本质

    ①委托是方法指针,当对其进行实例化的时候,要将引用方法作为它的构造方法的参数 

  2)注意闭包

      闭包理解,本质上说,闭包是一段可以在晚些时候执行的代码块,但是这段代码块依然维护着它

第一个被创建时环境-即它仍可以使用创建它的方法中的局部变量,即使那个方法已经执行完了。

      换而言之:就是函数引用变量,这个变量跟函数一起存在,即使超出作用域,依然有效。

      闭包的优点,我们可以轻松的访问外层函数定义的变量。比如有如下场景,在winform应用程序中,

我们希望做这么一个效果,当用户关闭窗体时,给用户一个提示框。

private void Form1_Load(object sender, EventArgs e)
{
string tipWords = "您将关闭当前对话框";
this.FormClosing += delegate
{
MessageBox.Show(tipWords);
};
}

若不使用匿名函数,我们就需要使用其他方式将tipwords变量的值传递给FormClosing注册的处理函数,这样就

增加了不必要的工作量。

          

      闭包“变量”,而不是闭包“值”。所以在for循环中的添加的匿名函数,只是返回了变量i而不是变量i

的值。注意,foreach在C#5中做了调整,foreach的每次循环都会是循环变量的一个拷贝,

这样闭包就看起来关闭了(没有)。但是对for 没有做改动。

      解决闭包的方案

  var values = new List<int>() { , ,  };
var funcs = new List<Func<int>>();
for (int i = ; i < ;i++ )
{
int j = i; //解决方法,或者直接使用foreach,这样本质上都是相同,都是重新拷贝一个新的变量传入。
funcs.Add(
() => { return j; }
);
} foreach (var v in funcs)
{
Console.WriteLine(v());
}

参考:https://www.cnblogs.com/HQFZ/p/4903400.html 

      https://www.cnblogs.com/jiejie_peng/p/3701070.html

.  3)事件

  事件本身也是委托,他是委托组,C#提供 event 来对事件进行特别区分。

  他封装了委托类型的变量,使得:在类的内部,不管你声明他是public还是protected,他总是private。在类的外部,

注册“+=”和“-=”的访问限定符与你在声明事件时使用的访问符相同。

  事件应该由事件发布者触发,而不是由事件的客户端来触发。

 

4)规范

  ①委托类型的名称都应该以EventHandler结束

  ②事件的命名为委托去掉EventHandler之后剩余的部分。

  5)委托注意

   ①为何委托定义的返回值通常为void?

     委托变量可以供多个订阅者注册,如果定义了返回值,那么多个订阅者的方法都会向发布者返回数值。

结果就是后面一个返回的的方法值将前面的返回值覆盖掉了,因此,实际上只能获得最后一个方法的返回值。

除此之外,发布者和订阅者是松耦合的,发布者根本不关心谁订阅了他的事件,为什么要订阅,

更别说订阅者的返回值了,所以返回订阅者的方法返回值大多数情况没有必要。  

C# 《编写高质量代码改善建议》整理&笔记 --(三)泛型&委托&事件的更多相关文章

  1. C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇

     题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...

  2. C# 《编写高质量代码改善建议》整理&笔记 --(六)编码规范及习惯

    一.命名规范 1.考虑在命名空间中使用复数 System.AllCollections System.TheCollection 2.用名词和名词组给类型命名 ScoreManager UserCon ...

  3. C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计

    1.可以字段应该重构为属性 2.谨慎将数组或集合作为属性 数组和集合作为属性存在会引起这样的一个分歧:如果属性是只读的,我们通常会认为他是不可改变的.但是如果将只读属性应用于数组和集合,而元素的内容和 ...

  4. C# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计

    1.区分接口和抽象类的应用场合 区别: ①接口支持多继承,抽象类则不能. ②接口可以包含方法,属性,索引器,事件的签名,但不能有实现,抽象类则可以. ③接口在增加新方法后,所有的继承者都必须重构,否则 ...

  5. C# 《编写高质量代码改善建议》整理&笔记 --(四)资源管理&序列化

    1.显示释放资源需继承接口IDisposable 什么是资源:C#中每一个类型都代表一种资源,而资源又分为以下两类. 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 ...

  6. 编写高质量代码改善C#程序的157个建议——建议149:使用表驱动法避免过长的if和switch分支

    建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰. 一个类枚举类型Week如下: enum Week { Monday, Tue ...

  7. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

  8. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  9. 编写高质量代码--改善python程序的建议(六)

    原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...

随机推荐

  1. apigateway-kong(一)简介及部署

    时隔三年,本人重出江湖,哈哈哈 浏览之前写的博客,有些深度还不是太够.篇幅太短,并且很多专题没有坚持写下去,部分技(dai)术(ma)没有从业务中抽离出来,本人感觉好遗憾--为此,痛下决心,重拾博客, ...

  2. Python-分支循环- if elif for while

    分支与循环 条件是分支与循环中最为核心的点,解决的问题场景是不同的问题有不同的处理逻辑.当满足单个或者多个条件或者不满足条件进入分支和循环,这里也就说明这个对相同问题处理执行逻辑依据具体参数动态变化, ...

  3. SimpleDateFormat安全的时间格式化

    SimpleDateFormat安全的时间格式化 想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和 ...

  4. MFC学习笔记_关于CSpinButtonCtrl

    CSpinButtonCtrl使用起来比较特殊,使用起来,需要注意一些地方.实际的教程也比较少.为了让后人少走弯路,这里写这篇文章以说明.1.添加EDIT控件2.添加Spin控件如果不是这样的顺序的话 ...

  5. bzoj 3680 吊打xxx 模拟退火

    第一道模拟退火 重心嘛,就是要找到一个点,使其到所有点距离*该点权值和最小 思路:初始化一个T,mint,当T大于mint时,每次随机一个解,如果解比当前解优,直接转移,否则,以某概率(与T正相关)转 ...

  6. USACO JAN14 奶牛冰壶运动 凸包+判定

    满足条件的一定是在凸包内的,直接判断 恬不知耻的加了特判,2333 #include<cstdio> #include<iostream> #include<cstrin ...

  7. BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理

    BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程     X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...

  8. Python 命令行(CLI)基础库

    在 CLI 下写 UI 应用 前阵子看了一下自己去年写的 Python-视频转字符动画,感觉好糗..所以几乎把整篇文章重写了一遍.并使用 curses 库实现字符动画的播放. 但是感觉,curses ...

  9. 从壹开始前后端分离 41 || Nginx+Github+PM2 快速部署项目(一)

    前言 哈喽大家周一好!今天是农历腊月二十三,小年开始,恭祝大家新年快乐(哈哈你五福了么

  10. 购物网站首页(学习ING)

    这几天在学着做购物网站,初步的完成了首页的框架吧,记录下.慢慢加强.主要难点,是样式的设置问题,如果自己想,自己摸索,可能会需要很长的调试.也是一个孰能生巧的过程吧,有些部分没有按照学习资料的方法也做 ...