C# 向不可变类型添加信息的公认模式是什么?

C# 向不可变类型添加信息的公认模式是什么?,c#,tuples,immutability,C#,Tuples,Immutability,我正在编写一些代码,这些代码可以在集合上工作,并向集合中添加更多信息。它以A开头,然后添加一些更多的信息,比如它计算A的“到期日”,并返回该值。 然后,我根据当前用户计算允许的权限,以及A和B,-并添加这个,称之为C 我开始使用元组,但到了(E)时,类型定义很难理解 使用元组: IEnumerable<A> CreateA(); IEnumerable<Tuple<A,B>> AddB(IEnumerable<A>); IEnume

我正在编写一些代码,这些代码可以在集合上工作,并向集合中添加更多信息。它以A开头,然后添加一些更多的信息,比如它计算A的“到期日”,并返回该值。 然后,我根据当前用户计算允许的权限,以及A和B,-并添加这个,称之为C

我开始使用元组,但到了(E)时,类型定义很难理解

  • 使用元组:

     IEnumerable<A> CreateA();   
     IEnumerable<Tuple<A,B>> AddB(IEnumerable<A>);  
     IEnumerable<Tuple<A,B,C>> AddC(IEnumerable<A,B>);  
     etc..
    
    IEnumerable CreateA();
    IEnumerable AddB(IEnumerable);
    IEnumerable AddC(IEnumerable);
    等
    
  • 我正在考虑两个选项,创建表示元组的类型(下面的选项2),这意味着在编译时不执行A和B就不能创建C,或者使用带有运行时检查的可变对象(下面的选项3)

  • 用不同的类型替换管状体

     class AB { ctor(A, B), A A{get;}, B B{get;} }  
     class ABC { ctor(A, B, C), A A{get;}, B B{get;}, C C{get;} }  
    
     IEnumerable<A> CreateA();  
     IEnumerable<AB> AddB(IEnumerable <A>)  
     IEnumerable<ABC> AddC(IEnumerable <AB>)  
     etc..
    
    类AB{ctor(A,B),A A{get;},B{get;}
    类ABC{ctor(A,B,C),A{get;},B{get;},C{get;}
    IEnumerable CreateA();
    IEnumerable地址(IEnumerable)
    IEnumerable AddC(IEnumerable)
    等
    
  • 具有可变类型(带有一些运行时检查,例如B为null,然后抛出…)

    类ABC{ctor(A),A{get;},B{get;set;},C{get;set;}
    IEnumerable CreateA();
    IEnumerable AddB(IEnumerable)//B组
    IEnumerable AddC(IEnumerable)//如果B为空抛出,则设置C
    
  • 选项2看起来有点陌生,创建和命名类型几乎和选项a一样麻烦。我感觉自己有点偏离了常规。
    我认为更多的程序员会理解选项3


    选项2是否有一个标准化的命名策略,或者我是否应该放弃它,选择选项3。

    您打算做多少不同的信息?如果不是很多,那么选项2与fluent builder模式相结合就更好了。有6条信息,我将试用builder,看看它的外观。
     class ABC { ctor(A), A A{get;}, B B{get;set;}, C C{get;set;} }
    
     IEnumerable<ABC>  CreateA();  
     IEnumerable<ABC>  AddB(IEnumerable<ABC>); //Sets B  
     IEnumerable<ABC>  AddC(IEnumerable<ABC>); //If B is null throw, set C