Tôi có một nền tảng C ++ và tôi hoàn toàn hiểu và đồng ý với các câu trả lời cho câu hỏi này: Tại sao là sử dụng không gian tên std; coi hành vi xấu?
Vì vậy, tôi rất ngạc nhiên rằng, bây giờ có một số kinh nghiệm với C #, tôi thấy điều hoàn toàn ngược lại ở đó:
using Some.Namespace;
được sử dụng ở mọi nơi. Bất cứ khi nào bạn bắt đầu sử dụng một loại, trước tiên bạn thêm một lệnh sử dụng cho không gian tên của nó (nếu nó chưa có). Tôi không thể nhớ đã thấy một .cs
-file không bắt đầu bằng using System; using System.Collections.Generic; using X.Y.Z; etc...
. Trong thực tế, nếu bạn thêm một tệp mới thông qua trình hướng dẫn Visual Studio, nó sẽ tự động thêm một số sử dụng các chỉ thị ở đó, mặc dù bạn có thể không cần đến chúng. Vì vậy, trong khi trong cộng đồng C ++ về cơ bản bạn bị nới lỏng, C # thậm chí còn khuyến khích làm điều này. Ít nhất đây là cách nó xuất hiện với tôi.
Bây giờ, tôi hiểu rằng việc sử dụng các lệnh trong C # và C ++ không hoàn toàn giống nhau. Ngoài ra, tôi hiểu rằng một trong những điều khó khăn nhất bạn có thể làm với using namespace
C ++, cụ thể là đặt nó trong tệp tiêu đề, không có đối tác khó chịu tương đương trong C # do thiếu khái niệm về tệp tiêu đề và #include
.
Tuy nhiên, bất chấp sự khác biệt của chúng, việc sử dụng các lệnh trong C # và C ++ phục vụ cho cùng một mục đích, đó là chỉ phải gõ SomeType
mọi lúc, thay vì dài hơn nhiều Some.Namespace.SomeType
(trong C ++ ::
thay vì .
). Và với cùng mục đích này, mối nguy hiểm dường như cũng giống tôi: đặt tên va chạm.
Trong trường hợp tốt nhất, điều này dẫn đến lỗi biên dịch, do đó bạn "chỉ" phải sửa nó. Trong trường hợp xấu nhất, nó vẫn biên dịch và mã âm thầm làm những việc khác với dự định của bạn. Vì vậy, câu hỏi của tôi là: Tại sao (rõ ràng) đang sử dụng các chỉ thị được coi là rất tệ trong C # và C ++?
Một số ý tưởng về một câu trả lời mà tôi có (mặc dù không ai trong số này thực sự làm tôi hài lòng):
Không gian tên có xu hướng dài hơn và được lồng trong C # nhiều hơn so với trong C ++ (
std
so vớiSystem.Collection.Generic
). Vì vậy, có nhiều mong muốn hơn và đạt được nhiều hơn trong việc khử nhiễu mã theo cách này. Nhưng ngay cả khi điều này là đúng, đối số này chỉ áp dụng khi chúng ta nhìn vào các không gian tên tiêu chuẩn. Những cái tùy chỉnh có thể có bất kỳ tên ngắn nào bạn thích, trong cả C # và C ++.Không gian tên dường như là "hạt mịn" hơn nhiều trong C # so với C ++. Như một ví dụ, trong C ++ toàn bộ thư viện chuẩn được chứa trong
std
(cộng với một số namespace lồng nhau nhỏ thíchchrono
) trong khi trong C # bạn cóSystem.IO
,System.Threading
,System.Text
vv Vì vậy, nguy cơ bị va chạm đặt tên là nhỏ hơn. Tuy nhiên, đây chỉ là một cảm giác ruột. Tôi thực sự không đếm được có bao nhiêu tên bạn "nhập" vớiusing namespace std
vàusing System
. Và một lần nữa, ngay cả khi điều này là đúng, đối số này chỉ áp dụng khi nhìn vào các không gian tên tiêu chuẩn. Những cái riêng của bạn có thể được thiết kế dạng hạt mịn như bạn muốn, trong cả C # và C ++.
Có nhiều tranh luận? Tôi đặc biệt quan tâm đến các sự kiện thực tế khó khăn (nếu có) và không có nhiều ý kiến.
Ext(this T t, long l)
được gọi thông qua t.Ext(0)
. Nếu sau đó bạn thêm một không gian tên khác có chứa một phương thức mở rộng Ext(this T t, int i)
, thì nó sẽ được gọi thay thế. Nhưng tôi không phải là chuyên gia về C # (chưa).