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

时间:2013-12-13 20:00:46

标签: c# .net

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

示例:

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
   }

}

4 个答案:

答案 0 :(得分:6)

您可以将初始化的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
   }

}

答案 1 :(得分:0)

我会用某种形式的构建器模式处理这个问题,这样你至少可以传递一个公共引用,而不仅仅是简单地接受一个StringBuilder。显然这不是必需的,但它会明确地保持您的代码更清洁,并允许它在需要时增长和缩小。

查看Builder Pattern

答案 2 :(得分:0)

您可以在静态方法中使用静态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"
}

如果你在类中只有一个静态变量,那么这可能是一个静态类。

答案 3 :(得分:0)

您所描述的基本上是一个工作流程。您通常可以使用chain of responsibility实施或更常见的pipeline实施此设置。让管道的每个元素实现相同的接口,包括在管道中设置下一个元素并调用管道中的下一个元素的能力。

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

.NET提供Windows Workflow Foundation(除非你的场景很复杂,否则它可能有点过分),任务并行库中的Dataflow也适用于管道 - 但简单的对象也可以做到这一点,不要结束 - 工程师!

你正在寻找传递某种上下文(比如其他人提到的初始化StringBuilding - 或者可能是你需要的更丰富的内容),然后将它构建起来。

相关问题