有没有办法在C#中创建一个非可空类型(如DateTime或TimeSpan).
还有一种方法(可能是一个属性)强制不会在没有添加的情况下将非null参数传递给方法和属性
if(arg1 == null)
{
throw new ArgumentNullException("this attribute is null")
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 11
您在.NET 4.0/C#4.0中通过代码契约更容易引用的空值检查,这几乎可以满足您的需求.
结构已经不可为空,但不要去创建自己的结构像疯了似的-你很少需要他们(类是远远多见).没有"非可空类"的真正概念; 人们提出了类似的语法更改:
void Foo(string! arg1) {...}
Run Code Online (Sandbox Code Playgroud)
这将使编译器进行非空检查arg1- 但实际上,代码合同会做到这一点甚至更多.你可以在PostSharp中做一些事情,但它可能不值得这个hastle.
另一个关于非可空类的想法(以及未实现的原因之一); 什么default(T)是非可空类?;-p该规范要求,即default(T)是明确界定...
非可空类型是ValueType,换句话说是结构.结构不能为null,因此示例如下:
public struct MyStruct {}
Run Code Online (Sandbox Code Playgroud)
没有内置的方法可以确保null不作为参数传递给方法(除非参数的类型是ValueType).我已经看到人们创建扩展方法来做一个关于参数是否为null的更简单(即更少的代码)断言,这可能是一个选项.另一方面,检查很短; 并且检查的意图非常清楚.如果您使用自定义检查方法,情况可能并非如此.
C#4.0将通过合同为这种编程添加更好的选项,但还没有.正如另一个答案所指出的,PostSharp是一个做你想做的事情的选择.PostSharp的工作原理是添加一个后编译步骤,其中添加了额外的代码.
但是,有一些选项可以静态检查是否可以传递null.例如,ReSharper允许您使用[NotNull]属性装饰自己的方法参数,如果ReSharper可以确定参数可能为null,则它将在编译时发出警告.当然,这只会警告您(可能)不良的编码实践,它不是运行时检查,不应该这样使用.
| 归档时间: |
|
| 查看次数: |
7995 次 |
| 最近记录: |