zoukankan      html  css  js  c++  java
  • 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 忽略。

    转载请注明出处。

     
     
  • 相关阅读:
    单词篇:(单词应用10~11)
    单词篇:(单词识记11)
    单词篇:(单词识记10)
    单词篇:(单词识记8~9)
    单词篇:(单词应用9)
    单词篇:(单词识记8)
    单词篇:(单词应用6~7)
    单词篇:(单词识记7)
    单词篇:(单词识记6)
    单词篇:(单词应用4~5)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3292082.html
Copyright © 2011-2022 走看看