使用Visual Studio计算度量标准。
第一种方法有CC = 4
private IEnumerable<string> GetRows(DataTable dt, string columnDelimiter)
{
return from DataRow row in dt.Rows
select string.Join(columnDelimiter, row.ItemArray.Select(k => k.ToString()));
}
第二种方法有CC = 5.
private IEnumerable<string> GetRowsForeach(DataTable dt, string columnDelimiter)
{
var rows = new List<string>();
foreach (DataRow row in dt.Rows)
{
var rowString = string.Join(columnDelimiter, row.ItemArray.Select(k => k.ToString()));
rows.Add(rowString);
}
return rows;
}
我说第一种方法应该有CC = 1而第二种方法可能是CC = 1或者可能是2(对于最终情况我们也不会理解。但我永远不会说他们的CC是如此之高。我误解了什么? ?
答案 0 :(得分:3)
这是一个不完美的工具。它看到了IL,这是由C#编译器生成的代码。它没有看到您的代码。 C#中有很多语法糖,旨在使您的代码易于理解,但在水线之下有一个代码生成的冰山。查询理解肯定符合这种模式。
仅使用CC作为指导,永远不要让它设定规则,永远不要让它痉挛你的风格。你的大脑胜过任何工具。
答案 1 :(得分:2)
显然,这是因为使用linq方法生成的每个IEnumerator也会实现一个IDisposable,为了正确释放,将把代码包装在try..catch块中。
here有一个很好的解释。
在你的第一个例子中,你有两个select语句和一个连接,因此计数为4。