因为我认为静态方法不应该像第一个片段那样编写,还是我错了?
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,从而产生不良结果!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)