gpt4 book ai didi

c# - 扩展方法和本地 'this' 变量

转载 作者:太空狗 更新时间:2023-10-29 20:16:29 27 4
gpt4 key购买 nike

据我所知this在扩展方法中作为 ref 传递多变的。我可以通过这样做来验证这一点

public static void Method<T>(this List<T> list)
{
list.Add(default(T));
}

List<int> ints = new List<int>(new int[] { 1, 2, 3, 4, 5 });
ints.Method();

我的 List<int> ints现在是1, 2, 3, 4, 5, 0 .

但是当我这样做的时候

public static void Method<T>(this List<T> list, Func<T, bool> predicate)
{
list = list.Where(predicate).ToList();
}

List<int> ints = new List<int>(new int[] { 1, 2, 3, 4, 5 });
ints.Method(i => i > 2);

我希望我的 List<int> ints成为3, 4, 5但保持不变。我是否遗漏了一些明显的东西?

最佳答案

this 扩展方法参数是按值传递的,而不是按引用传递的。这意味着在进入扩展方法时,您有两个变量指向相同的内存地址:原始 intslist 参数。当您在扩展方法中向列表中添加一个项目时,它会反射(reflect)在 ints 中,因为您修改了两个变量引用的对象。当您重新分配 list 时,将在托管堆上创建一个新列表,并且扩展方法的参数指向该列表。 ints 变量仍然指向旧列表。

关于c# - 扩展方法和本地 'this' 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33056956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com