8

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

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

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

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

4

5 回答 5

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");
}

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

于 2013-09-24T10:26:55.127 回答
5

这是合法的。

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

因此,int.TryParse将使用 's' 的内容,当时是“hello”,它返回 false。

于 2013-09-24T10:20:00.810 回答
4

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

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

int i;
int j;
int k;

i = j = k = 42;
于 2013-09-24T10:15:13.283 回答
2

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

是的。

= Operator (C# Reference)

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

这意味着=不仅进行赋值,还将值作为表达式返回。在方法内部,您的s引用现在不再指向"hello"字符串"3"了..

所以,

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

被评估为;

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

因为"hello"它不是一个有效的整数,所以它返回false.

于 2013-09-24T10:27:02.630 回答
1

你基本上是在问:

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

它有用的一个地方是菊花链变量分配:

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

用括号括起来更清楚:

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

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

于 2013-09-24T10:21:05.567 回答