String.StartsWith(char)
和String.EndsWith(char)
是在 C#7.0 .NET Core 2.0中新实现的。
为什么String.Contains(char)
也没有实现?
我经常听到使用String.Contains(char)
自己创建String.IndexOf(c) != -1
扩展名的常见论点。但是我不喜欢创建简单的扩展,特别是如果我为了可读性而创建一个扩展,这就是我认为这些新的重载是为了(以及为什么我赞同这些更改:))。
答案 0 :(得分:7)
System.Linq.Enumerable
静态类已包含通用Contains
函数,该函数适用于IEnumerable<T>
IEnumerable<char>
,string
using System.Linq;
实现。
换句话说,它已经很久以前就已经实施了。只是不要忘记$WriteServerName = {
param($server)
Write-Host $server
}
$server = "servername"
$WriteServerName.invoke($server)
servername
。
答案 1 :(得分:2)
每个“为什么不是[某些] .NET Framework / Core / Standard [方法|类| whatnot]?”归结为两件事之一:
.NET Framework是一个非常大的工程系统的一部分,部分原因是它作为Windows的一部分提供。这意味着(在.NET Core出现之前)它更适合于大型扫描更改(如System.Linq,TPL,async / await等)而不是方法 - 这里/方法 - 那里。添加到现有类型的各个方法很大程度上是由于“在编写一个我们需要的大特征时,它比[InternalsVisibleTo]更公开”。这样做的结果是,如果没有人认为在创建原始类(以及随后的API审查)时需要一个方法,那么它就不会被添加(特别是如果某人自己写的很容易)。
使用.NET Core,事后添加内容要容易得多,所以社区对“sheesh,我必须一直将其作为扩展名”的反馈确实会产生一些回填,例如string.StartsWith(char)
。
每个成员都有一些相关的成本。对于非泛型类型的非泛型成员,它是磁盘上的少量字节和加载库的少量额外内存。对于泛型类型的成员,每个通用实例都有额外的内存开销。 (而且我不记得泛型方法是否会因使用它们的不同类型的数量而产生成本。)对于每个成员,都有维护成本。有时维护成本很低,但总是存在。
还有“认知超负荷”的代价。这是当你去写一些东西而IntelliSense(或其他类似的技术)告诉你你有“太多”选项,然后你不知道你想要哪一个。对于两个重载,例如(DateTime start, DateTime end)
vs (DateTime start, TimeSpan duration)
很容易推理,但是当可选参数重载开始弹出时,矩阵会变大。当IntelliSense说“+21更多重载”之类的东西时,一个人的大脑往往想要关闭。
在string.Contains(char)
的情况下,它可能是#1。可能没有人认为在为.NET Framework 1.0创作string
时它会特别有用。提交https://github.com/dotnet/corefx/issues/4805的人可能只需要StartsWith(或EndsWith)而字符串的另一端是显而易见的,但Contains只是有点太远了他们不需要思考的事实(事实上,如果你看看这个问题,“包含”一词根本没有出现。
它也有可能是#2。我当然可以想象API审查会议,其中有人说“好吧,所以字符串包含'q'......这有什么用?如果它以aq开头你可能正在进行子目录拆分。如果它以aq结束你可能正在构建一个反向字符串树来解决单词拼图。但是我无法想象为什么你想知道它在那里而不知道它在哪里......“。
如果这是您认为引人注目的方法,请随时在https://github.com/dotnet/corefx/issues之后API review process提交问题。
答案 2 :(得分:0)
因为string.IndexOf
永远存在。
但如果你真的认为这个名字对你很重要:
public static class StringExtensions
{
public static bool Contains(this string self, string text)
=> self.IndexOf(text) >= 0;
}