博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【进阶修炼】——改善C#程序质量(3)
阅读量:5833 次
发布时间:2019-06-18

本文共 1747 字,大约阅读时间需要 5 分钟。

32, 总是优先考虑泛型。

泛型代码有很好的重复利用性,和类型安全性。

33, 应尽量避免在泛型类中声明静态成员。

静态成员达不到共享的目的。List<int>和List<String>是两个不同的类型,而静态成员是针对类型的。当然2个List<int>之间是可以共享静态成员的,但为了不必要的混淆,应该避免使用静态成员。

34, 为泛型参数添加约束。

没有约束的参数,功能是有限的,添加了约束后,我们就可以使用约束类型的方法和属性了,程序更加灵活。

35, 使用Default关键字为泛型变量指定默认值。

由于泛型变量可能是值类型,也可能是引用类型,不能为其赋值为null或0。

36, 尽量使用FCL中定义的委托声明。

Action,Func,Predicate这几个委托都有其泛型版本,基本都可以满足我们的需求,如没有特殊业务需要,应避免自己定义不必要的委托声明。.net中还有一些自带的委托,如:EventHander,EventHander<EventArg>,ThreadStart,ParameterizedThreadStart,AsyncCallback等,在确定系统没有提供我们所需的委托时,才考虑自定义委托。

37, 用Lambda表达式替代方法和匿名方法。

这里主要指方法参数为委托的时候。

38, 小心闭包的陷阱。

Lambda表达式会捕获局部变量,编译器会将这个局部变量放入一个闭包对象中。Lambda表达式执行时才会从这个闭包对象中去取实际的值。如果这个局部变量的值中途发生了改变,我们得到的结果就是最后改变的值,这可能和我们预想的值有些出入。

39, 了解委托的实质。

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

40, 用event关键字为委托施加保护。

委托变量可以被恶意赋值为null。加了event关键字之后,在编译期就会检查到这个错误,对event声明的委托只能用+= 和-=来赋值。

41, 实现标准的事件模型。

微软规定用于事件的委托应以EventHandler结束,返回void类型,参数第一个为object类型的sender,表示事件的触发者,第二个参数为EventArgs类或它的派生类,命名要以EventArgs结束。多数情况下,我们使用系统自定义的EventHanlder<EventArgs>这个代理来定义事件就可以了,要传递自己的业务数据,可以派生一个如UploadEventArgs来实现。

42, 使用泛型参数兼容泛型接口的不可变性。

void PrintSalary<T>(ISalary<T> e)比void PrintSalary(ISalary<Emplyee> e)更具通用性。因为ISalary<Emplyee>是不可变的。

43, 让接口中的泛型参数支持协变。

在泛型参数上使用out关键字,表明泛型参数只能作为函数的返回值。有了out关键字,ISalary<Emplyee> ee = new BaseSalary<Manager>();的转型就是合法的。

44, 理解委托中的协变。

委托中的泛型变量,天生就具有部分协变性,比如你可以将一个返回子类的方法直接赋值给一个相应签名的父类的委托(前提是,泛型变量是返回值)。Public delegate T GetEmployeeHander<T>(string name); 我们可以直接用GetEmployeeHander<Employee> getEmployee = getManager;其中getManager是一个返回Manager类型的方法。但是下面这中情况就不行了,GetEmployeeHander<Manager> getManagerHander = getManager; GetEmployeeHander<Employee> getEmployee = getManagerHander;所以,如果确定泛型委托有可变性,应该加上一个out关键字。

45, 为泛型类型的参数指定逆变。

逆变的关键字是in,表明泛型参数只能用作函数的参数使用。既然是参数使用,那么子类当然可以代入它的父类。

转载地址:http://akucx.baihongyu.com/

你可能感兴趣的文章
Deepin 操作系统联合创始人宣布离职
查看>>
Android RTL布局和双向字符集显示
查看>>
基于 Laravel 的在线点播系统 MeEdu v1.0 版本上线
查看>>
日本航空公司打造新型VR设备,让用户身临其境地感受旅游目的地 ...
查看>>
标签打印软件如何制作三角形合格证
查看>>
智慧教育,千军抢过“独木桥”
查看>>
PostgreSQL 任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据算法举例 ...
查看>>
互联网大佬推荐的34本必读书 ,UI设计,产品经理推荐(附电子版下载方式) ...
查看>>
洛谷 P3183 BZOJ 4562 [HAOI2016]食物链
查看>>
resultMap自定义某个javaBean的封装规则代码
查看>>
社交系统ThinkSNS+安装部署演示
查看>>
bash shell 中数组使用举例
查看>>
阿里云云计算ACP认证重点梳理4—对象存储OSS
查看>>
Java并发编程:Callable、Future和FutureTask
查看>>
MySQL原生语句个人补漏
查看>>
2018 FDA获批医疗器械盘点,政策红利能否继续?
查看>>
网络攻防“三剑客”正式加盟墨者安全 担任首席安全顾问
查看>>
Android实战_note1(MyMirror_一款小型摄像处理的App)
查看>>
阿里与瑞金医院发布首个机器智能糖尿病知识图谱,由近2000位开发者参建
查看>>
揭秘 DockerCon 重量级演讲嘉宾(七)
查看>>