2012-09-11 51 views
2

可能重複:
Are reads and writes to properties atomic in C#?.net中的setter原子嗎?

是自動生成的制定者在.NET 4原子?

Public property Busy As boolean 
+1

你是什麼意思與「原子」?任務可以發生或不發生。中間沒有任何東西。 –

+2

@DanielHilgarth:有些任務是原子的,有些則不是。例如,分配一個「十進制」不是原子的,僅僅是因爲數據(128位)大於數據總線(32/64位)。 – Guffa

+0

@Guffa:那麼我最終可能會得到一個十進制數,其中有一些來自賦值前的值,還有一些來自我想賦值的位?意思是我會有一個小數點,表示的值不是舊的而不是新的值? –

回答

2

他們不能保證。

考慮的是,上述編譯成與背襯字段的完整形式屬性。不同的線程可能會進入setter調用和後臺字段的實際分配之間。

此外,並非所有類型都可以原子分配 - 大值類型(DateTimeTimeSpan等)對於原子分配而言太大。

1

不是。setter是一種特殊語法的方法。自動屬性是具有自動生成的獲取器和設置器的屬性。編譯器生成一個由getter方法檢索並由setter方法分配的基礎字段。

例如,

public bool Property { get; set; } 

實際上被編譯成這樣的:

private bool underlyingField; 

public bool Property { 
    get { 
     return underlyingField; 
    } 
    set { 
     underlyingField = value; 
    } 
} 

中的字段可被認爲是一個原子單元,和寫入字段是一個原子操作。

+0

評論爲什麼這是downvoted? – smartcaveman

1

是的,一個屬性賦值是原子的,如果該類型本身的分配是原子。

設置器的方法,因此分配被包裹在一個方法調用(如果它不是內聯),但實際的作業,它是原子。