Define Constraints That Are Minimal and Sufficient 设定不多不少的约束
Define Constraints That Are Minimal and Sufficient 设定不多不少的约束
今天第二章第二节。
主管不在,然后暂时没什么任务,把第二节看了,然后整理一下,下班之后就能继续去打球了。
标题翻译是,设定不多不少的约束,(好像有点过于通俗了)。关键是何为不多不少。
这里有个没意义的约束:

定义一个Object约束确实没意义,你能想出有什么意义吗?既然如此,编译器就直接不让过了。
再做个测试。
定义一个Person类。
public class Person
{
public int ID { get; set; }
public Person()
{ }
public Person(int id)
{
ID = id;
}
}
有两个构造函数,一个无参,一个有参。
然后一个测试类,
public void TestMethod<T>() where T : Person, new()
{
T t = new T() { ID = 2 };//这里只能调用无参的构造函数,想赋值只能通过属性的方式。
T t2 = default(T);//如果没有添加上面的new()约束,就只能通过default关键字来“实例化”一个T,但是,得到的t2是null
t2 = Activator.CreateInstance<T>();//也可以用反射来new
Console.WriteLine(t2 == null);//True
Console.WriteLine(t.ID);
}
//没有定义T要实现IComparable接口,方法里面就要写很多if条件语句来判断。
public bool AreEqual<T>(T left, T right)
{
if (left == null) { return right == null; }
if (left is IComparable<T>) {
return (left as IComparable<T>).CompareTo(right) == 0;
} else {
throw new Exception("未实现IComparable接口!");
}
}
//添加了IComparable约束,比较起来就简洁多了。
public bool AreEqual2<T>(T left, T right) where T : IComparable<T>
{
return left.CompareTo(right) == 0;
}
再看一个例子
public bool AreEqual3<T>(T left, T right) where T : IEquatable<T>
{
return left.Equals(right);
}
public bool AreEqual4<T>(T left, T right)
{
return left.Equals(right);
}
当T实现了IEquatable<T>接口之后,调用AreEqual3方法的时候就会调用T对IEquatable<T>接口的具体实现的代码,而不是原本的继承自Object的Equals的方法。
有时候太多的约束就容易限制了一个类的使用。然后后面那句话真心看不懂。
原句:Sometimes mandating a contraint is too limiting for the use of a class ,and you should instead view the presence or absence of a particular interface or base class as an upside rather than a mandate.
去查过中文版的书,感觉,有太大的差距,各位看官自己理解吧。
这里举的是Equatable<T> 和 Comparable<T>的例子,貌似,没发现这两个类。。。。。
最后,举了一个default(T) 和 newT()的例子。用default关键字的时候不需要加new()约束。否则如果要在泛型方法中 “new”一个实例就必须在方法最后where上加约束。
好了,第二节差不多就这么多。
总结一下,似乎至今还是没给出何为“不多不少”的约束的答案。。。。。。。
插曲:中途试了好多代码插件,好像都不太完美。。。Windows Live Writer里面的,求推荐。
觉得有用,赞一个;else 忽略。
转载请注明出处。
Define Constraints That Are Minimal and Sufficient 设定不多不少的约束的更多相关文章
- Altium Designer敷铜的规则设定
InPolygon 这个词是铺铜对其他网络的设置,铺铜要离其他网络远点,因为腐蚀不干净会对 电路板有影响... 问题一:: 如下图所示,现在想让敷铜与板子边界也就是keepoutlayer的间距小一点 ...
- Odoo constraints 使用教程
在日常开发Odoo的过程中,我们不免要用到Constraints,中文就是约束. 首先我们来介绍下Odoo里面的两种Constraints. SQL Constraints:就是添加一个数据库的约束. ...
- 摘抄JPA官方文档原文 防呆
Spring Data JPA - Reference Documentation Oliver GierkeThomas DarimontChristoph StroblMark PaluchVer ...
- sonar rule
bug类型: 1.".equals()" should not be used to test the values of "Atomic" classes. ...
- Sonar 规则
bug类型: 1.".equals()" should not be used to test the values of "Atomic" classes. ...
- 监控服务 - Nagios配置文件详解
Nagios的配置文件: Nagios安装后有四种默认的配置文件:主配置文件.CGI配置文件.资源定义文件.对象定义文件.这些配置文件间具有一些关系,只有充分理解各配置文件,才能使得配置Nagios服 ...
- ios auto layout demystified (一)
Ambiguous Layout 在开发过程中,你可以通过调用hasAmbiguousLayout 来测试你的view约束是否足够的.这个会返回boolean值.如果有一个不同的frame就会返回ye ...
- iOS 自动布局详细介绍
1. 自动布局的理解 iOS自动布局很有用,可以在不同size的屏幕上运行,原先看的头痛,还是习惯用最蠢的[UIScreen mainScreen].bounds.size.width等来布局,后来实 ...
- Masonry
Autolayout就像一个知情达理,善解人意的好姑娘,可惜长相有点不堪入目,所以追求者寥寥无几.所幸遇到了化妆大师cloudkite,给她来了一个完美的化妆,从此丑小鸭Autolayout变成了美天 ...
随机推荐
- ios结构体httpPost头结构
ios结构体httpPost头结构 by 吴雪莹 NSString* urlStr = @"; NSURL* url = [NSURL URLWithString:urlStr]; NSMu ...
- dojo的TabContainer添加ContentPane假设closable,怎么不闭幕后予以销毁ContentPane
其主要思想是新的TabContainer的扩展类,重载其closeChild属性,使得其在关闭子容器时.不调用该子容器的destroyRecursive方法. define([ "dojo/ ...
- Facebook HHVM 和 Hack 手册 --- 2. HHVM能做什么
HHWM简介: HHWM(HipHop VM) 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点. ...
- 平安某金所奇葩的面经-关于幂等和ROA设计的反思
在公司一直在做跟支付有关的项目,某日接到平安某金所一男子电话,应该是之前某猎头投的,我正好在吃早饭(也不能怪他们上班早,我们公司弹性工作制,我一般上班比较晚). 因为饭馆信号不好,只能赶紧放下剩下的半 ...
- jmgraph前端画图组件(html5版)
原文:jmgraph前端画图组件(html5版) jmgraph是一个基于html5的WEB前端画图组件. 前端画图对象控件化,支持鼠标和健盘事件响应,可对单个控件样式设定,支 ...
- MVC模型部分验证
ASP.NET MVC模型部分验证 在很多情况下,我们为了代码的复用可能会存在ViewModel共用的情形.比方说,web应用中常常会遇到的一个需求就是用户找回密码的功能.用户首先要验证通过验证邮箱( ...
- 3-05. 寻求倒数第二链线性表K项目(15)(STL list应用 ZJU_PAT)
主题链接:http://pat.zju.edu.cn/contests/ds/3-05 给定一系列正整数,请设计一个尽可能高效的算法.查找倒数第K个位置上的数字. 输入格式说明: 输入首先给出一个正整 ...
- Asp.net 4.0,首次请求目录下的文件时响应很慢
原文:Asp.net 4.0,首次请求目录下的文件时响应很慢 1. 问题起因2. 尝试过的处理思路3. 解决方法 1. 问题起因 一个从VS2003(.Net Framework 1.1)升级到.ne ...
- Oralce 导出脚本命令,定时执行
原文:Oralce 导出脚本命令,定时执行 @echo off @echo ================================================ @echo window ...
- Oralce 处理字符串函数
原文:Oralce 处理字符串函数 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Ora ...