我们有点困惑,为什么这段代码没有像我们预期的那样抛出任何错误IndexOutOfRangeException
。
Regex re = new Regex(@"(\d+)");
Match result = re.Match("123456789");
Console.WriteLine(result.Groups[1000000000].Value);
谁能解释一下他的想法?
Groups 不是数组,它是索引属性。它可以返回任何东西取决于它的代码。
public Group this[int groupnum] { get; }
来自 MSDN 的 UPD:
您可以通过检索 Count 属性的值来确定集合中的项目数。groupnum 参数的有效值范围从 0 到比集合中的项目数小一。
Match.Groups 属性返回的 GroupCollection 对象始终至少有一个成员。如果正则表达式引擎在特定输入字符串中找不到任何匹配项,则集合中的单个 Group 对象将其 Group.Success 属性设置为 false,并将其 Group.Value 属性设置为 String.Empty。
如果 groupnum 不是集合成员的索引,或者如果 groupnum 是输入字符串中未匹配的捕获组的索引,则该方法返回 Group 对象,其 Group.Success 属性为 false 且其 Group。值属性是 String.Empty。
我只是将其归结为实施选择。
GroupCollection.Item 属性 (Int32) 文档并未表明它会引发任何异常:甚至-1
可以:
Regex re = new Regex(@"(\d+)");
Match result = re.Match("123456789");
Console.WriteLine(result.Groups[1000000000].Value); // works: ""
Console.WriteLine(result.Groups[0].Value); // works: "123456789"
Console.WriteLine(result.Groups[-1].Value); // works: ""
将此与DataColumnCollection.Item Property (Int32) 文档进行对比,这表明它可以抛出IndexOutOfRangeException
:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("A"));
DataColumn existent = dt.Columns[0]; // works
DataColumn nonexistent = dt.Columns[1]; // doesn't work - IndexOutOfRangeException
也许有人可以提供洞察力的原因(S)GroupCollection
处理废话没有例外,并DataColumnCollection
处理同样的废话有一个例外,但我怀疑这与我们每个人可能选择编写一个简单的字符串包含方法(撇开BCL 已经对此提供支持):
bool StringContains(string inString, string lookForString)
{
if (inString.IsNullOrEmpty)
return false;
// blah
}
对比
bool StringContains(string inString, string lookForString)
{
if (inString == null)
throw new ArgumentNullException("inString");
if (inString.Length == 0)
throw new ArgumentException("inString cannot be empty.");
// blah
}