这个模式有免费精选名字大全吗? (C#编译时类型安全与“params”不同类型的args)
这个模式有免费精选名字大全吗?
假设您要创建一个方法,该方法接受可变数量的参数,每个参数必须是一组固定类型(以任何顺序或组合),以及您无法控制的某些类型。 一种常见的方法是让您的方法接受Object类型的参数,并在运行时validation类型:
void MyMethod (params object[] args) { foreach (object arg in args) { if (arg is SomeType) DoSomethingWith((SomeType) arg); else if (arg is SomeOtherType) DoSomethingElseWith((SomeOtherType) arg); // ... etc. else throw new Exception("bogus arg"); } }
但是,让我们说,像我一样,你痴迷于编译时类型的安全性,并希望能够在编译时validation你的方法的参数类型。 这是我想出的一种方法:
void MyMethod (params MyArg[] args) { // ... etc. } struct MyArg { public readonly object TheRealArg; private MyArg (object obj) { this.TheRealArg = obj; } // For each type (represented below by "GoodType") that you want your // method to accept, define an implicit cast operator as follows: static public implicit operator MyArg (GoodType x) { return new MyArg(x); } }
隐式转换允许您将有效类型的参数直接传递给例程,而无需显式转换或包装它们。 如果尝试传递不可接受类型的值,则会在编译时捕获该错误。
我确定其他人已经使用过这种方法,所以我想知道这种模式是否有名称。
在Interwebs上似乎没有一个命名模式,但根据Ryan对你的问题的评论,我投票的模式名称应该是Variadic Typesafety 。
一般来说,我会非常谨慎地使用它,但我并不认为这种模式是好还是坏。 许多评论者都提出了优点和优点,我们看到其他模式,如工厂 , 服务定位器 , dependency injection , MVVM等。这都是关于上下文的。 所以这是一个刺…
上下文
必须处理一组可变的不同对象。
使用时
- 您的方法可以接受不同类型的可变数量的参数,这些参数没有公共基类型。
- 您的方法被广泛使用(即在代码和/或框架的大量用户的许多地方使用。关键是类型安全提供足够的好处以保证其使用。
- 参数可以按任何顺序传递,但不同类型的集合是有限的,并且该方法可接受唯一的集合。
- 表现力是您的设计目标,您不希望将责任放在用户身上以创建包装器或适配器(请参阅替代方案 )。
履行
你已经提供了。
例子
备择方案
它被称为反模式,通常被称为恶作剧者 。
更新:
如果args的类型总是不变并且顺序无关紧要,那么创建重载,每个重载都采用集合(IEnumerable
- 删除MyArg类
- 无需在MyMethod中进行类型转换
- 将添加额外的编译时类型安全性,如果您尝试使用无法处理的args列表调用该方法,您将获得编译器exception。
这看起来像复合模式的一个子集 。 引自维基百科:
复合模式描述了一组对象的处理方式与对象的单个实例相同。
上述就是C#学习教程:这个模式有免费精选名字大全吗? (C#编译时类型安全与“params”不同类型的args)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1033656.html