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需要锁定)。谢谢,真的。但这是可以改变的;)