【问题标题】:How to use a c# extension method to add to list as well as create the list如何使用 c# 扩展方法添加到列表以及创建列表
【发布时间】:2015-10-13 21:37:10
【问题描述】:

当我使用下面的方法时,当这个列表为空时,会创建列表并添加一条记录,但在方法之外列表仍然为空。

但是,如果列表已经创建,那么我会看到列表在方法之外增长。

    public static void Add(this List<Setting> Settings, object Name, object Value)
    {
        if(null==Settings)
        {
            Settings = new List<Setting>();
        }

        var item = Settings.FirstOrDefault(s => s.Name.ToLower() == Name.ToString().ToLower());
        if (null != item)
        {
            //overwrite the value of an existing item
            item.Value = Value.ToString();
        }
        else
        {
            //Add the new Setting to the list
            Settings.Add(new Setting(Name.ToString(), Value.ToString()));
        }
    }

【问题讨论】:

  • 这对我来说似乎是一种反模式。来自msdn.microsoft.com/en-us/library/bb383977.aspx:“一般来说,我们建议您谨慎地实现扩展方法,并且仅在必要时实现。只要有可能,必须扩展现有类型的客户端代码应该通过创建从现有类型派生的新类型来实现。对于更多信息,请参阅继承(C# 编程指南)。”
  • 真正让我印象深刻的是,它是一个试图重新分配自身的对象的扩展方法。如果您的代码试图将 this 设置为其他值,这不是一件好事。
  • 让这个方法抛出一个空引用对我来说更直观,因为添加一些东西没有意义。
  • 我其实同意第一条评论我认为我没有展示的类中的List字段应该换成一个继承List功能或者封装List的新类.
  • 另一种简单的看待方式:Settings 不是ref 参数。 (因此,这个问题不针对扩展方法,只是在扩展方法中,不能将this参数设为ref参数。)

标签: c# list extension-methods


【解决方案1】:

扩展方法不是这里的方法。重新分配对象引用绝不应该是对象本身的职责。这应该是对象的调用者/消费者的责任。

【讨论】:

    【解决方案2】:

    这是在 C# 中将参数传递给方法的方式。 Settings 是您调用扩展方法的引用的副本。它指向同一个对象,但它是不同的引用。因此,如果您为其分配新值,则外部引用保持不变。

    您可以考虑将返回类型从 void 更改为 List&lt;Settings&gt;

    那么你可以使用:

    settings = settings.Add(name, value);
    

    额外的好处是能够链接Add

    settings = settings.Add(name1, value1)
                       .Add(name2, value2)
                       .Add(name3, value3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 2021-12-15
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多