14

我不断检查字符串字段以检查它们是否为空或空白。

if(myString == null || myString.Trim().Length == 0)
{
    throw new ArgumentException("Blank strings cannot be handled.");
}

为了节省自己的打字时间,是否可以为 String 类创建一个具有相同效果的扩展方法?我了解如何为类实例添加扩展方法,但是向类添加静态扩展方法呢?

if(String.IsNullOrBlank(myString))
{
    throw new ArgumentException("Blank strings cannot be handled.");
}
4

10 回答 10

36

你可以这样做:

public static bool IsNullOrBlank(this String text)
{
  return text==null || text.Trim().Length==0;
}

然后这样称呼它:

if(myString.IsNullOrBlank())
{
  throw new ArgumentException("Blank strings cannot be handled.");
}

null这是因为 C# 允许您在实例上调用扩展方法。

于 2009-03-15T11:24:25.193 回答
17

我知道这是一个老问题,但由于它被碰撞并且尚未被提及,从 .NET 4.0 开始,您可以简单地使用String.IsNullOrWhiteSpace 方法来实现相同的结果。

于 2010-11-08T22:29:16.207 回答
6

您可以安全地在实例上使用扩展方法:

public static class StringExtensions
{
    public static bool IsNullOrBlank(this string s)
    {
        return s == null || s.Trim().Length == 0;
    }
}

测试用例:

string s = null;
Assert.IsTrue(s.IsNullOrBlank());
s = " ";
Assert.IsTrue(s.IsNullOrBlank());

虽然看起来有点奇怪,但我会弄清楚为什么你的字符串需要经常检查这种情况。如果你从源头上修复它们,你以后就不必对它们如此偏执了!

于 2009-03-15T11:26:21.990 回答
2

您可以将静态方法添加到现有类吗?答案是否定的,而且值会很薄,因为您仍然需要知道首先输入哪个类名;使用扩展方法,优点是您从变量名开始,自动完成会向您显示适用于它的内容。

经常提出的另一点是,如果扩展方法的第一个参数为空,则应始终尽快抛出异常。但是,我认为如果该方法在其名称中提到它旨在检查null.

您遇到的真正问题是,您希望在检查空引用后整洁且可读地运行一些代码。捕捉这种模式的一种方法是我对这个问题的回答

于 2009-03-15T11:15:10.363 回答
2

现有答案的过载可能是:

public static bool IsNullOrBlank(this String text, Action<String> doWhat)
{
  if (text!=null && text.Trim().Length>0)
    doWhat(text);
}

如果您只想运行给定有效值的代码,将会很有帮助。

不是一个超级有用的例子,但只是展示了用法:

Name.IsNullOrBlank(name=>Console.WriteLine(name));
于 2009-08-08T13:08:35.647 回答
1
public static bool IsNullOrEmptyTrimmed(string value)
{
    return (value == null || value.Length == 0) ?
        true : value.Trim().Length == 0;
}

或者

public static bool IsNullOrEmpty(this String value, bool checkTrimmed)
{
    var b = String.IsNullOrEmpty(value);
    return checkTrimmed ? (b && value.Trim().Length > 0) : b;
}
于 2009-03-15T12:27:47.147 回答
1

有点晚了。但是您也可以将代码放入扩展方法中以引发异常。我有两种方法(forArgumentNullExceptionNullReferenceException)。

// strings
public static bool NullBlankCheck(this string s, string message = "",
    bool throwEx = true)
{
    return Check<NullReferenceException>(s.IsNullOrBlank(), throwEx, message);
}
public static bool NullBlankCheckArgument(this string s, string message = "",
    bool throwEx = true)
{
    return Check<ArgumentException>(s.IsNullOrBlank(), throwEx, message);
}

private static bool Check<T>(bool isNull, bool throwEx, string exceptionMessage)
    where T : Exception
{
    if (throwEx && isNull)
        throw Activator.CreateInstance(typeof(T), exceptionMessage) as Exception;
    return isNull;
}

public static bool IsNullOrBlank(this string s)
{
    return string.IsNullOrEmpty(s) || s.Trim().Length == 0;
}

单元测试:

Assert.Throws<NullReferenceException>(() =>
{
    "".NullEmptyCheck();
});
Assert.Throws<ArgumentException>(() =>
{
    "".NullEmptyCheckArgument();
});

然后将其用作:

public void Method(string someStr)
{
    someStr.NullBlankCheckArgument();
    // do something
    var str = someMethod();
    str.NullBlankCheck();
}
于 2013-05-24T19:52:19.807 回答
1

虽然这个问题是十多年前提出的,但我看没有人提到有一个内置的字符串方法来处理这个问题。

因此,请string.IsNullOrWhitespace()改用。没有破解任何东西,使用语言功能就可以了。

于 2020-05-21T19:12:24.133 回答
0

使用一些技巧,您可以让它看起来像是添加到任何一个cs文件中的String类:

namespace JDanielSmith
{
    public static class String
    {
        public static bool IsNullOrBlank(string text)
        {
            return text == null || text.Trim().Length == 0;
        }
    }
}

(注意,这不是扩展方法,请参阅我的评论)。

然后,在其他一些 CS 文件中:

using String = JDanielSmith.String;
namespace Foo.Bar.Baz
{
    class Program
    {
        static void test(string myString)
        {
            if (String.IsNullOrBlank(myString))
            {
                throw new ArgumentException("Blank strings cannot be handled.");
            }
        }
...

注意String.IsNullOrBlank()的“期望”语法。我不一定建议您实际上以这种方式做事,只是指出您可以如何设置以使您的代码正常工作。

于 2009-03-15T23:39:15.287 回答
-1
public static bool IsNull(this object o)
{
    return string.IsNullOrEmpty(o.ToStr());
}

public static bool IsNotNull(this object o)
{
    return !string.IsNullOrEmpty(o.ToStr());
}

public static string ToStr(this object o)
{
    return o + "";
}
于 2009-03-15T12:01:36.447 回答