什么是类型参数命名准则?
我注意到,除了在Essential C#3.0书中看到,参数通常被定义为T或TEntity
例如:
public class Stack { }
要么
public class EntityCollection { }
你如何决定使用哪个名字?
谢谢
这是我的一套规则
- 如果有一个参数,我将其命名为T.
- 如果有多个参数,我选择一个有意义的名称和T前缀。例如TKey,TValue
对于半官方意见,值得研究有关该主题的框架设计指南:
我从http://referencesource.microsoft.com/dotnet46.zip获取了.NET Framework 4.6源代码。 提取它并处理数据以从所有generics类声明中提取通用参数名称。
注意:我只从通用类中提取通用参数名,只有一个通用参数。 因此,这不考虑具有多个通用参数的generics类。
grep -nohrP "class \w+" | sed -e 's/.*\/' -e 's/>//' | sort | uniq -cd | sort -bgr
结果:
361 T 74 TChannel 51 TKey 33 TResult 30 TSource 28 T_Identifier 18 TElement 12 TEntity 11 TInputOutput 7 TItem 6 TLeftKey 6 TFilterData 5 T_Query 4 T_Tile 4 TInput 3 TValue 3 TRow 3 TOutput 3 TEventArgs 3 TDataReader 3 T1 2 TWrapper 2 TVertex 2 TValidationResult 2 TSyndicationItem 2 TSyndicationFeed 2 TServiceType 2 TServiceModelExtensionElement 2 TResultType 2 TMessage 2 TLocationValue 2 TInnerChannel 2 TextElementType 2 TException 2 TEnum 2 TDuplexChannel 2 TDelegate 2 TData 2 TContract 2 TConfigurationElement 2 TBinder 2 TAttribute
最后,它并不重要。 使用有意义的命名约定。
public class MyDictionary { }
可能没有那么有用
public class MyDictionary
(或TKey,TValue,如果你愿意的话)。
如果我正在考虑你的实施并且必须考虑“好的,那又是什么’T3’的东西呢?” 然后你没有做好。
我认为你应该考虑以下几点:
- 有多少类型参数?
- 他们有任何限制吗?
- 它们用于特定的东西吗?
一般来说,我总是在我的类型参数前加上T
,并使它们具有“足够的描述性”,这意味着当我看到它时,我需要了解它们需要了解它们的作用和/或它们需要什么。六个月的代码。
在我看来, 有几个例子可以很好地命名类型参数(在这个列表中编号,与上面的编号无关……):
-
一个参数,从类名(或代码中的上下文中)显而易见,为什么需要类型名称:
List
由于我们可以看到这是
T
类型的对象列表,并且对T
没有特定的约束,因此不需要为type参数提供更具体的名称。 -
几个参数,代表generics类/接口中的不同内容:
IDictionary
我们需要能够区分这两个参数,因此我们不提供值的键类型,反之亦然。 因此,命名参数
Key
和Value
,并用T
加前缀,似乎是合适的。
我必须强调,这是比IDictionary
或IDictionary
更好的做法,因为在后两种情况下,没有办法直观地知道哪个参数将被用于什么。 -
一种类型的参数,但类型必须满足一些要求或其他:
Repository
where TEntity : class, IEntity 由于我们要求类型实现另一个接口,因此有必要向程序员提出一些正确的说法。 选择一些信息性名称,以帮助您查看类型所需的内容,并在其前面加上
T
来自Microsoft的示例:
public interface IDictionary
type参数代表了某些东西 ,所以如果你想拥有可读的代码,这个“东西”应该从代码中显而易见(没有额外的注释)。 使用类型名称,如T,V,U不一定是显而易见的(但有时它可以)。
我真的不知道任何关于generics的固定约定。
我见过的样本虽然使用了ff变体之一:
-
T
表示单一类型参数 -
K
表示第二个类型参数,U
表示第三个参数,例如,SomeGeneric
-
T
和第二和第三类型参数的数字,例如SomeGeneric
我认为仿制药已经足够新,以至于还没有建立共同的行业惯例。
到目前为止,我已经查看了所有答案,我认为它们都是部分正确的,但是没有充分考虑所有情况。
我的观点是,命名应始终添加上下文值。 因此,命名一个类型参数TEntity
因为它的类型是IEntity
是错误的,特别是当约束显示其类型时,这在IntelliSense中显示。 这就像命名一个字符串变量_string
。 在现代编程中,我们没有。 变量名称应反映其function角色。 类型参数应该没有什么不同。
在一个类型参数的情况下,上下文通常应该在类中显而易见,因此T
很好。 对于多个类型参数,请为每个参数添加描述性上下文,例如TKey
和TValue
。 这是不应该使用类型的另一个原因 – 如果两个类型参数是同一类型会怎么样? TEntity1
和TEntity2
?
如果存在具有添加所需上下文的类型名称的约束,则可以使用T
, U
等或T1
, T2
等,因为约束本身显示上下文,更不用说IntelliSense。
所以,我的回答类似于JaredPar和Tomas Lycken的答案,但是附加了限定条件,并且特别排除了Tomas Lycken的第三条规则,其中T
应该用于具有约束的单一类型参数(因为类上下文和IntelliSense)。
- 当StartInfo.RedirectStandardInput设置为true时,为什么StandardOutput.Read()会阻塞?
- 构建C#EntityFramework IQueryable表达式时出现问题
- 相互SSL身份validation – sslstream中的本地证书在客户端上返回“null”而不是证书
- 如何使用WPF窗口作为消息框?
- Window AllowTransparency = true时WPF硬件加速了吗?
- 如何将文件合并到单个可执行文件或减少分布式文件的数量
- “填充无效,无法删除”使用AesManaged
- 使用WebClient或HttpClient下载文件?
- 使州名缩写为州名