为什么有Nullable <t>结构和Nullable类?

时间:2017-01-20 04:15:15

标签: c# nullable

有一个Nullable<T>结构,还有另一个带有三个静态方法的静态Nullable类。

我的问题是,为什么静态Nullable类中的这些静态方法可以进入Nullable<T>结构?用两种不同的类型定义它们的原因是什么?

还有一个INullable界面。它有什么作用?

2 个答案:

答案 0 :(得分:6)

  1. 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作为另一个例子。

  2. 接口和基类在泛型中非常有用,并且因为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>,因为它是一种实用方法。这是实用程序方法的预期行为,即在任何需要的地方使它们可重用,而不必在每次需要时创建实例。