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

在方法签名中使用泛型有什么好处?

如何解决《在方法签名中使用泛型有什么好处?》经验,为你挑选了1个好方法。

(感谢大家的答案,这是我的重构示例,反过来另一个关于单一责任原则的StackOverflow问题.)

从PHP到C#,这种语法令人生畏:

container.RegisterType("customer1");

直到我意识到它表达了同样的事情:

container.RegisterType(typeof(Customer), "customer1");

正如我在下面的代码中演示的那样.

那么为什么在这里使用泛型(例如整个Unity和大多数C#IoC容器)有一些原因,除了它只是一个更清晰的语法,即你在发送类型时不需要typeof()?

using System;

namespace TestGenericParameter
{
    class Program
    {
        static void Main(string[] args)
        {
            Container container = new Container();
            container.RegisterType("test");
            container.RegisterType(typeof(Customer), "test");

            Console.ReadLine();
        }
    }

    public class Container
    {
        public void RegisterType(string dummy)
        {
            Console.WriteLine("Type={0}, dummy={1}, name of class={2}", typeof(T), dummy, typeof(T).Name);
        }

        public void RegisterType(Type T, string dummy)
        {
            Console.WriteLine("Type={0}, dummy={1}, name of class={2}", T, dummy, T.Name);
        }

    }

    public class Customer {}
}

//OUTPUT:
//Type=TestGenericParameter.Customer, dummy=test, name of class=Customer
//Type=TestGenericParameter.Customer, dummy=test, name of class=Customer

Troels Thoms.. 5

主要原因是编译时的类型安全性.如果要传递两个Type对象,则将责任放在开发人员而不是编译器上.

这也是许多IoC容器利用它的原因,因为如果具体类型没有继承抽象类型,编译器会抱怨.

public void Register() where TConcrete : TAbstract
{
}

此代码仅在TConcrete实现或继承时才有效TAbstract.如果此方法采用两个Type参数,则您的方法应验证此关系.



1> Troels Thoms..:

主要原因是编译时的类型安全性.如果要传递两个Type对象,则将责任放在开发人员而不是编译器上.

这也是许多IoC容器利用它的原因,因为如果具体类型没有继承抽象类型,编译器会抱怨.

public void Register() where TConcrete : TAbstract
{
}

此代码仅在TConcrete实现或继承时才有效TAbstract.如果此方法采用两个Type参数,则您的方法应验证此关系.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有