[英]Why built-in types in C# are language keywords?
在C#中,諸如int
或string
類的標識符實際上是語言級關鍵字。
這是什么原因?
請注意,如果作者想要禁止具有這些名稱的用戶類型,則可能會產生語義錯誤,而不是語法錯誤。
基於答案的一些澄清:
它們是關鍵字,因為它使解析成為可能/更容易
我不明白為什么,因為我正在開發一個解析器,並且Type.Rule = Identifier
比Type.Rule = Identifier | "int" | "string" | ...
簡單得多Type.Rule = Identifier | "int" | "string" | ...
Type.Rule = Identifier | "int" | "string" | ...
Type.Rule = Identifier | "int" | "string" | ...
它們是關鍵字,因為它們是特殊的別名
var
和dynamic
也是特殊的東西,但不是關鍵字(出於兼容性原因,它表明作為關鍵字不必是特殊的)。 在另一個示例中,將[Serializable]
應用於類型會生成魔術IL元數據修飾符可serializable
而不是標准自定義屬性。 但它仍然不是關鍵字。
它們是關鍵字,因為它們是其他語言的關鍵字
很好的答案,但是,為什么他們的關鍵字在其他語言? 此外,當然可以用藍色突出顯示它們而不是關鍵字,那么為什么要從其他語言中引入它?
據我所知,C#設計者希望允許典型的類型名稱,就像它們在C風格的語言中一樣,即string
, int
等。 同時,這些類型中的每一個都必須具有完全限定的類型名稱,例如System.String
和System.Int32
。 因此,決定為這些常用類型提供別名。
如果我再次找到此聲明的來源,我將添加鏈接。
在其他基於CLI的語言中,相同的完全限定類型標識符有效。 但是,類型名稱(如int
或string
在這些語言中可能不常見,因此可能會在那里提供其他別名。
使用類型別名的一個可能的優點可能是提高可讀性,這就是為什么有一個StyleCop規則強制在常規類型名稱上使用別名。 關於簡潔的觀點也在同一主題的這個主題中提到。
幾乎我學到的語言是:C,C ++,Java,Pascal,C#。 我不太確定,但根據我在大學學習的Compiler Design
課程(在本課程中,我們將學習人們如何編寫編譯器,一步一步地實現自己的編譯器),你問題的主要原因是:更方便的詞匯分析短語
當你編碼時,所有代碼都只是一個簡單的字符串。 和Compiler在編譯之前必須做很多短語。
例如,當您鍵入:
int a = 5;
第一個短語是Lexical Analysis必須給出如下的字典並發送給Parser pharse :
int ---> identifiers
a ---> Variable
= ---> Operator(=)
5 ---> Integer
; ---> ;
Lexical Analysis
如何知道這一點:首先,它將構建一個字典表並搜索您輸入的字符串。 當第一個標記生成器相遇時,它將停止並獲取該標記生成器。 (這一點很重要 ! )
像這樣的字典:
if ---> if
then ---> then
int ---> int
.... // all keywords here
[a-z][a-z0-9_]* ---> variable // example of regular expression : I don't sure it's true, just something like this :D
因此,如果語言允許您將int命名為變量。 如 :
int int = 5;
上面的lexical analysis
方法被打破了 ,當它讀取第二個int
,它不知道它是變量或關鍵字,並且必須有更復雜的步驟來確定它。
我不是說它不能,但它在編譯時更復雜,更慢,並且不需要。 對程序員說簡單:“嘿,不要那么做,或者,我不會編譯你的程序:))”
希望這有用:)
這是因為在C#語言中構建的int
和其他特殊值類型根本不是真正的類型,而是.NET Framework系統類型的別名 。
這是語法錯誤而不是語義錯誤的原因僅僅是因為在語法錯誤檢測階段檢測到錯誤,這發生在語義錯誤檢測階段之前。 語法錯誤檢測具有確定int
是用作類型還是其他東西所需的所有信息。 假設我們有以下規則:
declaration = type identifier ;
語法階段檢查標識符是否為[aZ]([aZ] + | [0-9] +)+並且不是保留關鍵字或別名,在您描述它的情況下。 因此,將此命名為語法錯誤總是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.