有一个Nullable<T>
结构,还有另一个带有三个静态方法的静态Nullable
类。
我的问题是,为什么静态Nullable
类中的这些静态方法可以进入Nullable<T>
结构?用两种不同的类型定义它们的原因是什么?
还有一个INullable
界面。它有什么作用?
答案 0 :(得分:6)
Generics的标准做法是使用与泛型类相同名称的类,并使用与泛型类相关的实用程序方法。因为当你使用泛型类时,你不能在类型声明中推断出泛型,你最终会得到更多的字符。 看看静态方法放在泛型类中的方式:
Nullable<int?>.Compare(x, Y);
var n = new Tuple<int,string>(10, "Text");
VS
Nullable.Compare(x, Y);
var n = Tuple.Create(10, "Text");
我把Tuple作为另一个例子。
接口和基类在泛型中非常有用,并且因为Nullable&lt;&gt;是struct和structs不能有基类,我们留下了接口。现在可以使用它了。
{
int? a = 10;
long? b = 10L;
Process(a);
Process(b);
}
private static void Process(INullable value)
{
if (value.IsNull)
{
// Process for null ..
}
else
{
// Process for value ..
}
}
答案 1 :(得分:1)
它们是一个单独的类,因为这些方法是实用程序方法,并且只要在每次要使用这些方法时都不需要创建public static bool Is<T>(this T variable,Type type) {
if (var != null) {
Type currentType = variable.GetType();
type = Nullable.GetUnderlyingType(type) ?? type;
while (currentType != typeof(object)) {
if (currentType == type) {
return true;
}
currentType = currentType.BaseType;
}
}
return false;
}
结构实例,就可以在任何地方使用,例如,
nullable
在上面的示例中,变量可以是任何类型(不一定是nullable
),但它实际上可以是nullable
,因此必须检查Nullable.GetUnderlyingType(type)
。
对于这种情况,我使用<script>
,因为它是一种实用方法。这是实用程序方法的预期行为,即在任何需要的地方使它们可重用,而不必在每次需要时创建实例。