方法参数中的变量赋值

时间:2013-09-24 10:10:10

标签: c#

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

string s = "3";
int i;
int.TryParse(s = "hello", out i); //returns false

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

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

5 个答案:

答案 0 :(得分:7)

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

class SomeClass
{
    private string _value;

    public string Value { get { return _value ?? (_value = "hello"); } }
}

从C#6开始,可以使用=>表示法表示:

class SomeClass
{
    private string _value;

    public string Value => _value ?? (_value = "hello");
}

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

答案 1 :(得分:5)

这是合法的。

s = "hello",是一个先评估/执行的表达式,然后执行int.TryParse表达式。

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

答案 2 :(得分:4)

赋值是一个表达式,就像任何其他表达式一样。这是有效的语法。

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

int i;
int j;
int k;

i = j = k = 42;

答案 3 :(得分:2)

  

是否合法使用了a的返回值   分配

来自= Operator (C# Reference)

  

赋值运算符(=)存储其右侧操作数的值   在左侧表示的存储位置,属性或索引器中   操作数和返回值作为结果。

这意味着=不会仅进行分配,也会将值作为表达式返回。在方法内,您的s引用现在指向"hello"字符串而不是"3" ..

所以,

int.TryParse(s = "hello", out i); 

评估为;

int.TryParse("hello", out i); 

由于"hello"不是有效整数,因此返回false

答案 4 :(得分:1)

你基本上是在问:

  

对变量的赋值是否可以用作值?

一个有用的地方是菊花链变量赋值:

string a, b, c;
a = b = c = "hello";

括号内更清楚:

string a, b, c;
a = (b = (c = "hello"));

如果c = "hello"没有值hello,那么以上就不可能了。它在其他地方的使用有限,但没有真正的缺点。