C 特性 唯讀本地變數

2021-09-16 18:18:35 字數 1358 閱讀 1834

就在不久之前,唯讀本地變數提案被重新提上了議程。這一功能相對唯讀引用提案來說更加溫和,並與之形成了互補。

\u0026#xd;\n\u0026#xd;\n

設定唯讀本地變數的基本語法並不複雜,只需在型別前新增readonly關鍵字即可。這和字段上的readonly用法並無二致。你也可以為引數新增readonly關鍵字。

\u0026#xd;\n\u0026#xd;\n

你可以便捷地使用let來替代readonly var。關鍵字let的選取有以下幾點原因:

\u0026#xd;\n\u0026#xd;\n

人們在閱讀**時看到這一基本用法就會明白本地變數一旦設定之後就不能再更改了。

\u0026#xd;\n\u0026#xd;\n

該提案指出,在採用匿名或者非同步函式時,利用上述特性有助於編寫防禦式**。一種常見的錯誤是在本地變數之上建立乙個閉包,然後將其傳到另乙個執行緒中去。這會導致難以察覺的競爭條件。因為大多數開發者並不認為本地變數也可能會導致競爭條件。通過將變數標識為唯讀,編譯器會阻止閉包對該變數再次賦值。

\u0026#xd;\n\u0026#xd;\n

你無法將唯讀變數以引用或者出參的方式傳入函式中。不過在該提案實施之後,你能以唯讀引用引數的方式來傳遞變數。

\u0026#xd;\n\u0026#xd;\n

警告:如果將結構體宣告為唯讀的本地變數或是引數的話,那麼呼叫其方法時,編譯器會隱式建立乙份拷貝。對於一些諸如整型這樣的小型結構體來說,這不算什麼。但對於大型結構體來說,拷貝的成本不容小覷,可能會帶來問題。詳情請參見唯讀引用提案中的「唯讀結構體」。

\u0026#xd;\n\u0026#xd;\n

懸而未決的設計問題

\u0026#xd;\n\u0026#xd;\n

對於readonly type x是否要像let x那樣需要立即賦值這一點仍有待**。

\u0026#xd;\n\u0026#xd;\n

支援方認為要求在宣告時就進行賦值可以讓人們知道賦值的具體內容。此外,整個提案也會變得更加簡單。

\u0026#xd;\n\u0026#xd;\n

持反方則認為這會影響可讀性。程式設計過程中經常使用的條件表示式會使得**難以閱讀,而且立即賦值也無法在try-catch**塊中使用。

\u0026#xd;\n\u0026#xd;\n

更多資訊

\u0026#xd;\n\u0026#xd;\n

檢視英文原文:c# futures: read-only local variables

\u0026#xd;\n\u0026#xd;\n

感謝冬雨對本文的審校。

\u0026#xd;\n

C 特性 唯讀本地變數

就在不久之前,唯讀本地變數提案被重新提上了議程。這一功能相對唯讀引用提案來說更加溫和,並與之形成了互補。設定唯讀本地變數的基本語法並不複雜,只需在型別前新增readonly關鍵字即可。這和字段上的readonly用法並無二致。你也可以為引數新增readonly關鍵字。你可以便捷地使用let來替代re...

C 特性 唯讀本地變數

就在不久之前,唯讀本地變數提案被重新提上了議程。這一功能相對唯讀引用提案來說更加溫和,並與之形成了互補。設定唯讀本地變數的基本語法並不複雜,只需在型別前新增readonly關鍵字即可。這和字段上的readonly用法並無二致。你也可以為引數新增readonly關鍵字。你可以便捷地使用let來替代re...

C 深度解析 9 const 常量?唯讀變數?

2 小結 看了前面的關於 const 的內容,不知道是不是有疑問,const 什麼時候為唯讀變數,什麼時候是常量?綜上所述,在編譯期間不能直接確定初始值的 const 標示符,都被作為唯讀變數處理。const 引用的型別與初始化變數的型別 9 1.c include intmain 編譯執行 g 9...