2011-12-11 38 views
9

Tôi thấy nhiều lần sử dụng nativeliterals "từ khóa" trong các bài viết C#. Có ý nghĩa gì?Từ khóa "gốc" và "theo nghĩa đen" là gì

ví dụ:

string.Empty article:

Hằng Rỗng giữ giá trị chuỗi rỗng. Chúng ta cần gọi hàm tạo String để trình biên dịch không đánh dấu điều này là chữ. Đánh dấu điều này là nghĩa đen có nghĩa là nó không hiển thị dưới dạng trường mà chúng tôi có thể truy cập từ gốc.

C# vs Java Wikipedia article:

Simple/loại nguyên thủy
Cả hai ngôn ngữ hỗ trợ một số được xây dựng trong loại được sao chép và truyền theo giá trị chứ không phải là bằng cách tham khảo. Java gọi các kiểu nguyên thủy này, trong khi chúng được gọi là các loại đơn giản trong C#. Các kiểu đơn giản/nguyên thủy thường có native hỗ trợ từ kiến ​​trúc bộ xử lý cơ bản.

Trả lời

14

Từ C# đặc tả phần 2.4.4:

Một đen là một đại diện mã nguồn của một giá trị.

Vì vậy, ví dụ có literals cho chuỗi và số:

string x = "hello"; 
int y = 10; 

... nhưng C# không có cú pháp theo nghĩa đen cho những ngày tháng và thời gian; bạn sẽ phải sử dụng:

DateTime dt = new DateTime(2011, 12, 11); 

Đối với hỗ trợ bản địa - có mức độ khác nhau của "mẹ đẻ" ở đây, nhưng như xa như C# là có liên quan, tôi muốn thường xem xét nó hỗ trợ gõ cụ thể trong bất cứ sản lượng định dạng được sử dụng. Ví dụ, có hướng dẫn IL để xử lý các loại dấu phẩy động nhị phân (float, double) nhưng khi trình biên dịch C# phát ra mã giao dịch với các giá trị decimal, nó phải gọi các toán tử được khai báo trong System.Decimal. Do đó, tôi xem xét rằng floatdoublegốc hỗ trợ trong IL, nhưng decimal thì không.

(Nó sẽ có thể viết một C# nhắm mục tiêu một nền tảng khác nhau mà đã có hỗ trợ cho decimal biên dịch -. Hay mà không có hỗ trợ cho floatdouble, ví dụ Không chắc, nhưng có thể.)

Sau đó, khi IL đang chạy trong một công cụ thực thi, nó sẽ chạy trên đầu mã "thực" gốc - ví dụ x86 - có thể có hỗ trợ cụ thể cho một số loại nhất định. Đó là một cấp độ "bản địa" khác. Ví dụ, nếu ai đó đã đưa ra một phiên bản mới của IL bao gồm hỗ trợ bản địa cho decimal, điều đó sẽ không có nghĩa là bản thân các CPU đột nhiên nhận được hỗ trợ gốc.

+0

bạn có thể vui lòng và cập nhật bài đăng với lời giải thích cho câu này theo câu trả lời của bạn: "Đánh dấu phần này là ** chữ ** có nghĩa là nó không hiển thị dưới dạng trường mà chúng tôi có thể truy cập từ * * native ** " – gdoron

+2

@gdoron: Tôi không biết - nó không có ý nghĩa với tôi, thành thật mà nói. Tôi tin rằng nó nói về truy cập từ mã nguồn gốc, chứ không phải là hỗ trợ cho các loại bản địa, nhưng tôi không biết các chi tiết đằng sau bình luận. –

2

Trích dẫn từ chuỗi bài viết.Empty trông giống như trường hợp nhận xét mã cổ điển không đồng bộ với mã được liên kết của chúng. Nhận xét nói rằng "chúng tôi đang gọi hàm tạo thay vì sử dụng chữ" nhưng mã không gọi hàm tạo: nó sử dụng chữ. Đạo đức của câu chuyện: đừng để sự nhầm lẫn của bạn làm cho bạn nghĩ rằng bạn đã hiểu lầm, bởi vì bình luận là khó hiểu.

Có rất nhiều thông tin sai lệch có liên quan đến chuỗi.Empty, vì nó là một chút của một trường hợp lẻ. Biểu thức chuỗi mới() == "" thường được giả định là sai, vì toán tử mới thường được dự kiến ​​tạo một cá thể mới. Nhưng nó không tạo ra một cá thể mới, nó trả về cá thể trong pool thực, giống như "", vì vậy biểu thức là đúng.

Tôi nghi ngờ rằng "gốc" trong "quyền truy cập từ nguồn gốc" đề cập đến mã gốc (ý nghĩa thứ hai của "bản địa" mà Jon Skeet đã đề cập). Nhưng nếu tôi là bạn, tôi sẽ không dành quá nhiều thời gian cho bài viết đó. Đó là quá quan tâm với lý thuyết trừu tượng rằng dù sao có vẻ không chính xác.

Nếu bạn muốn biết chuỗi.Empty hiệu quả hơn hoặc ít hơn "", biên dịch hai phiên bản của cùng một hàm và kiểm tra IL. Nếu IL khác, hãy chạy một số kiểm tra hiệu suất.

+0

Cảm ơn sự cứu rỗi từ những bình luận và bài viết đó! – gdoron

+0

Nhận xét không được ghi ngày. Nó có nghĩa là hàm tạo lớp sẽ được gọi. Khởi tạo các trường tĩnh và các thuộc tính ngầm tạo ra một hàm tạo lớp được gọi tự động lần đầu tiên lớp được tham chiếu. – Jesse

Các vấn đề liên quan