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 设定不多不少的约束的更多相关文章

  1. Altium Designer敷铜的规则设定

    InPolygon 这个词是铺铜对其他网络的设置,铺铜要离其他网络远点,因为腐蚀不干净会对 电路板有影响... 问题一:: 如下图所示,现在想让敷铜与板子边界也就是keepoutlayer的间距小一点 ...

  2. Odoo constraints 使用教程

    在日常开发Odoo的过程中,我们不免要用到Constraints,中文就是约束. 首先我们来介绍下Odoo里面的两种Constraints. SQL Constraints:就是添加一个数据库的约束. ...

  3. 摘抄JPA官方文档原文 防呆

    Spring Data JPA - Reference Documentation Oliver GierkeThomas DarimontChristoph StroblMark PaluchVer ...

  4. sonar rule

    bug类型: 1.".equals()" should not be used to test the values of "Atomic" classes.  ...

  5. Sonar 规则

    bug类型: 1.".equals()" should not be used to test the values of "Atomic" classes. ...

  6. 监控服务 - Nagios配置文件详解

    Nagios的配置文件: Nagios安装后有四种默认的配置文件:主配置文件.CGI配置文件.资源定义文件.对象定义文件.这些配置文件间具有一些关系,只有充分理解各配置文件,才能使得配置Nagios服 ...

  7. ios auto layout demystified (一)

    Ambiguous Layout 在开发过程中,你可以通过调用hasAmbiguousLayout 来测试你的view约束是否足够的.这个会返回boolean值.如果有一个不同的frame就会返回ye ...

  8. iOS 自动布局详细介绍

    1. 自动布局的理解 iOS自动布局很有用,可以在不同size的屏幕上运行,原先看的头痛,还是习惯用最蠢的[UIScreen mainScreen].bounds.size.width等来布局,后来实 ...

  9. Masonry

    Autolayout就像一个知情达理,善解人意的好姑娘,可惜长相有点不堪入目,所以追求者寥寥无几.所幸遇到了化妆大师cloudkite,给她来了一个完美的化妆,从此丑小鸭Autolayout变成了美天 ...

随机推荐

  1. .net设计模式之装饰模式

    概述: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰模式的特点: (1) 装饰对象和真实对象有相同的接口.这样 ...

  2. HDU 4006 The kth great number AVL解

    提供动态更新数据.第实时QK大量的值什么? 使用AVL统计数据结构做,比较先进的数据结构的内容. 不知道给出的数据为准值是否有反复.下面的程序是因为我能够处理重复数据出现的情况下,. 了repeat的 ...

  3. 【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!

    原文:[百度地图API]发布静态图API啦!只需一个网址,即可展示定制百度地图! 摘要: 百度地图静态图API!您无须执行任何“特殊”操作便可在网页上显示此图片. 不需要 JavaScript.我们只 ...

  4. WebForm MapPageRoute 路由配置

    WebForm MapPageRoute 路由配置   MapPageRoute 应该是 ASP.NET 4.0 中的东西,但现在我是第一次使用它,使用场景是:MVC 混合使用 WebForm,然后对 ...

  5. 使用SqlBulkCopy导入数据至MS SQL Server

    原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http: ...

  6. how tomcat works 读书笔记九 Session管理

    在看本文之前,请先查阅相关Session与Cookie的资料. 这篇资料不错 http://blog.csdn.net/fangaoxin/article/details/6952954 Catali ...

  7. itext之pdf导出添加水印Java工具类

    import java.io.IOException; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentExce ...

  8. deb包+软件图标+添加到系统菜单+举例安装卸载

    本文介绍的内容和实验一下: 1. 制造deb包.2. 为了使软件图标.3. 开始菜单中添加到系统中的软件:4. 安装和卸载制作的deb包. 1. 制作deb包 制作deb包的方法可能有多种,本文使用的 ...

  9. 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台

    天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...

  10. 让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式

    让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式 那么就要用下面的方法:让网页兼容ie9 复制代码 代码如下: <!–[if lte IE 8]> <meta http ...