c# – 修改string.Substring

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#文档,you can use extension methods to extend a class or interface,but not to override them. An extension method with the same name and signature as an interface or class method will never be called.所以答案是“否”.

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

注意:str.Substring(0,str.Length val);可以用str.Remove替换(str.Length val)

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...