【问题标题】:VS: Automatic "ArgumentNull' check?VS:自动“ArgumentNull”检查?
【发布时间】:2010-10-16 14:04:36
【问题描述】:

当我需要检查方法的参数是否不为空时,通常是这种情况,例如:

public static bool operator <= 
    (ApplicationVersion i_app1, ApplicationVersion i_app2)
{ 
    if (i_app1 == null) throw new ArgumentNullException("i_app1");
    if (i_app2 == null) throw new ArgumentNullException("i_app2");
    [...]
}

有没有办法(半)自动执行此操作,例如 Code sn-ps?自动完成?锐化器?

【问题讨论】:

    标签: .net visual-studio autocomplete code-generation resharper


    【解决方案1】:

    Resharper 有这个功能。如果您将光标悬停在参数名称上 - 比如说 i_app1 并按 Alt-Enter - 它会提供检查 null 的选项。

    【讨论】:

    • 一旦光标位于参数上 - 在方法签名中,它就会隐藏在左侧出现的灯泡图标下。还有你用的是什么版本的 R#?
    • “我是盲人”的评论是为了自嘲,即答案就在我的眼皮底下,直到你指出我才看到它:)。
    【解决方案2】:

    我对此有一个扩展方法,它至少稍微更简单:

    i_app1.ThrowIfNull("i_app1");
    

    实现很简单:

    public static void ThrowIfNull<T>(this T argument, string name)
        where T : class
    {
        if (argument == null)
        {
            throw new ArgumentNullException(name);
        }
    }
    

    我更喜欢使用 sn-ps 或其他方法,因为这意味着代码本身更短。打字对我来说很少是问题 - 而保持代码尽可能可读。

    但希望 .NET 4.0 中的 Code Contracts 能让这个更整洁。

    【讨论】:

    • 这种扩展方式让我有点不寒而栗。唯一更令人不安的是 ByRef 扩展方法:)。 blogs.msdn.com/jaredpar/archive/2008/12/11/…
    • @Jared:你不喜欢它的什么地方?它非常简单地说明了您打算做什么。至于“by ref”——大概在 C# 中不起作用?我真的希望不会!
    • 我的直觉反应是拒绝在空引用上调用的方法。我意识到它是一种扩展方法,并且在引擎盖下它变成了一个静态调用,所以没问题。但我仍然很难克服最初的直觉反应。
    • (cont) 我个人更喜欢 ThrowIfNull(i_app1, "i_app1") 但这在 C# 中是不可行的(在 VB 中效果很好)。在 C# 中,我通常选择 Argument.VerifyNotNull(i_app1,"i_app1") 或选择 sn-p。
    • (cont2) 是的,C# 不支持 byref 扩展方法。
    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 2011-03-14
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2013-05-22
    相关资源
    最近更新 更多