我对c#很新,并试图学习最佳实践。在过去的一周里,我需要在更长+更简单的代码之间做出选择,或者将多个动作组合成单个语句的更短代码。在尝试编写清晰,简洁的代码时,您是老编程员使用的标准是什么?以下是代码I的示例,其中包含两个选项。哪个更好?
A)
if (ncPointType.StartsWith("A"))//analog points
{
string[] precisionString = Regex.Split(unitsParam.Last(), ", ");
precision = int.Parse(precisionString[1]);
}
else
precision = null;
B)
if (ncPointType.StartsWith("A"))//analog points
precision = int.Parse(Regex.Split(unitsParam.Last(), ", ")[1]);
else
precision = null;
答案 0 :(得分:3)
没有对错。这是基于意见的。
但是,请记住,无论是添加大括号,添加注释,添加空格还是其他内容,它都不会影响最终程序集的性能或大小,因为编译器可以很好地优化它。那么,为什么不采用更冗长的方式让其他程序员更容易理解呢?
答案 1 :(得分:0)
这基本上取决于您选择的编码标准。没有对错,只有个人偏好。
以团队形式同意您的偏好。
答案 2 :(得分:0)
调试选项A更容易,但选项B更简洁,同时仍然可读。您可以使用三元运算符使其更简洁:
precision = ncPointType.StartsWith("A") ? int.Parse(Regex.Split(unitsParam.Last(), ", ")[1]) : null;
虽然这种方式更具可读性(并且仍以同样的方式工作!):</ p>
precision = ncPointType.StartsWith("A") ?
int.Parse(Regex.Split(unitsParam.Last(), ", ")[1]) :
null;
最好坚持使用项目中使用的标准。对于 可维护性 而言, 可读性 比拥有更少的代码行更为重要。在这两个选项中, 效率 是相同的,因此在这种情况下您不必担心速度。
答案 3 :(得分:0)
但更好的是:
precision = ncPointType.StartsWith("A")?
int.Parse(Regex.Split(unitsParam.Last(), ", ")):
null;
这表示执行beiong函数(设置精度), 以及控制如何设置的条件,甚至更少的代码, - 不创建不必要的临时变量来保存其他地方没有使用的临时结果。
答案 4 :(得分:0)
如果你问我A和B都是不好的做法。你应该总是使用大括号,无论它是一行还是多行。这有助于防止将来当人们向if或else块添加额外的代码行并且没有注意到大括号丢失时的错误。
有时使用“更多”代码(如使用临时变量等)会使代码更容易调试,因为您可以将鼠标悬停在符号上。这完全取决于平衡,而这还有经验。请记住,您可能不是唯一一个处理代码的人,所以最清楚。
答案 5 :(得分:0)
归根结底,它取决于你的选择,因为它与性能无关,但我还要注意,如果省略花括号,你就无法实例化或定义变量:
int a = 0;
if (a == 0)
int b = 3;
无效,而:
int a = 0;
if (a == 0)
{
int b = 3;
}
有效。
答案 6 :(得分:0)
正如其他所有人都指出的那样,本身没有硬性和快速的“规则”,但两个代码块之间可能存在大括号; A和B都具有与Apple goto bug类似的特征,因为引入了潜在的歧义。
考虑:
void Main()
{
int x=1;
if (x==1)
Console.WriteLine("1");
else if (x==2)
Console.WriteLine("NOT 1");
Console.WriteLine("OK");
}
将产生
1
OK
对于扫描代码的人,特别是如果它被其他无害的代码包围,这很容易被误读为“只打印”OK“如果x==2
。”显然有些人会发现它,有些人会赢得'但是,为什么要引入一个大括号的危险:)