在多个类上构建字符串的最佳方法是什么

本文关键字:最佳 方法 是什么 字符串 构建 | 更新日期: 2024-09-19 12:35:53

我有一种情况,需要在整个过程中构建一条消息。在这个过程中,有几个函数和类必须在其中收集信息。构建此消息的最佳方式是什么?

示例:

public class process{
   public StringBuilder message = new StringBuilder();
   private void DoStep1
   {
      AddNote("start");
      var p2 = new process2();
      p2.DoStuff();
      var p3 = new process3();
      p3.DoStuff();
      SendEmailMethod(message);
   }
   private void AddNote(string msg)
   {
      //do stuff
      message.Append(msg);
   }
}
public class process2{
   public void DoStuff()
   {
      //need to append msg to that variable
   }
}
public class process3{
   public void DoStuff()
   {
      //need to append msg to that variable
   }
}

在多个类上构建字符串的最佳方法是什么

您可以将初始化的StringBuilder传递给其他类中的所有方法。

public class process{
   public StringBuilder message = new StringBuilder();
   private void DoStep1
   {
      AddNote("start");
      var p2 = new process2();
      p2.DoStuff(message);
      var p3 = new process3();
      p3.DoStuff(message);
      SendEmailMethod(message);
   }
   private void AddNote(string msg)
   {
      //do stuff
      message.Append(msg);
   }
}
public class process2{
   public void DoStuff(StringBuilder stringBuilder)
   {
      //need to append msg to that variable - use stringBuilder
   }
}
public class process3{
   public void DoStuff(StringBuilder stringBuilder)
   {
      //need to append msg to that variable - use stringBuilder
   }
}

您应该记录那些类,它们期望一个初始化的StringBuilder,或者如果它为null,可能会抛出一个异常。

public class process3{
   public void DoStuff(StringBuilder stringBuilder)
   {
      if (stringBuilder == null)
          throw new ArgumentException("stringBuilder must be initialised");
      //need to append msg to that variable - use stringBuilder
   }
}

我会用某种形式的构建器模式来处理这个问题,这样你至少可以传递一个公共引用,而不仅仅是接收StringBuilder。显然,这不是必需的,但它会让你的代码更干净,并允许它在需要时增长和收缩。

查看生成器模式

您可以在静态方法中使用静态StringBuilder。说:

public static StringBuilder builder;
static void AddToString(string s)
{
    if(builder == null)
        builder = new StringBuilder(s);
    builder.Append(s);  // new line?: s + "'r'n"
}

如果类中有一个或只有一个静态变量,那么它可能在静态类中。

您所描述的基本上是一个工作流。您通常可以使用责任链实现或更一般地使用管道来设置此功能。让管道中的每个元素实现相同的接口,包括设置管道中的下一个元素和调用管道中的另一个元素的能力。

想想你是否可以设置一次管道并不断重复使用它。这通常是你使用这种方法所要做的。

.NET提供了Windows Workflow Foundation(除非您的场景很复杂,否则它可能会被高估),任务并行库中的数据流也适用于管道,但简单的对象也可以做到这一点,不要过度设计它!

您希望通过管道传递某种上下文(比如其他人提到的StringBuilding初始化,或者根据您的需要可能更丰富的内容),边构建边构建。