修改/过滤而不改变对象

时间:2021-06-21 11:51:20

标签: c# functional-programming

好的,假设我有一些 C# 代码可以过滤或重组传入的对象(或对象列表),如下所示:

public Customer GetCustomer()
{
    var customer = _customerAdapter.GetCustomer();
    ModifyCustomer(customer);
    return customer;
}

private void ModifyCustomer(Customer c)
{
   //some changes to customer object
}

这行得通,但我更喜欢更实用的方法,即保留新来的客户并返回一个新的(修改过的)。

深度克隆是要走的路吗?在 C# 中编码时是否推荐使用?

2 个答案:

答案 0 :(得分:1)

最接近的内置功能可能是 recordswith 表达式:

public record Person(string FirstName, string LastName)
{
    public string[] PhoneNumbers { get; init; }
}

Person person1 = new("Nancy", "Davolio") { PhoneNumbers = new string[1] };
Person person2 = person1 with { FirstName = "John" };

答案 1 :(得分:0)

如果您不能使用 C# 9,那么您可以执行以下操作:

public class Consumer
{
   public readonly string FirstName;
   public readonly string LastName;

   public Consumer(string firstName, string lastName)
   {
       this.FirstName = firstName;
       this.LastName = lastName;
   }

   public Consumer WithFirstName(string firstName)
     => string.Equals(this.FirstName, firstName) 
              ? this 
              : new Consumer(firstName, this.LastName);

   public Consumer WithLastName(string lastName)
     => string.Equals(this.LastName, lastName)
              ? this
              : new Consumer(this.FirstName, lastName);
   }
}

Related dotnet blogpost

相关问题