Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 委托类型参数是否需要空检查/本地副本?_C#_Struct_Delegates_Immutability - Fatal编程技术网

C# 委托类型参数是否需要空检查/本地副本?

C# 委托类型参数是否需要空检查/本地副本?,c#,struct,delegates,immutability,C#,Struct,Delegates,Immutability,给定一个传递了动作或函数委托的方法,我想不起来在调用之前是否必须创建一个本地副本并测试null。。。或者,如果它已经作为一个参数传入,那么它已经被处理了?(谷歌现在让我失望了) 如果for循环正在迭代,而其他一些线程将对它的外部引用置空,则p_transformer在Foo1中是否可以为null,这需要一种更像Foo2的格式,其中首先生成委托的本地副本 Foo1 使用系统; 使用System.Linq; 使用System.Collections.Generic; 命名空间扩展 { 公共静态部分类

给定一个传递了动作或函数委托的方法,我想不起来在调用之前是否必须创建一个本地副本并测试null。。。或者,如果它已经作为一个参数传入,那么它已经被处理了?(谷歌现在让我失望了)

如果for循环正在迭代,而其他一些线程将对它的外部引用置空,则
p_transformer
Foo1
中是否可以为null,这需要一种更像
Foo2
的格式,其中首先生成委托的本地副本

Foo1
使用系统;
使用System.Linq;
使用System.Collections.Generic;
命名空间扩展
{
公共静态部分类扩展方法
{
公共静态IEnumerable foo1(此列表p_someList,Func p_transformer=null)
{
if(Object.Equals(p_someList,null))
抛出新ArgumentNullException(“p_someList不能为null。”,默认值(异常));
if(p_someList.Count==0)
抛出新ArgumentException(“p_someList不能为空”);
if(p_transformer!=null)
{
for(int i=0;i
Vs.Foo2
使用系统;
使用System.Linq;
使用System.Collections.Generic;
命名空间扩展
{
公共静态部分类扩展方法
{
公共静态IEnumerable foo2(此列表p_someList,Func p_transformer=null)
{
if(Object.Equals(p_someList,null))
抛出新ArgumentNullException(“p_someList不能为null。”,默认值(异常));
if(p_someList.Count==0)
抛出新ArgumentException(“p_someList不能为空”);
无功变压器=p_变压器;
if(Transformer!=null)
{
for(int i=0;i
您仍然需要检查空值

考虑这一点:

private void Caller()
{
    Func<int> func = null;
    Callee(func);
}

private void Callee(Func<int> func)
{
    func(0);  // Oops
}
private void Caller()
{
Func Func=null;
被叫人(func);
}
私有无效被调用方(Func Func)
{
func(0);//Oops
}

但是,
Callee()
函数中的
func
参数已经是本地副本。

您仍然需要检查null

考虑这一点:

private void Caller()
{
    Func<int> func = null;
    Callee(func);
}

private void Callee(Func<int> func)
{
    func(0);  // Oops
}
private void Caller()
{
Func Func=null;
被叫人(func);
}
私有无效被调用方(Func Func)
{
func(0);//Oops
}

但是,
Callee()
函数中的
func
参数已经是本地副本。

@KirkWoll对不起,是的,这就是我的意思。我编辑了我的答案以便更清楚。@KirkWoll啊,那是我不记得的。谢谢你们两个。@KirkWoll对不起,是的,这就是我的意思。我编辑了我的答案以便更清楚。@KirkWoll啊,那是我不记得的。谢谢你们两位。