是否在C#中对属性进行读写?

在C#中读取和写入某些基本类型(如boolint是primefaces的。

(参见C#语言规范第5.5节“5.5变量引用的primefaces性”)

但是如何通过属性访问这些变量呢? 假设它们也是primefaces和线程安全的是否合理? 例如, MyProperty读取primefaces和线程安全吗?:

 public bool MyProperty { get { return _foo; } } 

那么自动实现的属性呢?

 public bool MyProperty { get; } 

您需要更密切地区分“primefaces”和“线程安全”。 正如您所说,写入对于大多数内置值类型和引用都是primefaces的。

但是,这并不意味着它们是线程安全的。 它只是意味着如果写入值“A”和“B”,线程将永远不会看到它们之间的某些东西。 (例如,从1到4的变化永远不会显示5或2,或者除1或4之外的任何值。)这并不意味着一个线程一旦被写入变量就会看到值“B”。 为此,您需要根据波动率来查看内存模型。 在没有通常通过锁定和/或易失性变量获得的存储器障碍的情况下,可以延迟对主存储器的写入并且可以提前读取,实际上假设自上次读取以来该值没有改变。

如果你有一个计数器并且你问它的最新值但由于缺乏内存障碍而从未收到最新值,我认为即使每个操作都可能是primefaces的,你也不能合理地称之为线程安全。

这与属性无关 – 但是 – 属性只是围绕它们的语法糖的方法。 它们不会对线程提供额外的保证。 .NET 2.0内存模型确实比ECMA模型有更多的保证,并且它可以保证方法进入和退出。 这些保证也应该适用于属性,虽然我对这些规则的解释感到紧张:有时可能很难推断出内存模型。

关于你在这里问什么,我有点不清楚。 看起来你可能会问两个问题中的一个

  1. 在调用MyPropertyprimefaces时读取_foo
  2. primefaces设置MyProperty的返回值是多少?

对于#1,答案是肯定的。 正如C#语言规范(和CLI)所述,某些指定类型的变量的读写保证是primefaces的。 ‘bool’类型就是其中之一。

至于#2,最好看的地方是CLI规范的第12.6.6节。 它说明了这一点

符合标准的CLI应保证对正确对齐的内存位置的读写访问权限不大于本机字大小(native int类型的大小)是primefaces的

考虑使用MyProperty的返回值,您必须是读取或写入值,可以安全地假设它是primefaces设置的。

primefaces性意味着如果多个线程正在写入变量,则其值不会被破坏(例如,如果它占用两个字节,则永远不会获得线程1的高字节和线程2的低字节)。 这并不意味着变量是线程安全的。 您仍然可以获得一个线程的常见线程问题,而不会看到其他更改等。

对于线程安全,您需要使用锁定(或易失性,但这更难以推理)。 属性没有什么特别之处 – 它们也需要明确地保证线程安全。

如果检查自动生成的代码,您将看到自动生成的属性不是线程安全的 – 它们很容易获取/设置为生成的字段。 实际上,这样做会造成太大的性能损失(特别是在不需要的时候)。

此外,如果您计划从多个线程访问int / bool值,那么您应该将它(字段)标记为volatile 。 这基本上可以防止与CPU寄存器相关的multithreading问题。 (这是锁定的补充 ,而不是替代)

我想不会。 属性基本上只是在它们上面带有一点语法糖的方法,以使它们更容易使用。 因此,默认情况下,它们不比普通方法调用更具线程安全性(也就是说,根本不是线程安全的)。

你可以在房产中放置任何东西,例如

  Public Property foo() As Boolean Get goToLunch() barbecueRibs() return m_foo End Get Set(ByVal value As Boolean) takeANap() accessDatabase() messUpOtherVariables() m_foo = value End Set End Property