C#泛型回顾点滴

时间:2021-09-09 22:25:26

前言

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://*.com/questions/5531948/how-does-a-generic-constraint-prevent-boxing-of-a-value-type-with-an-implicitly

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

http://*.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