我认为静态方法不应该像第一个片段那样写,否则我错了?
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();
}
}
最后一段多线程是否安全?这应该是一种扩展方法,因此它不能是非静态的。或者是否有更好的方法在静态方法中传递非静态对象?
答案 0 :(得分:8)
第二个片段与您传入其中的对象一样多线程安全。如果在ExtensionMethod运行时某些其他方法使用HtmlHelper或SomeClass,那么您可能遇到问题。但是ExtensionMethod获得了自己的StringBuilder(与你的第一个代码片段不同),因此对ExtensionMethod的多次调用将获得不同的StringBuilders,并且所有这些都将在这方面做得很好。
你是正确的,不应该像第一个片段那样编写静态方法。正如您所知,如果线程A调用ExtensionMethod,并且线程B调用ExtensionMethod而线程A仍在那里,则sb
成员将被更改为引用新的StringBuilder。 A到目前为止所做的所有工作都将丢失,A和B将从此添加到相同的StringBuilder中,并产生不良结果!