如何缩短仅在参数为';c#中的t null?

如何缩短仅在参数为';c#中的t null?,c#,function,null,C#,Function,Null,假设我有以下代码: var arg = getArg(); if(arg != null) { foo(arg); } 有没有办法缩短空检查+函数调用? 例如,是否有像“安全”这样的操作员可以像 foo(safe arg); 这将转换为“仅当'arg'不为null时才调用foo”? 我基本上不想向函数发送可能为null的参数,而是以一种简短的方式发送 谢谢 简短回答:不,没有 建议: P>没有复杂的代码或将第三方库包含到混合中,我认为在设计代码时必须考虑以下几点: 对于要提供的参数范

假设我有以下代码:

var arg = getArg();
if(arg != null)
{
  foo(arg);
}
有没有办法缩短空检查+函数调用? 例如,是否有像“安全”这样的操作员可以像

foo(safe arg);
这将转换为“仅当'arg'不为null时才调用foo”? 我基本上不想向函数发送可能为null的参数,而是以一种简短的方式发送


谢谢

简短回答:不,没有

建议:

<> P>没有复杂的代码或将第三方库包含到混合中,我认为在设计代码时必须考虑以下几点:

  • 对于要提供的参数范围,此代码应该做什么
  • 调用该代码的人是否知道该方法的可能结果
您可以做的第一件事是记录这些方法

在您的示例中,
getArg
似乎可以返回
null
。因此,一个好的方法可以是:

/// <summary>
/// Describe your method here
/// </summary>
/// <returns>Describe what it returns</returns>
/// <remarks>May return NULL if (explain why)</remarks>
public TypeName getArg()
{
    //do your code here
}
我们快到了

现在,这段代码将所有内容联系在一起

您从提供的文件中了解到:

  • args
    可以是
    null
  • foo()
    如果
    args
    null
而且,从文档中可以看出,由于性能原因,您希望尽可能避免
try catch

  • 鼓轮*
您提供的代码应为最终代码:)

但是再一次。这只是使用标准的.net代码


无论哪种方式,记录代码始终是可取的,提供上下文并防止bug缺乏如何使用代码的知识:)

简短回答:不,没有

建议:

<> P>没有复杂的代码或将第三方库包含到混合中,我认为在设计代码时必须考虑以下几点:

  • 对于要提供的参数范围,此代码应该做什么
  • 调用该代码的人是否知道该方法的可能结果
您可以做的第一件事是记录这些方法

在您的示例中,
getArg
似乎可以返回
null
。因此,一个好的方法可以是:

/// <summary>
/// Describe your method here
/// </summary>
/// <returns>Describe what it returns</returns>
/// <remarks>May return NULL if (explain why)</remarks>
public TypeName getArg()
{
    //do your code here
}
我们快到了

现在,这段代码将所有内容联系在一起

您从提供的文件中了解到:

  • args
    可以是
    null
  • foo()
    如果
    args
    null
而且,从文档中可以看出,由于性能原因,您希望尽可能避免
try catch

  • 鼓轮*
您提供的代码应为最终代码:)

但是再一次。这只是使用标准的.net代码

无论哪种方式,记录代码总是可取的,提供上下文并防止bug缺乏如何使用代码的知识:)

就我个人而言,我认为“如果此值为
null则不要调用”
“应该很少出现,因此键入
if
应该不是什么大问题。也就是说

如果您愿意设置一些扩展方法来处理各种参数列表计数,可以执行以下操作:

static class Extensions
{
    public static void IfNotNull<T>(Action<T> func, T arg)
        where T : class
    {
        if (arg != null)
        {
            func(arg);
        }
    }
}
IfNotNull(foo, arg);
不幸的是,编译器不会使用扩展方法语法推断委托类型来执行上述操作,这将进一步缩短语法。但是您可以使用
using static…
功能将
Extensions
方法引入范围,这样您就可以在不使用类名的情况下调用,如下所示:

static class Extensions
{
    public static void IfNotNull<T>(Action<T> func, T arg)
        where T : class
    {
        if (arg != null)
        {
            func(arg);
        }
    }
}
IfNotNull(foo, arg);
根据需要将此想法扩展到其他函数签名。您只需镜像用于
操作
Func
委托类型的模式

还要注意,上述方法增加了委托实例分配和调用的开销。实际上,这与仅仅输入
if
语句并不完全相同。在大多数情况下,它根本不会对性能产生任何影响

如果您希望避免委托开销,并且愿意为希望以这种方式处理的每个方法编写一个新方法,那么您当然可以添加中间方法:

void SafeFoo(ArgType arg)
{
    if (arg != null)
    {
        foo(arg);
    }
}
这对我来说似乎是一个真正的痛苦,尤其是如果你没有很多地方想避开
if
。但它就在那里

否则,不会。该语言为处理
null
值提供了一些不同的快捷方式,但没有任何内置功能可以满足特定场景的要求。

我个人认为“如果此值为
null
,则不要调用”这应该是一个很少发生的事件,因此键入
if
应该不是一个大问题。也就是说

如果您愿意设置一些扩展方法来处理各种参数列表计数,可以执行以下操作:

static class Extensions
{
    public static void IfNotNull<T>(Action<T> func, T arg)
        where T : class
    {
        if (arg != null)
        {
            func(arg);
        }
    }
}
IfNotNull(foo, arg);
不幸的是,编译器不会使用扩展方法语法推断委托类型来执行上述操作,这将进一步缩短语法。但是您可以使用
using static…
功能将
Extensions
方法引入范围,这样您就可以在不使用类名的情况下调用,如下所示:

static class Extensions
{
    public static void IfNotNull<T>(Action<T> func, T arg)
        where T : class
    {
        if (arg != null)
        {
            func(arg);
        }
    }
}
IfNotNull(foo, arg);
根据需要将此想法扩展到其他函数签名。您只需镜像用于
操作
Func
委托类型的模式

还要注意,上述方法增加了委托实例分配和调用的开销。实际上,这与仅仅输入
if
语句并不完全相同。在大多数情况下,它根本不会对性能产生任何影响

如果您希望避免委托开销,并且愿意为希望以这种方式处理的每个方法编写一个新方法,那么您当然可以添加中间方法:

void SafeFoo(ArgType arg)
{
    if (arg != null)
    {
        foo(arg);
    }
}
这对我来说真的很痛苦,尤其是