有人可以告诉我允许使用string.Substring(someIndex,0)
的内容吗?
string a = "abc";
var result = a.Substring(1,0);
Console.WriteLine(result);
此代码将被编译,并且不会向控制台写入任何内容
这是允许的原因是什么?
在哪种情况下可以使用它?
更新
我将澄清我知道这个方法是什么,在这种情况下,它返回空字符串。我不是在问为什么结果是空的。我在问为什么允许这样做。
答案 0 :(得分:5)
许多事情是允许的,因为没有充分的理由禁止它们。
长度为零的子字符串就是这样的事情:在计算所需长度的情况下,这会使使用您的库的程序员在拨打电话之前不必检查长度。
例如,让我们说任务是在字符串中找到第一个和最后一个哈希标记#
之间的子字符串。当前库允许您执行此操作:
var s = "aaa#bbb"; // <<== Only one # here
var start = s.IndexOf('#');
var end = s.LastIndexOf('#');
var len = end-start;
var substr = s.Substring(start, len); // Zero length
如果禁止零长度,您将被迫添加条件:
var len = end-start;
var substr = len != 0 ? s.Substring(start, len) : "";
检查更少的先决条件使您的库更易于使用。在某种程度上,毕达哥拉斯定理在很大程度上是有用的,因为它适用于退化情况,当所有三边的长度为零时。
答案 1 :(得分:3)
此代码将被编译,并且不会向控制台写任何内容。
首先技术上讲,这句话是错误的:它在控制台上写了一个新行。那就是Line
中的WriteLine
进来的地方。但是不要挑剔。
允许这样做的原因是什么?
没有理由禁用它。比如说你想制作一个字符串插入方法:
public static string StringInsert(String original, String toInsert, int index) {
return original.Substring(0,index)+toInsert+original.SubString(index);
}
现在我们的StringInsert
方法无法知道第一部分或第二部分是否为空(我们可以决定在索引0
处插入)。如果我们必须考虑到第一个子字符串可能有零长度,或者第二个子字符串,或者两者都有,那么我们必须实现很多if
- 逻辑。现在我们可以使用 one liner 。
通常会考虑字符串 s 序列字符 s = s 0 s 1 内容S <子> N-1 子> 的。长度为 j 的 i 的子字符串是字符串 t = s i s i + 1 内容S <子> I + J-1 子> 的。这里没有歧义:很明显,如果 j 为0,那么结果就是空字符串。通常只有在例外的情况下才会引发异常:输入没有任何意义,或者是不允许的。
答案 2 :(得分:1)
您使用的方法具有以下签名:
public string Substring(
int startIndex,
int length
)
其中startIndex
是
此子字符串中从零开始的字符位置 实例
和length
是
子字符串中的字符数。
据说以下电话是一个非常有效的电话
var result = a.Substring(1,0);
但没有意义,因为要创建的子字符串中的charcaters数量为0.这就是为什么你在控制台中没有得到任何东西作为输出。
显然,调用Substring
并将值0作为第二个参数的值没有意义。
答案 3 :(得分:0)
public string Substring(startIndex,length)
一个字符串,它等于长度为length的子字符串 在此实例中从startIndex开始,如果startIndex相等则为Empty 到这个实例的长度,长度为零。
基本上,当你执行someString.Substring(n, 0);
时,你得到的是一个从n
开始并且长度为0的字符串。
length参数表示从当前字符串实例中提取的字符总数。
这就是为什么没有任何东西打印到控制台。返回的字符串为空(长度为0)。
编辑:
嗯,存在一个限制:如果符合以下情况,该方法会抛出ArgumentOutOfRangeException
startIndex加上length表示不在此实例中的位置。
-OR -
startIndex或length小于零。
如果length
少于而不是零,而不是相等,那么他们抛出异常的原因很可能是因为,尽管在< strong>大多数情况,请求长度为0的字符串不是无效请求。