C# 什么';什么是泛型约束的使用?例如:其中T:i可比较
希望你们都很好,我对约束有些困惑,我还是不明白,使用约束有什么好处 明天我确实了解了C# 什么';什么是泛型约束的使用?例如:其中T:i可比较,c#,generics,C#,Generics,希望你们都很好,我对约束有些困惑,我还是不明白,使用约束有什么好处 明天我确实了解了泛型。使用这个方法是一个很棒的特性,我的意思是使用这个方法最简单,无需使用不同的数据类型反复使用这个方法,只需使用任何类型的数据类型调用它 特别是我通过这些例子理解了所有这些术语 using System; class Test<T> { private T _value; public Test(T t) { this._value = t; }
泛型
。使用这个方法是一个很棒的特性,我的意思是使用这个方法最简单,无需使用不同的数据类型反复使用这个方法,只需使用任何类型的数据类型调用它
特别是我通过这些例子理解了所有这些术语
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();
}
}
使用系统;
课堂测试
{
私人T_值;
公共测试(T)
{
这是._值=t;
}
公开作废印刷品()
{
WriteLine(“这是{0}”,这是.\u值);
}
}
类MyProgram
{
私有静态void Main(字符串[]args)
{
测试=新测试(145);
test.print();
Test test2=新测试(“我的名字是ghost!”);
test2.print();
测试3=新测试(458.5456);
test3.print();
}
}
但是当我深入了解泛型约束时,我不明白它的用途代码>
你能用最简单的例子告诉我,使用这个有什么好处吗
当我看到这一点时,我感到困惑:
公共类MyGenericClass其中T:IComparable{}
什么是,其中T:i可比较{}
??什么是IComparable
感谢~没有限制,最常见的T
类型是object
。如果你想用一组普通的类型做一些普通的事情,那就没什么用了。通过允许约束,可以将最低的公共类型“向上拖动”到指定为约束的类型。如果您键入的内容不符合约束条件,它还会阻止您使用泛型代码
例如,IComparable
将允许您的代码调用进行比较
还有一些与类型层次结构无关的其他内置约束:
其中T:class
其中T:struct
其中T:new()
你可以找出这些是什么意思。
IComparable
只是BCL中可用的.NET framework接口:
定义一个通用的特定于类型的比较方法,该方法
类型或类实现对其实例进行排序或排序
正如Jeppe Stig Nielsen所提到的,您应该在通用约束上使用IComparable
,即IComparable
,以获得各种其他好处。这些约束很有用,因为您需要用于表示某些特定行为的通用类型,比如为您的实例实现一个接口。这是您案例的先决条件,因为实现此行为的tyope具有一些特定的特性,这些特性将在您声明的泛型类中使用
具体来说,i可比较
定义值类型或类实现的通用类型特定比较方法,以对其实例进行排序
实现此接口的所有类型都表示名为CompareTo
的方法,其中
将当前实例与相同类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是在排序顺序中位于另一个对象之前、之后还是发生在同一位置
该方法的签名为:
int CompareTo(Object obj)
返回
- 小于零时,此实例按排序顺序位于obj之前
- 零,则此实例与obj发生在排序顺序相同的位置
- 大于零时,此实例按排序顺序跟随obj
也就是说,在您的情况下,您定义的泛型类型必须实现此行为,这是必需的,因为在您的类型定义中,您将需要此方法,CompareTo
,它由实现接口的类型实现IComparable
在另一种情况下,您可能需要您的类型仅为类
。那么泛型类的定义将是:
public class MyGenericClass<T> where T: class
public class MyGenericClass<T> where T: struct
当使用没有任何约束的简单泛型时,您可以假设泛型类型的任何内容
考虑以下代码:
class Test<T>
{
public void Stuff()
{
T t;
t = new T(); // COMPILE TIME ERROR - type T may not have a parameterless constructor
}
}
何时尝试编译var test=new test()
您将得到编译时错误(当然我们讨论的是约束测试),因为类型A
不包含无参数构造函数。当您使用
public class MyGenericClass<T> where T:IComparable { }
公共类MyGenericClass其中T:IComparable{}
然后T必须实现接口IComparable!
例如,当您需要实现排序算法时,这可能非常有用!当然,您也可以使用其他接口与where 基本上意味着该类实现IComparable接口的位置实际上应该使用where T:IComparable
而不是where T:IComparable
,因为后者将导致一些不必要的类型检查,如果T
是(可能是)值类型,则(更糟)装箱,例如,一个结构
或一个枚举
。它实际上归结为同一个问题,“为什么要使用IComparable x
而不是对象x
?”(在这两种情况下x
可以做什么?),其中T:class对于在实体框架中使用泛型很重要,例如,T的最低常见类型是object
,但是这里我的T
定义了数据类型,是的,我们可以在这里使用testtest1=newtest
。这就是你的意思!但是如果你想用一组常见的类型做一些常见的事情,那么它是非常无用的。
但是它是如何非常无用的呢。。我还是不明白你的意思@T
的reenakumar实例将解析为您指定用于关闭泛型的类型,但当您尝试使用它时,您将只得到class A
{
public A(int a)
{
}
}
public class MyGenericClass<T> where T:IComparable { }