可能希望,你们都很好,我对Constraint有些困惑,我仍然没有得到这个,使用约束有什么好处?
明天我明白了Generics
。这是使用这种方法的一个很棒的功能,我的意思是最简单的使用方法,不需要一次又一次地使用不同的数据类型,只需用任何类型的数据类型调用它,
特别是我确实理解了这些例子的所有条款,
using System;
class Test<T>
{
private T _value;
public Test(T t)
{
this._value = t;
}
public void print()
{
Console.WriteLine("This is {0}", this._value);
}
}
class MyProgram
{
private static void Main(string[] args)
{
Test<int> test = new Test<int>(145);
test.print();
Test<string> test2 = new Test<string>("My name is ghost!");
test2.print();
Test<double> test3 = new Test<double>(458.5456);
test3.print();
}
}
但是当我深入Generics constraints
时,我没有得到What it is used for!
你能用最简单的例子告诉我,使用这个有什么好处?
public class MyGenericClass<T> where T:IComparable { }
什么是where T:IComparable{}
? IComparable的定义是什么?
感谢〜
答案 0 :(得分:6)
没有约束,T
的最低常见类型是object
。如果你想用一组常见的类型做一些共同点,那就太没用了。通过允许约束,您可以将最低常见类型“向上拖动”到您指定为约束的类型。如果键入不符合约束条件,它也会阻止您使用通用代码。
IComparable
会让您的代码调用CompareTo
。
还有一些其他可用的内置约束与您的类型层次结构无关:
where T : class
where T : struct
where T : new()
您可以通过reviewing the documentation了解这些含义。
<小时/>IComparable
只是BCL中可用的.NET框架接口; documentation here:
定义一个值的通用类型特定比较方法 type或class implements来对其实例进行排序或排序。
正如Jeppe Stig Nielsen所提到的,你应该在你的通用约束上使用通用版IComparable
,IComparable<T>
,以获得各种其他好处。
答案 1 :(得分:0)
约束很有用,因为您需要使用通用类型来表达某些特定行为,例如为您的实例实现接口。这是您的案例的先决条件,因为实现此行为的tyope具有一些特定的特征,这些特征将在您声明的泛型类中使用。
具体而言,IComparable
定义一个通用的特定于类型的比较方法,值类型或类实现它以对其实例进行排序或排序。
实现此接口的所有类型都表达了名为CompareTo
的方法,其中
将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是否在排序顺序中与其他对象相同的位置之前,之后或出现。
该方法的签名是:
int CompareTo(Object obj)
并返回
话虽如此,在您的情况下,您定义的泛型类型必须实现此行为,这是必需的,因为在您的类型定义中,您将需要此类型CompareTo
的方法,它由类型实现实现接口IComparable
。
在另一种情况下,您可能需要您的类型只有class
。然后你的泛型类的定义是:
public class MyGenericClass<T> where T: class
另一方面,在另一种情况下,您可能需要您的类型只有struct
。然后你的类型的定义是:
public class MyGenericClass<T> where T: struct
答案 2 :(得分:0)
当使用没有任何约束的简单泛型时,您可以假设泛型类型。
考虑下面的代码:
class Test<T>
{
public void Stuff()
{
T t;
t = new T(); // COMPILE TIME ERROR - type T may not have a parameterless constructor
}
}
有约束:
class Test<T> where T : new()
{
public void Stuff()
{
T t;
t = new T(); // IT IS OK - the type T must have parameterless constructor.
}
}
考虑助手类:
class A
{
public A(int a)
{
}
}
当您尝试编译var test = new Test<A>();
时,您将收到编译时错误(当然,我们正在讨论带有约束的测试)因为类型A
没有&#39; t包含无参数构造函数。
答案 3 :(得分:0)
使用时
public class MyGenericClass<T> where T:IComparable { }
然后T必须实现接口IC Comparable! 当你想要实现一个排序算法时,这对于exaple非常有用!当然你也可以在其他地方使用其他接口!