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

本文关键字:检查 副本 类型参数 是否 | 更新日期: 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 参数已经是本地副本。