例如,如果我有一个定义为...的方法
T Create()
{
T t = Factory.Create<T>();
// ...
Assert.IsNotNull(t, "Some message.");
// -or-
if (t == null) throw new Exception("...");
// -or- anything that verifies that it is not null
}
...我正在从其他地方调用该方法......
void SomewhereElse()
{
T t = Create();
// >><<
}
...在>><<
,我知道(意思是我,写这篇文章的人),t
保证不会为空。是否存在一种方法(可能是我没有找到的属性)将方法标记为确保它返回或以其他方式传递的引用类型(可能是out
参数)由内部逻辑保证不是空的吗?
我必须羞怯地承认ReSharper主要是我关心的原因,因为它突出了它认为可能导致InvalidOperationException
或NullReferenceException
的任何事情。我认为它正在读取我可以在我的方法上标记的东西,或者它只知道Assert.IsNotNull
,简单的布尔检查或其他一些东西将消除某些东西为空的可能性并且它可以移除突出显示。
有什么想法?我只是成为了哦 - 我 - 上帝 - 重塑者的牺牲品 - 突显它 - 我必须要解决这种疾病吗?
答案 0 :(得分:5)
答案 1 :(得分:1)
不确定R#如何处理此问题,但Contract.Assert方法可能正是您要找的方法
答案 2 :(得分:1)
你可以在T上设置一个约束,只允许struct
。
您可以使用语言扩展程序,以便为您的函数(基于合同的编程)制定更强的前/后条件定义,例如SpecSharp或Code Contracts。 Code Contracts似乎利用了C#4.0的内置系统。我也没有经验 - 只听说过它们。
答案 3 :(得分:0)
你可以将T转换为一个对象,然后检查它是否为null?
var o = (object)Factory.Create<T>();
if(o == null) throw new Exception();