在.Net 2.0中使用可空类型时,有什么我应该担心的吗?

时间:2009-01-02 08:29:54

标签: c# nullable

C#2.0让我可以访问可空类型。当我希望数据库中的DateTime变量为null时,这似乎非常方便。在使用可空类型时我有什么可担心的吗?或者我可以过度使用我可以为空的每种类型?

5 个答案:

答案 0 :(得分:8)

Mitch的DBNull不为空是一个好点。还要注意这一点,这是合法的C#,但(幸运的是)会发出警告:

int x = 0;

// Much later
if (x == null)

看起来它应该是非法的,但它是有效的,因为x可以隐式转换为可以为空的int。永远不要忽视这个警告。

您还应该了解表面上出现的与操作员有关的奇怪之处。例如,通常你会期望:

if (x <= y || x >= y)

总是是真的 - 但xy都是null时不是。但是,x == y将是真的 - 与SQL不同,实际上与VB不同!提升的操作符行为由语言提供,而不是运行时,因此您需要了解您使用的每种语言将执行的操作。

最后,请确保您了解拳击如何与可空类型一起使用。可空值类型的非空值被加框,就好像它是非可空的一样,并且空值被装箱到一个简单的空引用。 (即实际上没有创建框 - 运行时只返回null)。您可以从空引用或基础类型的框中取消装入可以为空的值类型。那有意义吗? (我在深度C#中更详细地介绍它,并希望更清晰......但是它是8.45而且我还没有喝咖啡......)

编辑:好的,也许一个例子会有所帮助:

int? i = 5;
int? j = null;

object x = i; // x = reference to boxed int (there's no such thing as a "boxed nullable int")
object y = j; // y = null (a simple null reference)

i = (int?) x; // Unboxing from boxed int to int? is fine.
j = (int?) y; // Unboxing from a null reference to int? is fine too.

答案 1 :(得分:4)

请注意与DBNull

不同的null

答案 2 :(得分:1)

你也应该小心只使用可以为空的类型,其中类的逻辑要求值真正可以为空。这可能听起来很愚蠢,但如果你“过度”并使一切都可以为空,那么你可能会使代码变得更加复杂。

当它在适当的地方使用时,我认为它可以提高代码质量,但如果它是多余的,请不要这样做。

答案 3 :(得分:0)

GetType()有一个问题,在使用new()和泛型来观察时尤其明显:

static void Foo<T>() where T : new()
{
    T t = new T();
    string s = t.ToString(); // fine
    bool eq = t.Equals(t); // fine
    int hc = t.GetHashCode(); // fine
    Type type = t.GetType(); // BOOM!!!
}

基本上,GetType()不常见,因为它不是virtual,所以它总是被投射(装箱)到object。不寻常的装箱规则意味着这会在GetType()上调用null,这是不可能的。如果您认为可能有空GetType()个对象,则无效调用Nullable<T>

另外 - 请注意,某些数据绑定方法非常不喜欢Nullable<T>

答案 4 :(得分:0)

互操作性可能是一个问题 - 例如暴露给COM客户端或作为Web服务。