【发布时间】:2013-08-15 16:21:07
【问题描述】:
我经常看到(例如在许多模拟库中)使用泛型类型参数代替System.Type 类型参数的方法。我特别谈论泛型类型仅用于typeof(T) 操作的情况(即,在方法中的任何地方都没有使用类型 T 的实例,并且 T 没有用于返回类型或其他参数)。
例如考虑以下方法:
public string GetTypeName(System.Type type) { return type.FullName; }
此方法通常带有通用版本:
public string GetTypeName<T>() { return GetTypeName(typeof(T)); }
问题
这是不好的做法还是好的做法?
这是语法糖还是有更多?
我认为这是滥用语言特性来缩写对接受 System.Type 类型参数的方法的调用
你认为这是一种气味吗?应该避免这种情况吗?或者这实际上是一个好习惯(提供一个通用方法作为避免输入typeof()的快捷方式)。
以下是我能想到的使用这种模式的一些实际问题:
- 如果添加了非 System.Type 类型的参数 - 方法 可能 需要重写(如果参数的顺序在语义上很重要)为非泛型版本(否则某些参数将是泛型类型参数,还有一些是常规参数)。
- 它需要两种方法(通用和非通用,用于编译时类型未知的情况)。因此添加了几乎没有意义的单元测试。
另一方面,这是一种常见的做法(大多数人总是正确的,对吗?)但更重要的是,当我对需要在编译时已知的 System.Type 类型的单个参数的代码进行提取方法重构时,ReSharper 更喜欢该签名时间(我学会了接受他们的建议,虽然不是出于信心,而是认真地)。
【问题讨论】:
-
A zen koan 基本上 - 类型参数是类型参数吗?这也让我感到厌烦。
-
这个问题无法明确回答。一个人闻到的味道可能不会被另一个人闻到。该语言支持这两种情况的事实意味着这两种形式在技术上都是有效的实现。
标签: c# coding-style