如何编写正确的静态方法 - 多线程安全

use*_*348 3 .net c# extension-methods static multithreading

我假设静态方法不应该像第一个片段那样写,否则我错了?

public static class ExtensionClass
{
 private static SomeClass object1;
 private static StringBuilder sb;

 private static string DoSomething()
 {
    sb.AppendLine(object1.SomeValue);
 }

 public static string ExtensionMethod(this HtmlHelper helper, SomeClass _object1)
 {
    object1 = _object1;
    sb = new StringBuilder();

    DoSomething();

    return sb.ToString();
 }
}
Run Code Online (Sandbox Code Playgroud)

所以我想出了这个:

public static class ExtensionClass
{
  private static string DoSomething(ref StringBuilder _sb,SomeClass object1)
  {
    _sb.AppendLine(object1.SomeValue);
  }

  public static string ExtensionMethod(this HtmlHelper helper, SomeClass _object1)
  {
    SomeClass object1 = _object1;
    StringBuilder sb = new StringBuilder();

    DoSomething(ref sb,_object1);

    return sb.ToString();
  }
Run Code Online (Sandbox Code Playgroud)

}

最后一段多线程安全吗?这应该是一种扩展方法,因此它不能是非静态的.或者有更好的方法在静态方法中传递非静态对象吗?

ito*_*son 8

第二个片段与您传入其中的对象一样多线程安全.如果在ExtensionMethod运行时某些其他方法使用HtmlHelper或SomeClass,那么您可能遇到问题.但是ExtensionMethod获得了自己的StringBuilder(与你的第一个代码片段不同),因此对ExtensionMethod的多次调用将获得不同的StringBuilder,并且所有人都将在这方面做得很好.

你是正确的,不应该像第一个片段那样编写静态方法.正如您所知,如果线程A调用ExtensionMethod,并且线程B调用ExtensionMethod而线程A仍在那里,则该sb成员将被更改为引用新的StringBuilder.A到目前为止所做的所有工作都将丢失,A和B此后将附加到同一个StringBuilder,结果不理想!