我正在尝试为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
类的参考。
答案 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 方法。