返回赋值表达式

Jac*_*Kim 7 c# string return variable-assignment operator-keyword

当我在C#中处理一些较旧的代码时,我遇到了一个令我烦恼的代码.

没有太多的麻烦,它是这样的:

private string foo(string _text)
{
   /* some manipulation on _text */
   return _text = Server.HtmlDecode(_text);
}
Run Code Online (Sandbox Code Playgroud)

这是让我烦恼的最后一句话; 我来自C背景,我可以理解代码实际上是试图返回一个已解码的_text变量.赋值运算符的值也是左操作数,所以我可以看到它.

然而,我仍然觉得它很令人厌烦.

它是C#中的纵向练习,我需要习惯吗?

对我来说,最后一行应该是

return Server.HtmlDecode(_text);
Run Code Online (Sandbox Code Playgroud)

而不是作业表达.是否有更深入的C#功能,我不知道?

Eri*_*ert 11

当我在C#中处理一些较旧的代码时,我遇到了一个令我烦恼的代码.

这里有许多令人厌烦的问题.让我们列出所有.

private string foo(string _text)
{
   /* some manipulation on _text */
   return _text = Server.HtmlDecode(_text);
}
Run Code Online (Sandbox Code Playgroud)

这是让我烦恼的最后一句话

评论也令人厌烦.局部变量很便宜.没有必要删除原始值_text.相反,创建一个新的局部变量并操纵它.这样,当您在方法中的任何位置进行调试时,您可以知道原始参数是什么.(请记住,在变量被覆盖的那一刻,原始参数可能有资格进行垃圾收集,因此可能永远丢失.)

没有很好的理由,不要写一个正式的参数.这使得调试变得更加困难.

赋值运算符的值是左操作数,所以我可以看到它.

在这种情况下这是正确的,但总的来说是微不足道的; C#中赋值运算符的值是转换为与左侧关联的类型后操作数的值.请记住,左侧可能没有值; 它可能是一个只写属性.

它是C#中的纵向练习,我需要习惯吗?

这里有一个标准做法,是的.关于这种用法的奇怪之处在于:(1)选择的变量是形式的,(2)赋值与...相结合return.

C#中的标准做法是:

string decoded = Server.HtmlDecode(_text);
return decoded;
Run Code Online (Sandbox Code Playgroud)

现在你可能想知道这对你的建议有什么好处:

return Server.HtmlDecode(_text);
Run Code Online (Sandbox Code Playgroud)

答案是:在Visual Studio 2013之前,调试器中没有工具可以检查方法调用的返回值!因此,如果您想HtmlDecode在调试时查看返回的值,您有以下选择:

  • 在程序集级别进行调试并查看EAX的内容
  • 进入HtmlDecode并检查其状态
  • 退出当前方法并检查分配给返回值的内容
  • 将结果分配给其他无用的局部变量,然后在调试器中检查本地

由于前三个是可怕的,而最后一个很容易,这就是许多C#程序员习惯做的事情.

如果你这样做,然后使用结果本地,C#编译器知道这是一种常见的做法,并故意压制"你写的本地,然后你从来没有读过"警告.它只会在本地有一个常量写入时发出警告,在这种情况下,你已经知道它在编译时是什么,并且通常不需要在调试器中检查它.

希望现在VS2013最终支持这种频繁请求的功能,这种模式将逐渐消失.