方法参数中的变量赋值

dav*_*v_i 8 c#

我刚刚发现(发现一个错误)你可以这样做:

string s = "3";
int i;
int.TryParse(s = "hello", out i); //returns false
Run Code Online (Sandbox Code Playgroud)

是否合法使用赋值的返回值?

(显然i++是,但这是一样的吗?)

Dav*_*rno 7

一般来说,我会避免使用赋值的返回值,因为它很容易导致必须发现错误.但是,对于该功能有一个很好的用途,如下图所示,延迟初始化:

class SomeClass
{
    private string _value;

    public string Value { get { return _value ?? (_value = "hello"); } }
}
Run Code Online (Sandbox Code Playgroud)

从C#6开始,可以用=>符号表示:

class SomeClass
{
    private string _value;

    public string Value => _value ?? (_value = "hello");
}
Run Code Online (Sandbox Code Playgroud)

通过使用?? 符号和赋值,简洁但可读的语法的返回值只能用于初始化字段,并在调用该属性时通过属性返回它.在上面的例子中,这不是那么有用,但在例如需要进行单元测试的外观中,只有初始化那些被测试的部件才能大大简化代码.


Fre*_*els 5

这是合法的.

s = "hello",是首先计算/执行的int.TryParse表达式,然后执行表达式.

因此,int.TryParse将使用当时"你好"的's'的内容,并且它返回false.


Pet*_*den 4

与其他表达式一样,赋值也是一个表达式。这是有效的语法。

出于同样的原因,这是有效的:

int i;
int j;
int k;

i = j = k = 42;
Run Code Online (Sandbox Code Playgroud)