C#3.5 partial class String IsNullOrWhiteSpace

时间:2011-06-30 13:28:28

标签: c# .net string .net-3.5

我正在尝试为String类创建额外的功能(IsNullOrWhitespace,如在.NET4中) 但我在引用方面遇到了问题:

  

错误1'字符串'是'string'和'geolis_export.Classes.String'之间的模糊引用

我不想创建扩展方法。因为如果string x = null;

,这会崩溃

用法:

private void tbCabineNum_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    e.Handled = !e.Text.All(Char.IsNumber) || String.IsNullOrWhiteSpace(e.Text);
}

String partial:

public partial class String
{
    public static bool IsNullOrWhiteSpace(string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}

是否无法为String课程创建额外内容? 我试图将部分放在System命名空间中,但这会产生其他错误。

String重命名为String2也可以解决问题。但这不是我想要的,因为那时没有原始String类的参考。

7 个答案:

答案 0 :(得分:44)

不可能这样,因为.NET框架中的string类不是部分的 相反,使用这样的实际扩展方法:

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}

用法如下:

string s = "test";
if(s.IsNullOrWhiteSpace())
    // s is null or whitespace

与所有扩展方法一样,如果字符串为null,则调用不会导致空引用异常:

string s = null;
if(s.IsNullOrWhiteSpace()) // no exception here
    // s is null or whitespace

此行为的原因是编译器会将此代码转换为IL代码,该代码等效于以下IL代码:

string s = null;
if(StringExtensions.IsNullOrWhiteSpace(s))
    // s is null or whitespace

答案 1 :(得分:6)

扩展方法必须在静态类中定义为静态方法还要注意参数上的this关键字。

public static class MyExtensions
{
    public static bool IsNullorWhitespace(this string input)
    {
         // perform logic
    }
}

通过省略类上的static所做的是在程序集中定义一个竞争类,因此来自编译器的模糊消息。

答案 2 :(得分:2)

string类未声明为部分,您必须改为编写扩展方法。

答案 3 :(得分:1)

public static class MyExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return false;
        return string.IsNullOrEmpty(value.Trim());
    }
}

答案 4 :(得分:0)

要创建扩展方法,您需要使用以下语法。 (注意使用关键字this):

public static bool IsNullOrWhiteSpace(this string value)

答案 5 :(得分:0)

这不是您创建扩展方法的方式。该类不是部分的,它需要是一个静态类,它可以被命名为任何东西(MyExtensionMethods)。您还需要在扩展方法上使用“this”标记参数。

试试这个

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value == null) return true;
        return string.IsNullOrEmpty(value.Trim());
    }
}

答案 6 :(得分:0)

修剪字符串会导致可避免的字符串分配(这会损害性能)。最好依次检查每个字符而不分配任何内容:

        public static bool IsNullOrWhiteSpace(this string value)
        {
#if NET35
            if (value == null)
                return true;

            foreach (var c in value)
            {
                if (!char.IsWhiteSpace(c))
                {
                    return false;
                }
            }

            return true;
#else
            return string.IsNullOrWhiteSpace(value);
#endif
        }

#if NET35 代码意味着回退实现仅在面向 .NET 3.5 时存在。您可以根据需要调整该比较以满足项目的目标框架。否则,将使用默认的 string.IsNullOrWhiteSpace 方法,并且可能会内联此 util 方法。