C# 有没有办法将方法标记为确保T不为null?
例如,如果我有一个定义为C# 有没有办法将方法标记为确保T不为null?,c#,attributes,null,C#,Attributes,Null,例如,如果我有一个定义为 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 } T创建() { T=Facto
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
}
T创建()
{
T=Factory.Create();
// ...
IsNotNull(t,“Some message.”);
//-或-
如果(t==null)抛出新异常(“…”);
//-或-验证其不为null的任何内容
}
…我正在从其他地方调用该方法
void SomewhereElse()
{
T t = Create();
// >><<
}
void somewhere()
{
T=创建();
//>>不确定R#如何处理此问题,但该方法可能就是您正在寻找的方法能否将T强制转换为对象,然后检查其是否为null
var o = (object)Factory.Create<T>();
if(o == null) throw new Exception();
var o=(对象)Factory.Create();
如果(o==null)抛出新异常();
您可以在T上设置一个约束,使其仅允许struct
您可以使用一种语言扩展,它允许您对函数的前置/后置条件进行更强的定义(基于契约的编程)代码契约似乎利用了C#4.0中的内置系统。我对此都没有经验,只是听说过它们。如果你关心的是ReSharper,那么你可以用它们的[NotNull]标记工厂.Create()
方法
在他们的中描述的属性我也患有oh-my-god-resharper-highlights-it-I-have-to-fix-it疾病。所以你并不孤单。我想我一直害怕他们的web帮助。这正是我所寻找的。现在我不得不面对这样一个事实:我从来没有在我们的应用程序中引用过resharper程序集:)。谢谢!@Shibumi-他们实际上展示了如何通过将定义剪切和粘贴到代码中来绕过引用他们的程序集。它在同一个链接中。我实际上只是回来修改它。我看到他们可以检测到名称空间和属性在您自己的代码中的存在。我想我仍然会很难做到这一点,不过:“我想将这些无关属性添加到我们的代码库中,这样我的OCD就可以删除扭曲的线条了。”不过,谢谢你的帮助;你完全找到了我想要的答案!问题是它必须是ReSharper能够识别的东西。@Shibumi:如果你使用我建议的方法来解决这个问题的话(这将提供它自己的独立验证,并且可以在编译时保证这一点,从而减轻代码的运行时检查),您肯定应该添加配置/pragmas来配置ReSharper以忽略它们。这看起来像是正确的文档:。您应该始终检查并自定义来自任何静态分析工具的警告。@Shibumi:但您可以自由选择最适合您的解决方案:)充分利用你已经拥有的工具通常比在这个问题上投入更多的技术要好。Mike two的答案似乎很好。我同意你的观点,像这样的东西(至少是“如何检查”的东西)应该标准化,使用普通工具是一个很好的方法。谢谢!(使用#pragma禁用它们的问题是,它会使我需要查看的地方变得模糊。使用注释可能看起来很混乱。)