gpt4 book ai didi

如果为空,则设置为新实例的 C# 扩展方法

转载 作者:太空狗 更新时间:2023-10-30 00:05:32 26 4
gpt4 key购买 nike

我有以下扩展方法来帮助我检查和实例化对象(如果它们为空)。前两个工作正常,但不是很有用。

    public static bool IsNull<T>(this T t)
{
return ReferenceEquals(t, null);
}

public static T NewIfNull<T>(this T t, Func<T> createNew)
{
if (t.IsNull<T>())
{
return createNew();
}

return t;
}

public static void Ensure<T>(this T t, Func<T> createNew)
{
t = t.NewIfNull<T>(createNew);
}

最终我想做类似的事情

IList<string> foo;
...
foo.Ensure<IList<string>>(() => new List<string>());

然而 Ensure 方法没有达到预期的效果,即设置 fooList<string> 的实例如果它为 null,则基本上将其设置为自身。

如果您现在知道我可以调整 Ensure 方法来实现这一点,我将不胜感激。

谢谢,汤姆

最佳答案

您需要区分对象变量。对象永远不能为 null - 变量的值可以。您不是在尝试更改对象的某些内容(这 起作用)-您是在尝试更改调用者变量的值。

但是,默认情况下参数是按值传递的,这意味着您的扩展方法会更改参数(在方法中声明的变量),但这对调用者的没有影响/em> 变量。通常您可以将参数更改为 ref 以实现按引用传递语义,但扩展方法不能有 refout 第一个参数。

正如其他人所说,使用 null-coalescing operator (??)是一个更好的选择。请注意,在这个表达式中:

foo = foo ?? new List<string>();

除非 foo 为空,否则不会构造新列表。 ?? 的右手操作数除非需要,否则不会计算。

关于如果为空,则设置为新实例的 C# 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10967421/

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