gpt4 book ai didi

c# - 编码风格 : assignments inside expressions?

转载 作者:可可西里 更新时间:2023-11-01 08:30:28 24 4
gpt4 key购买 nike

向该社区征求见解的快速问题:哪个更可取?


选项①

// How many spaces are there in the beginning of string? (and remove them)
int spaces = text.Length;
text = text.TrimStart(' ');
spaces -= text.Length;
  • 优点:在单独的行上分配,因此副作用是明确的
  • 缺点:第一行本身看起来很荒谬;你必须注意第三行才能理解它

选项②

// How many spaces are there in the beginning of string? (and remove them)
int spaces = text.Length - (text = text.TrimStart(' ')).Length;
  • 优点:语句在其执行的计算方面是有意义的
  • 缺点:赋值有点隐藏在表达式中;副作用可以忽略

最佳答案

两个我都不喜欢。编写清晰代码的一些准则:

  • 变量的含义在变量的整个生命周期内应保持不变。

选项(1)违反了这个准则;变量“spaces”被注释为“文本中有多少个空格”,但实际上从来没有这个意思!它以文本中的字符数开始其生命周期,以文本中曾经的空格数结束其生命周期。它在其整个生命周期中意味着两种不同的事物,而且它们都不是文档中的意思。

  • 表达式语句只有一个副作用。 (“表达式语句”是由单个表达式组成的语句;在 C# 中,合法的语句表达式是方法调用、对象构造、递增、递减和赋值。)

  • 表达式没有副作用,除非表达式是表达式语句的单一副作用。

选项 (2) 显然违反了这些准则。具有多种副作用的表达式语句很难推理,它们也很难调试,因为您不能将断点放在您想要的位置,这一切都很糟糕。

我会重写您的片段以遵循这些准则。

string originalText = text;
string trimmedText = originalText.TrimStart(' ');
int removedSpaces = originalText.Length - trimmedText.Length;
text = trimmedText;

每行一个副作用,每个变量在其整个生命周期中都意味着完全相同的事情。

关于c# - 编码风格 : assignments inside expressions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com