这是一个错误还是我解释'??' - 运算符错了?查看下面的获取属性和评论。
我正在使用C#.NET 3.5
private List<MyType> _myTypeList;
private List<MyType> MyTypeList
{
get
{
//The two code lines below should each behave as the three under, but they don't?
//The ones uncommented are working, the commented result in my list always returning empty (newly created I suppose).
//return _myTypeList ?? new List<MyType>();
//return _myTypeList == null ? new List<MyType>() : _myTypeList;
if (_myTypeList == null)
_myTypeList = new List<MyType>();
return _myTypeList;
}
}
编辑:对于那些在新问题时看过这个问题的人,很抱歉,其中有些错误会让所有人感到困惑。
感谢所有伟大而快速的反馈!我现在明白了我犯的错误。的谢谢!
答案 0 :(得分:6)
这一行:
return _myTypeList == null ? new List<MyType>() : _myTypeList;
相当于:
if (_myTypeList == null)
return new List<MyType>();
return _myTypeList;
不要:
if (_myTypeList == null)
_myTypeList = new List<MyType>();
return _myTypeList;
您稍后添加的??
版本难以理解,我不会对其进行分析。我们先让?
正确。
答案 1 :(得分:5)
如果必须使用??
,请使用
_myTypeList = _myTypeList ?? new List<MyType>();
return _myTypeList;
但是一个简单的if也很好
答案 2 :(得分:3)
使用语法
时return _myTypeList == null ? new List<MyType>() : _myTypeList;
如果_myTypeList为null,则返回List()类型的新MyType列表。然而,_myTypeList仍然为null。你没有初始化它。
而在第二种情况下,您实际上初始化_myTypeList然后返回它。
答案 3 :(得分:1)
你要展示的代码,不使用??运算符(合并运算符)。相反,您正在使用三元运算符。
尝试
return _myTypeList ?? ( _myTypeList = new List<MyType>() );
代替。
检查出来:
static void Main( string[] args )
{
var x = GetList ();
if( _theList == null )
{
Console.WriteLine ("_theList is null");
}
else
{
Console.WriteLine ("_theList has been initialized.");
}
Console.ReadLine ();
}
private static List<int> _theList;
public static List<int> GetList()
{
return _theList ?? ( _theList = new List<int> () );
}
上面的代码将输出'_theList已初始化'。
您的评论说明:
//return _myTypeList == null ? new List<MyType>() : _myTypeList;
永远不会像你期望的那样工作,因为你不是(懒惰)在任何地方初始化_myTypeList
_myTypeList == nul
l将始终求值为true,因为_mytypeList永远不会被初始化,因此,您将始终返回一个新的List实例。
答案 4 :(得分:1)
版本A:
return _myTypeList ?? (_myTypeList = new List<MyType>());
版本B:
return _myTypeList == null ? new List<MyType>() : _myTypeList;
版本C:
if (_myTypeList == null)
_myTypeList = new List<MyType>();
return _myTypeList;
A和C应该表现相同。 B不应该 - 它没有将_myTypeList
设置为新列表,它只返回一个。您可以使用在A版中使用的相同语法使其等效:
return _myTypeList == null ? _myTypeList = new List<MyType>() : _myTypeList;
答案 5 :(得分:1)
??
运算符表示:如果左手操作数不是null
,则操作的结果是左手操作数。否则,操作的结果是右手操作数。即:
foo = bar ?? frob
如果foo = bar
,则为bar != null
,否则为foo = frob
。