方法参数中的变量赋值

本文关键字:变量 赋值 参数 方法 | 更新日期: 2023-09-27 18:32:29

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

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

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

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

方法参数中的变量赋值

通常,

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

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

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

这是

合法的。

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

因此,int.TryParse将使用当时"hello"的"s"内容,并且返回 false。

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

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

int i;
int j;
int k;
i = j = k = 42;

使用返回值是否有合法用途 分配?

是的。

= Operator (C# Reference)

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

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

所以

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

被评估为;

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

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

你基本上是在问:

变量赋值可以用作值有用吗?

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

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

括号中哪个更清晰:

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

如果c = "hello"没有值hello,则上述操作是不可能的。它在其他地方的用途有限,但没有真正的缺点。