如何编写正确的静态方法 – 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(); } } 

所以我想出了这个:

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

}

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

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

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