委托类型参数是否需要空检查/本地副本
本文关键字:检查 副本 类型参数 是否 | 更新日期: 2023-09-27 17:55:54
给定一个传递了操作或函数委托的方法,我不记得我是否真的必须在调用之前制作本地副本并测试空值......或者,如果它已经通过作为参数传入的事实来处理?(谷歌现在让我失望了)
如果 for 循环正在迭代,而其他线程对它的外部引用为空,则需要更Foo2
类似于首先创建委托的本地副本的格式,p_transformer
是否可以在 Foo1
中为 null?
福1
using System;
using System.Linq;
using System.Collections.Generic;
namespace Extensions
{
public static partial class ExtensionMethods
{
public static IEnumerable<T> foo1<T>(this List<T> p_someList, Func<int, T> p_transformer = null)
{
if (Object.Equals(p_someList, null))
throw new ArgumentNullException("p_someList cannot be null.", default(Exception));
if (p_someList.Count == 0)
throw new ArgumentException("p_someList cannot be empty.");
if (p_transformer != null)
{
for (int i = 0; i < p_someList.Count; i++)
{
p_someList[i] = p_transformer(i);
yield return p_someList[i];
}
}
else
{
for (int i = 0; i < p_someList.Count; i++)
{
yield return p_someList[i];
}
}
}
}
}
与福2
using System;
using System.Linq;
using System.Collections.Generic;
namespace Extensions
{
public static partial class ExtensionMethods
{
public static IEnumerable<T> foo2<T>(this List<T> p_someList, Func<int, T> p_transformer = null)
{
if (Object.Equals(p_someList, null))
throw new ArgumentNullException("p_someList cannot be null.", default(Exception));
if (p_someList.Count == 0)
throw new ArgumentException("p_someList cannot be empty.");
var Transformer = p_transformer;
if (Transformer != null)
{
for (int i = 0; i < p_someList.Count; i++)
{
p_someList[i] = Transformer(i);
yield return p_someList[i];
}
}
else
{
for (int i = 0; i < p_someList.Count; i++)
{
yield return p_someList[i];
}
}
}
}
}
您仍然需要检查空值。
考虑一下:
private void Caller()
{
Func<int> func = null;
Callee(func);
}
private void Callee(Func<int> func)
{
func(0); // Oops
}
但是,Callee()
函数中的 func
参数已经是本地副本。