在C#7中,我们可以实现Deconstruct方法,当将对象分配给具有匹配类型的元组时将调用该方法。

我想知道为什么Microsoft决定将其实现为“魔术方法”。有一个特别命名的方法,该方法不会从任何地方继承,如果正确命名并放置正确的参数,则可以将此对象分配给相应的元组。

我可以想象,设计团队将为此目的创建一个接口(interface)。

就像是:

public interface IDecontructible<T1>
{
    void Deconstruct(out T1 a);
}

public interface IDecontructible<T1, T2>
{
    void Deconstruct(out T1 a, out T2 b);
}

public interface IDecontructible<T1, ... ,Tn>
{
    void Deconstruct(out T1 a, ... ,out Tn n);
}

当然,必须有更多具有不同数量参数的接口(interface)。

我缺少这种设计选择的明显理由吗?

最佳答案

因为使用Deconstruct可以实现,所以您可以重载它,并且它可以应用于任何对象。如果它是一个接口(interface),那么团队将不得不返回并将其应用于他们希望具有该功能的每种类型,并且他们将需要为每个方法签名使用不同的类型,这是不可行的。例如。

class Employee {
   public string FirstName {get;set;}
   public string Id {get;set;}

   Deconstruct (out string firstName){
    firstName = FirstName;
   }

   Deconstruct (out string firstName, out string LastName){
    firstName = FirstName;
    lastName = LastName;
   }

   Deconstruct (out int id){
    id = EmployeId;
   }
}

使用当前的实现,您可以拥有三个版本的Deconstruct。另外,您可以将Deconstruct方法用作扩展方法。使用单个接口(interface)实现将无法实现这些模式。

10-08 02:16