gpt4 book ai didi

c# - 使用 IsNullOrEmpty 扩展 String 类是否令人困惑?

转载 作者:可可西里 更新时间:2023-11-01 08:30:37 32 4
gpt4 key购买 nike

每个人都知道并喜欢 String.IsNullOrEmpty(yourString) 方法。

我想知道如果我们扩展 String 类以具有这样的方法是否会让开发人员感到困惑或使代码变得更好:

yourString.IsNullOrEmpty();

专业版:

  1. 更具可读性。
  2. 减少打字。

缺点:

  1. 可能会造成混淆,因为 yourString变量可以是 null 并且看起来就像你正在执行一个方法null 变量。

你怎么看?

关于 myObject.IsNull() 方法,我们可以问同样的问题。

我会这样写:

public static class StringExt
{
public static bool IsNullOrEmpty(this string text)
{
return string.IsNullOrEmpty(text);
}

public static bool IsNull(this object obj)
{
return obj == null;
}
}

最佳答案

如果我没记错的话,这里的每个答案都谴责可以在空实例上调用扩展方法这一事实,因此他们不支持相信这是一个好主意。

让我反驳他们的论点。

我完全不相信在可能为 null 的对象上调用方法会令人困惑。事实上,我们只检查特定位置的空值,而不是 100% 的时间。这意味着有一定百分比的时间我们进行的每个方法调用都可能在空对象上。这是可以理解和接受的。如果不是,我们将在每次调用方法之前检查 null。

那么,一个特定的方法调用可能发生在一个 null 对象上会让人感到困惑吗?看下面的代码:

var bar = foo.DoSomethingResultingInBar();
Console.Writeline(bar.ToStringOr("[null]"));

你是不是很迷茫?你应该。因为这是 foo 的实现:

public Bar DoSomethingResultingInBar()
{
return null; //LOL SUCKER!
}

看到了吗?您阅读代码示例时不会感到困惑。您了解,foo 可能会从该方法调用返回 null,而 bar 上的 ToStringOr 调用将导致 NRE。你头晕了吗?当然不是。据了解,这可能会发生。现在,这个 ToStringOr 方法并不熟悉。在这些情况下你会怎么做?您要么阅读有关该方法的文档,要么检查调用代码。在这里:

public static class BarExtensions
{
public static string ToStringOr(this bar, string whenNull)
{
return bar == null ? whenNull ?? "[null]" : bar.ToString();
}
}

令人困惑?当然不是。很明显,开发人员想要一种检查 bar 是否为 null 并用非 null 字符串替换它的简写方法。这样做可以显着削减代码并提高可读性和代码重用性。当然,您可以用其他方式做到这一点,但这种方式不会比其他任何方式更令人困惑。例如:

var bar = foo.DoSomethingResultingInBar();
Console.Writeline(ToStringOr(bar, "[null]"));

当您遇到这段代码时,您与原始版本有什么不同?您仍然需要检查代码,您仍然需要确定它在 bar 为 null 时的行为。您仍然必须处理这种可能性。

扩展方法是否令人困惑?除非你不理解它们。而且,坦率地说,对于语言的任何部分,从委托(delegate)到 lambda,都可以这样说。

关于c# - 使用 IsNullOrEmpty 扩展 String 类是否令人困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790810/

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