Tôi có thể nói var là một loại , hay tôi phải nói var là một từ khóa rằng chỉ thị các trình biên dịch để xác định loại?
Nó phụ thuộc vào cách bạn nhìn vào nó. Nghiêm túc!
Trình biên dịch C# thực hiện ba loại phân tích về chương trình, mỗi phân tích tiếp theo tiêu thụ kết quả của phần trước. Loại phân tích đầu tiên chúng tôi làm là phân tích từ lexical; chúng tôi lấy văn bản và biến nó thành một loạt các thẻ. Giả sử bạn có
class C { static void Main(){ var x = 123; } }
Đầu tiên chúng ta xác định rằng những thẻ đang CLASS IDENTIFIER (C) LEFTBRACE static void IDENTIFIER (Main) LEFTPAREN RIGHTPAREN LEFTBRACE IDENTIFIERTHATMIGHTBEAKEYWORD (var) IDENTIFIER (x) bằng INTEGER (123) SEMICOLON RIGHTBRACE RIGHTBRACE.
Ở giai đoạn phân tích này, "var" là số nhận dạng có ghi chú trên đó cho biết rằng đó có thể là từ khóa var chứ không phải từ định danh var.
Phân tích tiếp theo chúng tôi thực hiện là phân tích ngữ pháp trong đó các mã thông báo được sắp xếp thành các nhóm tạo thành "cây phân tích cú pháp". Trong trường hợp này các thẻ sẽ được tổ chức thành cây này (thụt đầu dòng cho thấy mức độ làm tổ trên cây)
declaration of class: CLASS
class name: IDENTIFIER(C)
class body begins: LEFTBRACE
declaration of method:
method modifier: STATIC
return type: VOID
method name: IDENTIFIER(Main)
formal parameter declarations:
formal parameter declarations begin: LEFTPAREN
formal parameter declarations end: RIGHTPAREN
method body:
method body begins: LEFTBRACE
local declaration statement:
type: IDENTIFIERTHATMIGHTBEAKEYWORD(var)
local name: IDENTIFIER(x)
initializer:
assignment operator: EQUALS
integer literal expression: INTEGER(123)
statement ends: SEMICOLON
method body ends: RIGHTBRACE
class body ends: RIGHTBRACE
Tại thời điểm này var đã được phân loại như một loại, ngữ pháp. Nó ở nơi chúng tôi mong đợi một tuyên bố loại nếu đây là một chương trình pháp lý theo ngữ pháp.
Nhưng tại thời điểm này, chúng tôi không biết liệu "var" có liên quan đến một loại hoặc đang được sử dụng làm từ khóa hay không. Điều đó yêu cầu phân tích ngữ nghĩa.
Khi phân tích ngữ nghĩa của cây phân tích, chúng ta nói "OK, có một lớp C, nó có phương thức Main, khai báo biến cục bộ x. Biến kiểu cục bộ đó là gì?"
Tại thời điểm này, có hai khả năng. Khả năng đầu tiên là có một lớp, struct, enum, interface hoặc kiểu ủy nhiệm có tên là "var" trong không gian tên chung. (Không có chỉ thị "sử dụng" trong đoạn chương trình này vì vậy chúng tôi không phải kiểm tra bất kỳ không gian tên nào khác và loại không phải là một phần vì vậy chúng tôi không phải kiểm tra bất kỳ khai báo kiểu nào khác). Chúng tôi tìm kiếm không gian tên chung của tất cả các hội đồng được tham chiếu tìm kiếm một loại được gọi là "var". Chúng tôi cũng thực hiện phân tích ngữ nghĩa của các khai báo kiểu trong tất cả các tệp khác, một lần nữa, tìm kiếm một loại được gọi là var.
Nếu chúng tôi tìm thấy, thì "var" dùng để chỉ loại đó.
Nếu chúng tôi không tìm thấy, chúng tôi giả định rằng "var" đang được sử dụng như một từ khóa theo ngữ cảnh giới thiệu một địa phương được đánh máy ngầm.
Vì vậy, để trả lời câu hỏi của bạn:
lexically, mã đoạn "var" là một thẻ nhận dạng với một ghi chú trên đó nói rằng "bằng cách này, điều này thực sự có thể là một từ khóa".
Grammatically, mã thông báo "var" là loại khi xuất hiện ở vị trí trong ngữ pháp có kiểu được mong đợi là.
Ngữ nghĩa, cú pháp loại "var" là loại khi có loại trong phạm vi được gọi là var; nếu không có loại như vậy và "var" đang được sử dụng làm loại khai báo cục bộ thì cú pháp loại "var" không tham chiếu đến một loại. Thay vào đó, nó là một hướng dẫn để trình biên dịch suy ra loại thực tế của địa phương.
và bạn có thể vui lòng giải thích cho tôi ý nghĩa của 'loại biến tiềm ẩn' có nghĩa là trong bài viết msdn như tôi đã trích dẫn không? Bit bị mất trong bản dịch ở đây;) Hơi chỉnh sửa câu hỏi, bạn ở đâu quá nhanh ... –
@Caspar: Có nghĩa là bạn có thể sử dụng 'var' để khai báo kiểu biến, trong trường hợp này kiểu biến thời gian của biến là loại biểu thức ở phía bên tay phải. –
Điều quan trọng là không mất định dạng ở đó, đó là 'loại ngầm ** var **'. Var là một đánh máy ngầm định trong đó kiểu thực được xác định bởi trình biên dịch từ những gì được gán cho nó, tức là 'var i = 10;', trái với một biến được định nghĩa rõ ràng, tức là 'int i = 10;' Implicit thực sự có nghĩa là ngụ ý hoặc suy ra loại. cái đó có giúp ích không? – Lazarus