当前位置:  开发笔记 > 编程语言 > 正文

限制方法中泛型类型的目的是什么?

如何解决《限制方法中泛型类型的目的是什么?》经验,为你挑选了1个好方法。

我很难理解为什么做这样的事情是有益的:(样本是一个类)

static void PrintResults(T result) where T : Sample

将Sample传递给方法不是更好吗?

 static void PrintResults (Sample result)

akton.. 10

我建议避免使用非泛型语法的泛型类型,例如您提供的示例.但是,还有其他有用的案例.

例如,通常指定返回类型:

static T Create() where T: Sample, new()
{
    return new T();
}

// Calling code
Sample sample = Create();

代替

static object Create()
{
    return new Sample();
}

// Calling code
Sample sample = (Sample) Create();

您还可以使用模板对类型设置多个限制.例如:

static T Create() where T: IMyInterface, new()
{
    return new T();
}

interface IMyInterface {} 
class MyClass : IMyInterface { }

// Calling code.
MyClass myClass = Create();

这允许通用创建实现特定接口并具有通用构造函数的新类型.也:

static void DoSomething(T t) where T: IMyInterface1, IMyInterface2
{
    t.MethodOnIMyInterface1();
    t.MethodOnIMyInterface2();
}

interface IMyInterface1 
{
    void MethodOnIMyInterface1();
}     
interface IMyInterface2
{
    void MethodOnIMyInterface2();
}     
class MyClass: IMyInterface1, IMyInterface2 
{ 
    // Method implementations omitted for clarity
}

// Calling code
MyClass myclass'
DoSomething(myclass);  // Note that the compiler infers the type of T.

您可以在单个参数上需要多个接口,而无需(1)创建实现所有这些接口的新类型,以及(2)要求参数为该类型.

正如@dcastro在他/她的回答中指出的那样,泛型类型也可以告诉编译器要求类型是相同的.例如:

static void DoSomething(T t1, T t2) where T: MyType
{
    // ...
}

class MyType {}
class MyType1: MyType {} 
class MyType2: MyType {} 

// Calling code
MyType1 myType1;
MyType2 myType2;
DoSomething(myType1, myType2);

编译器要求t1和t2是相同类型但可以是任何继承的类型MyType.这在自动单元测试框架(如NUnit或MSTest)中非常有用,可用于通用相等和比较检查.



1> akton..:

我建议避免使用非泛型语法的泛型类型,例如您提供的示例.但是,还有其他有用的案例.

例如,通常指定返回类型:

static T Create() where T: Sample, new()
{
    return new T();
}

// Calling code
Sample sample = Create();

代替

static object Create()
{
    return new Sample();
}

// Calling code
Sample sample = (Sample) Create();

您还可以使用模板对类型设置多个限制.例如:

static T Create() where T: IMyInterface, new()
{
    return new T();
}

interface IMyInterface {} 
class MyClass : IMyInterface { }

// Calling code.
MyClass myClass = Create();

这允许通用创建实现特定接口并具有通用构造函数的新类型.也:

static void DoSomething(T t) where T: IMyInterface1, IMyInterface2
{
    t.MethodOnIMyInterface1();
    t.MethodOnIMyInterface2();
}

interface IMyInterface1 
{
    void MethodOnIMyInterface1();
}     
interface IMyInterface2
{
    void MethodOnIMyInterface2();
}     
class MyClass: IMyInterface1, IMyInterface2 
{ 
    // Method implementations omitted for clarity
}

// Calling code
MyClass myclass'
DoSomething(myclass);  // Note that the compiler infers the type of T.

您可以在单个参数上需要多个接口,而无需(1)创建实现所有这些接口的新类型,以及(2)要求参数为该类型.

正如@dcastro在他/她的回答中指出的那样,泛型类型也可以告诉编译器要求类型是相同的.例如:

static void DoSomething(T t1, T t2) where T: MyType
{
    // ...
}

class MyType {}
class MyType1: MyType {} 
class MyType2: MyType {} 

// Calling code
MyType1 myType1;
MyType2 myType2;
DoSomething(myType1, myType2);

编译器要求t1和t2是相同类型但可以是任何继承的类型MyType.这在自动单元测试框架(如NUnit或MSTest)中非常有用,可用于通用相等和比较检查.


另外,如果我们在`ISample`接口处有`where T:ISample`,那么我们就可以将这个方法用于`T`的`struct`和`class`"values".当我们在方法参数`result`上调用接口`ISample`的成员时,很酷的是即使`T`是一个值类型(struct),当我们调用`ISample`时我们也不会得到装箱.关于`result`的成员(方法等).如果struct有明确的接口实现,我们甚至可以调用它们而不用装箱结构.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有