-1

这是一个错误还是我解释'??'-操作员错了?查看下面的 get 属性和评论。

我正在使用 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;
        }
    }

编辑:对于刚问到这个问题时看到这个问题的每个人,很抱歉,其中的一些错误让每个人都感到困惑。

感谢所有伟大而快速的反馈!我现在已经理解我犯的错误了。谢谢!

4

6 回答 6

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;

您稍后添加的带有 的版本??太难读了,我不会对其进行分析。让我们先做?对。

于 2012-01-10T16:16:37.133 回答
5

如果你必须??使用它像

_myTypeList = _myTypeList ??  new List<MyType>();
return  _myTypeList;

但是一个简单的 if 也可以

于 2012-01-10T16:17:48.150 回答
3

当你使用语法

return _myTypeList == null ? new List<MyType>() : _myTypeList;

如果 _myTypeList 为空,则返回 List() 类型的新 MyType 列表。但是 _myTypeList 仍然为空。你不初始化它。

而在第二种情况下,您实际上是初始化 _myTypeList 然后返回它。

于 2012-01-10T16:19:08.023 回答
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 == null 将始终评估为 true,因为 _mytypeList 从未初始化,因此,您将始终返回一个新的 List 实例。

于 2012-01-10T16:16:29.530 回答
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; 
于 2012-01-10T16:17:43.673 回答
1

运算符的??意思是:如果左边的操作数不是null,则运算的结果是左边的操作数。否则,操作的结果是右手操作数。IE:

foo = bar ?? frob

那么foo = bar如果bar != null,否则,foo = frob

于 2012-01-10T16:21:28.127 回答