Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个类上构建字符串的最佳方法是什么_C#_.net - Fatal编程技术网

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

C# 在多个类上构建字符串的最佳方法是什么,c#,.net,C#,.net,我的情况是,我需要在整个过程中构建一条消息。在此过程中,有多个函数和类用于此消息收集信息。构建此消息的最佳方式是什么 例如: public class process{ public StringBuilder message = new StringBuilder(); private void DoStep1 { AddNote("start"); var p2 = new process2(); p2.DoStuff();

我的情况是,我需要在整个过程中构建一条消息。在此过程中,有多个函数和类用于此消息收集信息。构建此消息的最佳方式是什么

例如:

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
,如果为空,则可能引发异常

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
传递给其他类中的所有这些方法

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
,如果为空,则可能引发异常

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。显然,这不是必需的,但它肯定会保持您的代码更干净,并允许它在需要时增长和收缩


签出可以作为静态方法中的静态
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"
}

如果类中有一个或只有一个静态变量,则该变量可以在静态类中。

可以在静态方法中作为静态
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工作流基础(除非你的方案复杂),否则它可能是多余的,在任务并行库中也有利于流水线——但是简单的对象也可以做到这一点,不要过度设计它。p>
您希望通过管道传递某种上下文(如其他人提到的初始化StringBuilding,或者根据您的需要更丰富的内容)。您所描述的基本上是一个工作流。通常,您可以使用实现或更一般地使用。让管道中的每个元素实现相同的接口,其中包括设置管道中的下一个元素并调用管道中的下一个元素的功能

考虑一下是否可以一次性设置管道并持续重复使用它。这是使用这种方法通常要做的事情

net提供Windows工作流基础(除非你的方案复杂),否则它可能是多余的,在任务并行库中也有利于流水线——但是简单的对象也可以做到这一点,不要过度设计它。p>
您希望通过管道传递某种类型的上下文(如其他人提到的初始化StringBuilding-或者您需要的更丰富的内容)。在单独的类中实例化时,它会失去它的值吗?@ironman99您可以从现有消息中恢复它,但你不需要这么多实例。@LarsTech你什么意思,请解释。@LarsTech当然。将
消息
位放在错误的括号中。。。非常抱歉!在单独的类中实例化时,它会失去它的值吗?@ironman99您可以从现有消息中恢复它,但您不需要这么多实例。@LarsTech您的意思是什么,请解释一下。@LarsTech当然可以。将
消息
位放在错误的括号中。。。非常抱歉@ConradFrix,我感觉到了幽默:)他可以很容易地使用StringBuilder,但正如我所说的,如果他坚持这个模式,他可以让它遵循相同的上下文,如果他需要的话,可以做更多的事情。就从以前的经验来看…@ConradFrix,我感觉到了幽默:)他可以很容易地使用StringBuilder,但正如我所说的,如果他坚持这个模式,他可以让它遵循相同的上下文,并在需要时做更多的事情。从以前的经验来看。。。