說你有一個像這樣爲什麼增加運營商可能對性能,同時裁判是不是
public class Foo
{
public int Bar { get; set; } = 42;
}
一類。如果你試圖將財產傳給作爲ref
參數編譯器會發出錯誤
CS0206屬性或分度器可能不作爲輸出或參考 參數
這是可以理解的,因爲在普拉克在上面的例子中將屬性編號爲get_Bar()
和set_Bar()
方法。但是,如果您在屬性上使用增量運算符,如
var foo = new Foo();
foo.Bar++;
它按預期工作。爲了實現這一目標,編譯器需要產生這樣的僞代碼:
var foo = new Foo();
int tmp = foo.get_Bar();
tmp++;
foo.set_Bar(tmp);
所以理論上編譯器可以做類似的事情ref
,如:
var foo = new Foo();
int tmp = foo.get_Bar();
DoSomething(ref tmp);
foo.set_Bar(tmp);
是否有技術原因編譯器不這麼做,或者這只是C#團隊的設計決定?
這實際上是在VB.NET編譯器做出這樣的代碼編譯什麼。它是那種被認爲是*友善*的語言,C#本意是*純*。如果純度與隱藏可能很昂貴的setter調用不兼容,在錯誤的地方生成異常,可能會產生難以診斷的編譯錯誤或導致別名問題。 ++運算符不是非常純粹的,並且以不止一種方式避開規則。例如,您可以增加一個*字節*而不用強制轉換。他們決定讓它*實用*。選擇。 –
可能的重複:http://stackoverflow.com/questions/1402803/passing-properties-by-reference-in-c-sharp – Abion47
@HansPassant我會接受它,如果你可以詳細說明你的意見到一個答案 –