Tại sao người dùng sử dụng chỉ thị và sử dụng câu lệnh của sử dụng các câu lệnh khác trong C #?


10

Lệnh usingnày cho phép chúng ta truy cập vào các loại mà không cần sử dụng tên đủ điều kiện của chúng:

using MyNamespace.Foo.Bar;

Câu usinglệnh đóng vai trò là đường cú pháp cho try/ finallykhối đảm bảo rằng các đối tượng được xử lý đúng cách:

using(var x = new MyDisposableClass()) { ... }

Hai tình huống này dường như không liên quan gì đến nhau. Tại sao họ sử dụng cùng một từ khóa?

Tôi nghi ngờ bất cứ ai sẽ có được hai trường hợp nhầm lẫn, nhưng có vẻ kỳ lạ khi không tạo ra một từ mới cho một phần chức năng mới.


Bên cạnh đó, tôi cũng đã đọc về việc sử dụng kép classtrong C ++ (một để khai báo các lớp, một để xác định tham số mẫu), nhưng trường hợp thứ hai cuối cùng cũng có từ khóa riêng typename, điều này có ý nghĩa hơn đối với tôi.

Câu trả lời:


7

Bạn đúng ở chỗ cả hai cách sử dụng usingđều không liên quan.

Tuy nhiên, có một số lý do tốt để sử dụng usingtrong cả hai trường hợp.

  • Câu usinglệnh được tạo cho .NET 1.0 và có ý nghĩa ngữ nghĩa ("Tôi đang sử dụng không gian tên này trong đoạn mã sau")
  • Trong cả hai trường hợp, usinglàm cho ý nghĩa ngữ nghĩa. Trong tiếng Anh đơn giản, bạn là usingmột không gian tên hoặc bạn là usingđối tượng dùng một lần được khai báo.
  • Bằng cách quá tải usingtừ khóa, các nhà thiết kế ngôn ngữ không phải tạo ra một từ dành riêng trong ngôn ngữ. Điều này giúp giữ cho ngôn ngữ sạch hơn.

Có thể là do thời gian của họ một lần nữa, các nhà thiết kế ngôn ngữ có thể đã chọn sử dụng importcho các khai báo không gian tên để phân tán hai lựa chọn ( usingmột đối tượng dùng một lần trong phiên bản .NET mới hơn). Chúng tôi sẽ không bao giờ biết và nó thực sự không quan trọng vì nó cực kỳ rõ ràng trong hai nghĩa bạn đang sử dụng do bối cảnh.

Đã nói tất cả những điều đó, đừng đi và xả mã của bạn với các using MyNamespace.DisposableObject = DisposableObject;bí danh không gian tên ở khắp mọi nơi.


Cảm ơn. Bạn có thể mở rộng ý nghĩa của bạn bằng cách "giúp giữ ngôn ngữ sạch hơn" không? Trong tâm trí của tôi, quá tải từ khóa làm cho ngôn ngữ không sạch sẽ. Tôi nghĩ sẽ tốt hơn nếu tạo một từ khóa mới và sử dụng các từ khóa riêng cho các chức năng riêng biệt.
eigenchris

5
Từ khóa không thể được sử dụng như định danh. Giới thiệu một từ khóa mới phá vỡ mọi chương trình xảy ra để sử dụng từ khóa đó làm định danh. Bạn chỉ có thể giới thiệu từ khóa theo cách tương thích ngược nếu bạn có quyền truy cập vào mọi dòng mã nguồn từng được viết trong toàn bộ lịch sử của C♯, bao gồm mã nguồn độc quyền, mã nguồn bí mật, mã nguồn quân sự, v.v.
Jörg W Mittag

@ JörgWMittag, Không hoàn toàn đúng. C # có một loạt các từ khóa theo ngữ cảnh được thêm vào theo cách có nghĩa là các định danh hiện có với tên đó không xung đột với mã. varlà ví dụ kinh điển trong đó một loại trong phạm vi có tên varđược ưu tiên hơn từ khóa.
David Arno

@ JörgWMittag Hoặc cách khác là làm cho phiên bản ngôn ngữ của trình biên dịch có thể chọn (như g++ --std=c++11, hoặc cho phép các tệp nguồn chỉ định một phương ngữ (như trong Haskell (?), Vợt, Perl, thậm chí Python). một cách mà từ khóa không bao giờ xung đột cú pháp với định danh có thể, mà không đặt một số định danh (mặc dù đó có thể là khó khăn để thực hiện ngôn ngữ run-off-the-mill của bạn bằng cách sử dụng phân tích cú pháp LALR với một lexer trước).
amon

1
@eigenchris bạn luôn có thể ưu tiên keword với một @ để sử dụng nó làm định danh như@using
Bill Tür

4

Các nhà thiết kế ngôn ngữ thường cố gắng hạn chế số lượng từ khóa. Khi một từ khóa được bảo lưu, nó không thể được sử dụng như một định danh trong mã người dùng, điều này gây khó chịu nếu đó chỉ là từ bạn cần. Nó cũng là một trở ngại khi chuyển mã từ các ngôn ngữ khác - và Microsoft muốn mọi người chuyển mã từ Java sang C #. C # có nhiều từ khóa hơn Java, nhưng mỗi từ khóa mới sẽ gây khó khăn hơn. Hơn nữa, các ngôn ngữ .net được thiết kế để tương tác với các API được viết bằng các ngôn ngữ khác nhau có thể không có cùng từ khóa, điều này dẫn đến sự khó chịu nếu một thành viên công cộng cũng là một từ khóa.

Hai cách sử dụng usingkhông rõ ràng, vì chúng xuất hiện ở các vị trí trong cú pháp, "sử dụng" là một thuật ngữ thích hợp trong cả hai trường hợp. Vì vậy, nó có ý nghĩa để sử dụng lại cùng một từ khóa. Bạn sẽ lưu ý các ví dụ khác về việc sử dụng lại các từ khóa, ví dụ:

  • new trong những ràng buộc chung
  • introng foreachvà trong các tham số loại biến thể
  • defaultnhư một mệnh đề trong switchvà như một toán tử ( default(T)).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.