Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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_Multithreading_Static_Extension Methods - Fatal编程技术网

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

C# 如何编写正确的静态方法-多线程安全,c#,.net,multithreading,static,extension-methods,C#,.net,Multithreading,Static,Extension Methods,我假设静态方法不应该像第一个代码片段那样编写,还是我错了 public static class ExtensionClass { private static SomeClass object1; private static StringBuilder sb; private static string DoSomething() { sb.AppendLine(object1.SomeValue); } public static string ExtensionM

我假设静态方法不应该像第一个代码片段那样编写,还是我错了

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();
 }
}
所以我提出了这个:

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();
  }
}


最后一个代码段多线程安全吗?这应该是一个扩展方法,所以它不能是非静态的。或者有没有更好的方法在静态方法中传递非静态对象?

第二个代码段与传递到其中的对象一样安全。如果在ExtensionMethod运行时,其他一些方法破坏了HtmlHelper或SomeClass,那么您可能会遇到问题。但是ExtensionMethod有自己的StringBuilder(与您的第一个代码段不同),因此对ExtensionMethod的多次调用将得到不同的StringBuilder,并且在这方面一切都会很好


静态方法不应该像第一个代码片段那样编写,这是正确的。正如您所意识到的,如果线程A调用ExtensionMethod,线程B调用ExtensionMethod,而线程A仍在其中,则
sb
成员将被更改为引用新的StringBuilder。到目前为止,A所做的所有工作都将丢失,此后A和B将附加到同一个StringBuilder,并产生不希望的结果

样式点:因为DoSomething不需要替换StringBuilder,所以您不需要(也不想要)ref修饰符。我认为static不能保证线程安全。两个不同的线程仍然可以调用相同的静态方法,它可以在中间睡着,切换到下一个线程,并有不良的副作用。在为线程安全编写代码时,您必须有点偏执。我在任何地方都看不到锁关键字。lpthnc:他的第一个代码段是这样的,但是在他的第二个代码段中,静态类没有状态,因此没有任何东西需要锁定(当然,除非HtmlHelper和SomeClass需要锁定)。谢谢,真的。但这是可以改变的;)