C#泛型回顾点滴

前言

C#的泛型一直是学习者津津乐道的课题了,这确实是一个非常有用的特性,不过在实际使用中,还是有很多需要注意的地方,我们需要通过自己动手实践以及结合理论进行理解,最终总结出自己的编码规范和最佳实践

案例1

internal struct TestStruct : IEquatable<TestStruct>

{

    bool IEquatable<TestStruct>.Equals(TestStruct other)

    {

        return true;

    }

}



internal class TesterClass

{

    // Methods

    public static bool AreEqual<T>(T arg1, T arg2) where T : IEquatable<T>

    {

        return arg1.Equals(arg2);

    }



    public static void Run()

    {

        TestStruct t1 = new TestStruct();

        TestStruct t2 = new TestStruct();

        Debug.Assert(((IEquatable<TestStruct>)t1).Equals(t2));

        Debug.Assert(AreEqual<TestStruct>(t1, t2));

    }

}

案例2

class Program

{

    static void Main(string[] args)

    {

        Print1(1);

        Print2(1);

        Print3(1);



        string a = "ABC";

        string b = "AB";

        string c = b + "C";



        bool genericEquals = IsEquals<string>(a, c);

        bool directEquals = (a == c);



        Console.ReadKey();

    }



    static void Print1<T>(T item)

        where T : struct

    {

        string s = item.ToString();

    }



    static void Print2<T>(T item)

    {

        string s = item.ToString();

    }



    static void Print3(int item)

    {

        string s = item.ToString();

    }



    static bool IsEquals<T>(T t1, T t2)

        where T : class

    {

        return t1 == t2;

    }



}

思考以上代码,在内部是怎样的执行过程?结果如何?为什么?

要点

  • 泛型中的装箱和拆箱
  • 泛型中的逆变与协变

未完待续、、、

参考:

http://stackoverflow.com/questions/5531948/how-does-a-generic-constraint-prevent-boxing-of-a-value-type-with-an-implicitly

http://stackoverflow.com/questions/4403055/boxing-unboxing-and-generics

http://stackoverflow.com/questions/390900/cant-operator-be-applied-to-generic-types-in-c

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

你可能感兴趣的:(C#)