2010-06-03 57 views
8

可能重複:
「const correctness」 in C#爲什麼C#沒有爲變量和方法設計'const'?

我懷疑const被簡化爲一般的語言簡單的C#規範。是否有一個特定的原因,我們不能像C++那樣將變量引用或方法聲明爲const?例如:

const MyObject o = new MyObject(); // Want const cast referenece of MyObject 
o.SomeMethod(); // Theoretically legal because SomeMethod is const 
o.ChangeStuff(); // Theoretically illegal because ChangeStuff is not const 

class MyObject 
{ 
    public int val = 0; 

    public void SomeMethod() const 
    { 
     // Do stuff, but can't mutate due to const declaration. 
    } 

    public void ChangeStuff() 
    { 
     // Code mutates this instance. Can't call with const reference. 
     val++; 
    } 
} 
+1

你的意思是,除了「因爲C++風格的'const'具有深遠的影響,它真的很難做到(從設計和實現POV),並且沒有運行時支持」。這是一個有用的,但非常昂貴的功能。 FWIW,F#採用相反的方法:*除非聲明爲這樣,否則無*是可變的。不過,與框架的交互可能並不明顯。 – 2010-06-03 17:21:00

+0

我不同意這是一個確切的副本。舊的問題詢問如何在代碼中實現這一點。 @spoulson詢問爲什麼它不在編譯器中。 – 2010-06-03 17:27:01

+1

需要強制執行正確性纔有意義。當任何支持.NET的語言可以使用另一種語言創建的類型時,這變得很困難。可能有近一百個。所有這些語言的語法都需要修改,以適應聲明常量屬性,並調整編譯器來校驗它們。 換句話說,const正確性非常不符合CLS。 – 2010-06-03 17:32:52

回答

0

我懷疑你的問題的第一句回答。

1

一個const執行任何地方使用,並且因此不具有任何運行時意義的值的編譯時間替換。一般來說,你爲const對象提出的建議對編譯器來說很難確定(如果一個方法會修改對象)。您提出的使用const關鍵字作爲訪問修飾符的建議也會給編寫者帶來負擔,並且您仍然存在驗證某些內容是否會修改對象的問題。同樣,你在這個對象上施加了一些東西,在所有情況下都沒有意義。如果方法是const,但是你沒有將它用作const對象,這意味着什麼?你想要的功能通常是通過實現一個接口來完成的,並且只暴露類的「只讀」部分。

相關問題