【问题标题】:C# - check if List<> is initializedC# - 检查 List<> 是否已初始化
【发布时间】:2019-01-25 04:48:55
【问题描述】:

我有接受out List&lt;int&gt; list 作为参数的函数。如何检查list 是否已初始化?

这段代码给了我Use of unassigned out parameter 'list' 错误:

public void CheckList(out List<int> list)
    {
        if (list == null) {
            list = List<int>();
        }
    //Rest of the code
    }

我检查过的事实:

  • 作为输出参数传递的变量不必在传递到方法调用之前进行初始化。但是,被调用的方法是 需要在方法返回之前赋值。 out parameter modifier

编辑: 我希望我的方法能够接受这两个选项:使用 elemtns 列出并向其附加附加元素,或者在其他情况下初始化列表并向其添加元素。

【问题讨论】:

  • 所以你的报价中已经有了答案......你可能想改用ref
  • 我没有。我想把这个决定留给来电者。如果输入未初始化,则此方法将初始化 List 并向其添加变量,否则,它只会将新变量附加到已存在的列表中。
  • 你不能。而 null 并不意味着没有初始化。它被初始化为空。如果你想检查 null 然后使用 ref - 它会强制函数的用户传递一个初始化的变量。然后你可以检查它是否初始化为null,如果初始化为空列表。
  • 另外,将初始化变量传递给 out 参数也没有任何意义。不能像刚才看到的那样在函数内部使用它
  • 我会在一个函数中初始化它。然后在函数退出时对其进行初始化。看起来唯一的选择是强制调用者输入一个初始化的数组并使用ref

标签: c# list initialization out


【解决方案1】:

如果您正在处理 out 参数,那么它肯定没有被初始化,因为方法应该初始化它。 如果它是由“ref”传递的,那么你会检查它。

【讨论】:

  • 如果事先不知道list 的状态,或者方法想同时接受这两个选项怎么办?因为您不能定义仅在 refout 上不同的重载方法。
  • 要么是 ref,要么是 out。使用前者,您可以传递一个实例,而另一个只能返回一个实例。也许如果你只返回,你可以考虑使用 return 参数。
  • 我想用out,传递一个实例。同时我希望该方法能够接受已初始化的未初始化列表。
  • 然后使用 ref 代替。
【解决方案2】:

为什么不使用包装器?

public void CheckListWrapper(ref List<int> list)
{
    if(list == null)
    { 
        CheckList(out list);
    }
    else
    {
        //append whatever
    }
}

public void CheckList(out List<int> list)
{
     list = List<int>();       
    //Rest of the code
}

【讨论】:

    【解决方案3】:

    我为sameList 添加了一个新参数,它对你有用 这个如何。没有初始化就无法接受。

    private static void Main()
        {
            List<int> i=null;
            CheckList(out i,i);
            Console.WriteLine(i[0]);
        }
        public static void CheckList(out List<int> list,List<int> sameList)
        {
            list = sameList;
            if(list==null)
            {
                //Intialize
                list = new List<int>();
                list.Add(1);
            }
            else
            {
                //append
                list.Add(12);
            }
            //Rest of the code
        }
    

    【讨论】:

    • List&lt;int&gt; i=null; 在这种情况下 i 是初始化变量。它被初始化为null。我正在寻找某种方法,可以检查变量的状态(初始化/未初始化)
    【解决方案4】:

    试试下面的代码:

    bool IsInitialised(List myList) {
        if ( (myList!= null) && (!myList.Any()) )
         {
             return true;
         }
    return false;
    }
    

    一种无 linq 的方式将是:

    if(myList != null && myList.Count == 0){
      // The list is empty. Add something here
    }
    

    来自您的调用方法,例如 Main: 伪代码。 Testmethod(ref list) 和 TestMethod(list) 具有不同的签名,因此它们都可以编译。

    if(IsInitialised(list))
     Call TestMethod(ref list);
    Else call TestMethod(list);
    

    【讨论】:

    • 它给了我Use of unassigned out parameter 'myList'
    • 编辑了代码。请参见。如果被否决,将很高兴获得积极的反馈
    • 这可行,但您需要两种方法。问题的意图是,是否可以选择确定list 参数的状态(已初始化/未初始化)。我没有对你的回答投反对票。
    • ref 和 out 没有方法重载。它们在 IL 级别具有相同的签名。您可以使用 list 和 ref list 作为参数查看相同的方法名称
    • 我已经编辑了答案。这是你能得到的最接近的地方
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 2011-10-12
    • 2015-05-23
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多