添加了C#7.x语法后,是否有一个版本的;x??(x=MakeX())”;,其中x是通过out参数指定的?
C#中的一个成语“在第一次访问时创建值”1是使用如下2: 如果有一个细微的变化,添加了C#7.x语法后,是否有一个版本的;x??(x=MakeX())”;,其中x是通过out参数指定的?,c#,syntax,expression,out,c#-7.0,C#,Syntax,Expression,Out,C# 7.0,C#中的一个成语“在第一次访问时创建值”1是使用如下2: 如果有一个细微的变化,MakeX被定义为void MakeX(out string x)而不是“标准的”string MakeX(),那么有没有办法利用C#[7]语法快捷键 (重写代码的方法有一百万种3;问题主要在于,是否有新的技巧允许在表达式中使用“out语句”。) 以下方法不起作用(可能比这更糟1..),但要点如下: public string X { get { return _x ?? { MakeX(out
MakeX
被定义为void MakeX(out string x)
而不是“标准的”string MakeX()
,那么有没有办法利用C#[7]语法快捷键
(重写代码的方法有一百万种3;问题主要在于,是否有新的技巧允许在表达式中使用“out语句”。)
以下方法不起作用(可能比这更糟1..),但要点如下:
public string X {
get {
return _x ?? { MakeX(out _x); _x };
}
}
语义长格式(有效..)类似于:
public string X {
get {
var x = _x;
if (x != null) return x;
MakeX(out x);
return (_x = x);
}
}
1假设只要返回值,线程安全性就不相关。没有关于懒惰的建议
:}
2原始样式get
没有问题
3这个问题特别是关于新语法,而不是对lambdas做“过于聪明的把戏”。因此,
return\ux??(()=>{MakeX(out x);return x;})()代码>仍然会导致对问题的回答为“否”。哇,你从这个问题中获得了所有乐趣。很遗憾,答案是“否”。由于MakeX
是一个void
,如果您愿意将MakeX
定义为string MakeX(out string x)
并使其始终返回null
,那么您可以编写以下代码:return\u x??MakeX(out_x)_x代码>。请注意,这很令人困惑,而且您无法真正打败惯用的return\ux??(x=MakeX())
@lucastrezesniewski在这种情况下,它可以写成return\ux??MakeX(out ux)代码>使用。我希望/发现更多的'out'-作为表达式支持:}
public string X {
get {
var x = _x;
if (x != null) return x;
MakeX(out x);
return (_x = x);
}
}