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