当前位置:  开发笔记 > 编程语言 > 正文

不可为空的类型

如何解决《不可为空的类型》经验,为你挑选了3个好方法。

有没有办法在C#中创建一个非可空类型(如DateTime或TimeSpan).

还有一种方法(可能是一个属性)强制不会在没有添加的情况下将非null参数传递给方法和属性

if(arg1 == null)
{
   throw new ArgumentNullException("this attribute is null")
}

Anton Gogole.. 16

DateTime并且TimeSpan不可为空,因为它们是structs而不是classes.

至于你的第二个问题,在C#中没有标准的方法可以做到这一点.您可以使用PostSharp(一个AOP框架)或Spec#(这是一种全新的语言(C#的扩展))来实现这一点,它允许一些所需的行为.



1> Anton Gogole..:

DateTime并且TimeSpan不可为空,因为它们是structs而不是classes.

至于你的第二个问题,在C#中没有标准的方法可以做到这一点.您可以使用PostSharp(一个AOP框架)或Spec#(这是一种全新的语言(C#的扩展))来实现这一点,它允许一些所需的行为.


如果您使用的是构建后步骤,那么绝对有一种标准的方法:代码契约正式成为.NET 4的一部分(并且可单独用于.NET 3.5).

2> Marc Gravell..:

您在.NET 4.0/C#4.0中通过代码契约更容易引用的空值检查,这几乎可以满足您的需求.

结构已经不可为空,但不要去创建自己的结构像疯了似的-你很少需要他们(类是远远多见).没有"非可空类"的真正概念; 人们提出了类似的语法更改:

void Foo(string! arg1) {...}

这将使编译器进行非空检查arg1- 但实际上,代码合同会做到这一点甚至更多.你可以在PostSharp中做一些事情,但它可能不值得这个hastle.

另一个关于非可空类的想法(以及未实现的原因之一); 什么default(T)是非可空类?;-p该规范要求,default(T)是明确界定...



3> driis..:

非可空类型是ValueType,换句话说是结构.结构不能为null,因此示例如下:

public struct MyStruct {}

没有内置的方法可以确保null不作为参数传递给方法(除非参数的类型是ValueType).我已经看到人们创建扩展方法来做一个关于参数是否为null的更简单(即更少的代码)断言,这可能是一个选项.另一方面,检查很短; 并且检查的意图非常清楚.如果您使用自定义检查方法,情况可能并非如此.

C#4.0将通过合同为这种编程添加更好的选项,但还没有.正如另一个答案所指出的,PostSharp是一个做你想做的事情的选择.PostSharp的工作原理是添加一个后编译步骤,其中添加了额外的代码.

但是,有一些选项可以静态检查是否可以传递null.例如,ReSharper允许您使用[NotNull]属性装饰自己的方法参数,如果ReSharper可以确定参数可能为null,则它将在编译时发出警告.当然,这只会警告您(可能)不良的编码实践,它不是运行时检查,不应该这样使用.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有