正在修改字符串.衬底

本文关键字:衬底 字符串 修改 | 更新日期: 2024-09-24 05:17:16

10次中有9次,当我想在字符串上使用Substring()方法时,这是因为我想从字符串的END而不是开始处去掉一些字符。虽然默认的Substring确实支持这一点,但它通过采用第二个参数来实现,该参数是所需字符串的长度,而不是端点。这意味着,如果我一直想从一系列不同长度的字符串中删除N个字符,我必须执行额外的步骤,这可能会产生更多的代码。举个例子:

//Shaving the first N chars
string trimmed = foo.bar.widget.GetType().Name.Substring(N);

与。

//Shaving the last N chars
string trimmed = foo.bar.widget.GetType().Name.Substring(0, foo.bar.widget.GetType().Name.Length - N);

或者为了保存额外的函数调用,可以使用第二行:

string name = foo.bar.widget.GetType().Name;
string trimmed = name.Substring(0, name.Length - N);

无论哪种方式,基本上都是将从字符串末尾而不是开头删除字符所需的代码量增加一倍。我的修改很简单。如果传递负N(否则将毫无意义),它将从字符串的末尾而不是开头减去-N个字符。我已经可以用一种扩展方法编码了:

public static string MySubstring(this string str, int val)
{
    return (val > 0) ? str.Substring(val) : str.Substring(0, str.Length + val);
}

然后,当我想去掉最后的N个字符时,我只需要:

string trimmed = foo.bar.widget.GetType().Name.MySubstring(-N);

短而甜,就像剃掉开头的字符一样。我的问题是,是否可以覆盖默认Substring()函数的行为,这样我就可以做到这一点,而不必为该函数使用我自己的唯一名称?这并不会使任何现有代码失效,因为以前没有理由给它传递负数,这样做只会引发异常并崩溃。这只是一个简单而无意义的功能,感觉它一开始就应该是实现的一部分。

正在修改字符串.衬底

根据C#文档,您可以使用扩展方法来扩展类或接口,但不能覆盖它们。永远不会调用与接口或类方法具有相同名称和签名的扩展方法。所以答案是"不"。

可以说,这是一件好事™,因为否则你的代码会变成一场噩梦,读给不熟悉你的扩展的人听。

注:str.Substring(0, str.Length + val);可替换为str.Remove(str.Length + val)

不能使用扩展方法在严格意义上重写字符串上的方法,因为编译器在编译方法调用时总是选择实例方法而不是具有相同签名的扩展方法。但是,您可以使用命名参数来实现接近您想要的内容。这也应该有助于避免可读性问题。这里有一个的例子

public static string Substring(this string @this, int trimFromEnd)
{
    return @this.Substring(0, @this.Length - trimFromEnd);
}
// if you do
"abc".Substring(1) -> returns "bc"
// if you do
"abc".Substring(trimFromEnd: 1) -> returns "ab"

就我个人而言,我发现这比Substring(-1)或仅仅是Substring的可读性更强,因为这里的varName恰好是负数。