C#2.0让我可以访问可空类型。当我希望数据库中的DateTime变量为null时,这似乎非常方便。在使用可空类型时我有什么可担心的吗?或者我可以过度使用我可以为空的每种类型?
答案 0 :(得分:8)
Mitch的DBNull不为空是一个好点。还要注意这一点,这是合法的C#,但(幸运的是)会发出警告:
int x = 0;
// Much later
if (x == null)
看起来它应该是非法的,但它是有效的,因为x可以隐式转换为可以为空的int。永远不要忽视这个警告。
您还应该了解表面上出现的与操作员有关的奇怪之处。例如,通常你会期望:
if (x <= y || x >= y)
总是是真的 - 但x
和y
都是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服务。