C# 泛型类型或对象类型的参数是线程安全的吗? [Webmethod] 公共静态字符串获取(列表输入1,字符串输入2) { Cust cu=Cust.CalAge(输入1,输入2) cu.agemodify=true; }
AJAX调用调用此Web服务C# 泛型类型或对象类型的参数是线程安全的吗? [Webmethod] 公共静态字符串获取(列表输入1,字符串输入2) { Cust cu=Cust.CalAge(输入1,输入2) cu.agemodify=true; },c#,generics,static,thread-safety,webmethod,C#,Generics,Static,Thread Safety,Webmethod,AJAX调用调用此Web服务 CalAge是类Cust中的一个静态方法 agemodify是类Cust中的boolean字段 我知道所有非静态字段/局部变量都有 即使在静态方法中,每个线程在堆栈上也有不同的副本。是 对吗?因此,这些是线程安全的,不是共享资源。 因此,agemodify是线程安全的吗 我的理解是,List作为参数是线程安全的 对于静态方法,因为对于int,不变性不适用。是 对吗?我知道list不是线程安全的。那就 s如果T是不可变的,则作为参数;如果T是不可变的,则作为对象 不变
CalAge
是类Cust
中的一个静态方法
agemodify
是类Cust
中的boolean
字段
List
作为参数是线程安全的
对于静态方法,因为对于int,不变性不适用。是
对吗?我知道list
不是线程安全的。那就
s
如果T是不可变的,则作为参数;如果T是不可变的,则作为对象
不变的e、 g.public static int GenMethod(),
GetMethod(列表o1,对象o2)。
仅对象vs
列表。
我不想使用System.Collections.Concurrent不幸的是,你的问题太宽泛了。你似乎把几个不同的、完全不相关的概念混为一谈,好像它们以某种有意义的方式相互关联,尽管它们不是。我怀疑,在堆栈溢出回答的上下文中,是否有可能解开这里表示的所有误解 也就是说,我会试试看。至少,我希望通过下面的内容,您可以获得足够的信息来回顾主要来源(如MSDN、其他文档)并纠正您的理解。在最好的情况下,也许下面的内容足以让你完全回到正轨
Cust
类型是引用类型,并且CalAge()
方法总是创建该类型的新实例,或者Cust
类型是值类型,那么我会说是的,该字段是线程安全的
否则,不一定
†就此而言,局部变量存储在堆栈上只是一个实现细节。正则局部变量不太可能改变,但C#中没有要求以这种方式处理它们。它们可以存储在任何地方,只要编译器保留局部变量的语义,事实上,这正是在C#中的各种上下文中发生的情况,例如捕获的局部变量,以及在迭代器方法和async
方法等特殊方法中发现的局部变量
List
作为静态方法的参数是线程安全的,因为对于int
不适用不变性。对吗?我知道List
不是线程安全的。如果T是不可变的,那么只将
s作为参数,如果对象是不可变的,那么它们又如何呢?e、 g.public static int GenMethod()
,
GetMethod(列表o1,对象o2)
。只需对象
vs列表
。我不想使用System.Collections.Concurrent
input1
变量是一个局部变量,它的值本质上是线程安全的,因为每次调用该方法都会有一个新的副本。但这只是一个变量。列表
对象本身根本不受此影响,而且肯定不是线程安全的。只有当执行该方法的每个线程都获得List
对象的唯一实例时,您才能说这是线程安全的
至于类型参数T
go的值,泛型并不能使它们本质上是线程安全的。就线程安全而言,T
只是另一种类型。在编译泛型类型或方法时,您不知道类型这一事实与此无关,并且不会以任何方式帮助使该类型的值成为线程安全的
[Webmethod]
Public static string GetAge(List<int> input1, string input2)
{
Cust cu=Cust.CalAge(input1,input2)
cu.agemodify=true;
}