C# 返回赋值表达式

C# 返回赋值表达式,c#,string,return,variable-assignment,operator-keyword,C#,String,Return,Variable Assignment,Operator Keyword,当我在用C#编写一些旧代码时,我遇到了一个令我恼火的代码 不费吹灰之力,事情是这样的: private string foo(string _text) { /* some manipulation on _text */ return _text = Server.HtmlDecode(_text); } 这是最后一句令我厌烦的话;我来自C语言背景,我能理解代码实际上是试图返回一个解码的文本变量。赋值运算符的值也是左操作数,所以我可以看到它 但我还是觉得很讨厌 这是我需要习惯的C

当我在用C#编写一些旧代码时,我遇到了一个令我恼火的代码

不费吹灰之力,事情是这样的:

private string foo(string _text)
{
   /* some manipulation on _text */
   return _text = Server.HtmlDecode(_text);
}
这是最后一句令我厌烦的话;我来自C语言背景,我能理解代码实际上是试图返回一个解码的文本变量。赋值运算符的值也是左操作数,所以我可以看到它

但我还是觉得很讨厌

这是我需要习惯的C#中的一种纵坐标练习吗

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

return Server.HtmlDecode(_text);

而不是赋值表达式。是否有我不知道的更深层次的C#特性?

不,这是一件愚蠢的事情,它以在一行中塞满更多代码的名义牺牲了可读性。这几乎总是一件坏事


在这种情况下,它实际上毫无用处
\u text
是方法的参数,在方法体中更改它不会产生任何效果。将不会修改传递给方法的字符串。

它们具有相同的结果。后者最常见,或者:

_text = Server.HtmlDecode(_text);
return _text;
(我喜欢上面的或
return Server.HtmlDecode(_text);
,但不是您正在阅读的代码中的方式)

不,在这种情况下没有更深层次的C#特性,在
return
语句中执行赋值是毫无意义的。这只会让你更难理解代码应该做什么


与您建议的唯一不同之处在于,解码后的值被分配给
\u text
变量,但由于该变量不再使用,因此当方法结束时,它的值是什么并不重要。该参数是方法内部的局部变量,不会影响方法外部的任何内容。

此语句是多余的,不是一个C#practice

在ReSharper处于活动状态时执行此操作也会发出警告

分配的值不在任何执行路径中使用

正如您所提到的,此代码确实是最佳实践

return Server.HtmlDecode(_text);
此外,由于解码是对_文本进行操作的一部分,因此将赋值语句和返回语句分开也是有效的,以便将逻辑保持在同一块中:

/* Other manipulations on _text */
_text = Server.HtmlDecode(_text);

return _text;
当我在用C#编写一些旧代码时,我遇到了一个令我恼火的代码

这里有许多令人讨厌的问题。让我们把它们都列出来

private string foo(string _text)
{
   /* some manipulation on _text */
   return _text = Server.HtmlDecode(_text);
}
这是最后一句令我厌烦的话

这一评论也令人厌烦。局部变量很便宜。无需擦除
\u text
的原始值。相反,创建一个新的局部变量并对其进行操作。这样,当您在方法中的任何一点进行调试时,您都可以知道原始参数是什么。(请记住,当变量被覆盖时,原始参数可能有资格进行垃圾收集,因此可能会永远丢失。)

没有很好的理由,不要重写形式参数。这使得调试变得更加困难

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

在这种情况下,这是正确的,但总的来说是错误的;C#中赋值运算符的值是转换为与左侧关联的类型后右操作数的值。记住,左手边可能没有值;它可以是只写属性

这是我需要习惯的C#中的一种纵坐标练习吗

这里有一个标准的做法,是的。这种用法的奇怪之处在于:(1)所选择的变量是形式变量,(2)赋值与
返回组合在一起

C#的标准做法是:

现在,您可能想知道与您的建议相比,这有什么引人注目的好处:

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

  • 在程序集级别进行调试并查看EAX的内容
  • 进入
    HtmlDecode
    并检查其状态
  • 跳出当前方法,检查返回值分配给的对象
  • 将结果分配给其他无用的局部变量,然后在调试器中检查该局部变量
由于前三个是可怕的,后一个是简单的,这是许多C#程序员习惯做的事情

如果您这样做,然后不使用生成的本地,C#编译器知道这是一种常见做法,并故意抑制“您向本地写入了内容,但从未从中读取”警告。它只在本地有一个常量写入时发出警告,在这种情况下,您在编译时已经知道它是什么,通常不需要在调试器中检查它


希望现在VS2013终于支持了这个频繁请求的特性,这种模式将逐渐消失。

\u text
肯定不是一个全局变量,而是方法的参数。赋值真的有必要吗?您以后将无法使用
\u text
执行任何操作,而且很可能超出范围。@lc。这正是我部分要问的;如果有什么意义的话。根据我收集的资料,我想不会。@JaceKim不这么认为。当
\u text
是一个字段时,它可能已经被重构,在这种情况下
foo
将设置
\u text
的值并返回值?@lc。不幸的是,这是一个新的承诺。不管怎样,这个问题已经回答了,我很满意。谢谢大家。我更喜欢
Server.HtmlDecode(\u text)。也就是说,我更喜欢使用本地声明的字符串来存储字符串操作。我只是想知道是否有一些模糊的C#特性我不知道,或者我找不到。来自C和Lisp,C#似乎是t
return Server.HtmlDecode(_text);