在多个类上构建字符串的最佳方法是什么
本文关键字:最佳 方法 是什么 字符串 构建 | 更新日期: 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初始化,或者根据您的需要可能更丰富的内容),边构建边构建。