【问题标题】:C#-How to use empty List<string> as optional parameterC#-如何使用空 List<string> 作为可选参数
【发布时间】:2011-08-04 19:30:48
【问题描述】:

有人可以举个例子吗?

我尝试过null,string.Empty 和对象初始化,但它们不起作用,因为默认值必须在编译时保持不变

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    只需使用 null 合并运算符和空 List&lt;string&gt; 的实例

    public void Process(string param1, List<string> param2 = null) 
    {
        param2 = param2 ?? new List<string>();
    
        // or starting with C# 8
        param2 ??= new List<string>();
    }
    

    这样做的问题是,如果“param2”为空并且您分配了一个新引用,那么它将无法在调用上下文中访问。

    【讨论】:

    • 是的,我得到了限制,但在这种情况下这对我来说效果很好。
    【解决方案2】:

    您还可以使用default 执行以下操作,这是一个编译时间常数(nullList&lt;T&gt; 的情况下):

    void DoSomething(List<string> lst = default(List<string>)) 
    {
        if (lst == default(List<string>)) lst = new List<string>();
    }
    

    【讨论】:

    • IntelliSense 向我展示了该语句可以进一步简化,只需使用“default”而不是“default(List”)。
    【解决方案3】:

    这是不可能的。您应该改用方法重载。

    public static void MyMethod(int x, List<string> y) { }
    public static void MyMethod(int x)
    {
        MyMethod(x, Enumerable<string>.Empty());
    }
    

    【讨论】:

    • 不可能有一个非编译时间常数,例如一个空列表,作为默认值。我知道你可以在 C# 中为参数使用默认值,显然......
    • 但是,这将是唯一的解决方案或任何使用 4.0 之前的 C# 版本的人。
    【解决方案4】:
        private void test(List<string> optional = null)
        {
    
        }
    

    对不起字符串而不是列表。 Null 在 4.0 上对我来说很好用,我正在使用 Visual Studio 2010

    【讨论】:

    • 那是string,不是List&lt;string&gt;
    • 它可以编译,但是在运行时你会得到对象实例化异常
    • 我没有得到那个例外,请确保在提出索赔之前测试您的答案。
    • 对我来说很好,但如果您有多个参数,则需要放在最后
    【解决方案5】:

    我喜欢这种方式,比??=更具可读性

    if (param == null) param = new();
    

    【讨论】:

      【解决方案6】:
      private void test(params object[] params)
      {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多