如何缩短仅在参数为';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
- 鼓轮*
无论哪种方式,记录代码始终是可取的,提供上下文并防止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
- 鼓轮*
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);
}
}
这对我来说真的很痛苦,尤其是