Mam doświadczenie w języku C ++ i w pełni rozumiem i zgadzam się z odpowiedziami na to pytanie: Dlaczego „używanie przestrzeni nazw std;” uważane za złą praktykę?
Jestem więc zaskoczony, że mając trochę doświadczenia z C #, widzę tam dokładnie coś przeciwnego:
using Some.Namespace;
jest dosłownie wszędzie używany. Za każdym razem, gdy zaczynasz używać typu, najpierw dodajesz dyrektywę using dla jego przestrzeni nazw (jeśli jeszcze go nie ma). Nie pamiętam, że widziałem .cs
plik, od którego się nie zaczął using System; using System.Collections.Generic; using X.Y.Z; etc...
. W rzeczywistości, jeśli dodasz nowy plik za pomocą kreatora Visual Studio, automatycznie doda tam niektóre dyrektywy, nawet jeśli w ogóle ich nie potrzebujesz. Tak więc, podczas gdy w społeczności C ++ jesteś zasadniczo zlinczowany, C # nawet zachęca do robienia tego. Przynajmniej tak mi się wydaje.
Teraz rozumiem, że używanie dyrektyw w C # i C ++ nie jest dokładnie tym samym. Rozumiem również, że jedna z najgorszych rzeczy, które możesz zrobić using namespace
w C ++, mianowicie umieszczenie go w pliku nagłówkowym, nie ma równorzędnego odpowiednika w języku C # z powodu braku koncepcji plików nagłówkowych i #include
.
Jednak pomimo różnic, korzystanie z dyrektyw w C # i C ++ służy temu samemu celowi, który trzeba pisać tylko SomeType
cały czas, a nie znacznie dłużej Some.Namespace.SomeType
(w C ++ ::
zamiast zamiast .
). I w tym samym celu również niebezpieczeństwo wydaje mi się takie samo: nazewnictwo kolizji.
W najlepszym przypadku powoduje to błąd kompilacji, więc „tylko” trzeba go naprawić. W najgorszym przypadku nadal się kompiluje, a kod po cichu robi inne rzeczy, niż zamierzałeś. Więc moje pytanie brzmi: dlaczego (najwyraźniej) używają dyrektyw uważanych za tak nierównomiernie złe w C # i C ++?
Kilka pomysłów na odpowiedź, którą mam (ale żadna z nich tak naprawdę mnie nie satysfakcjonuje):
Przestrzenie nazw są zwykle znacznie dłuższe i znacznie bardziej zagnieżdżone w C # niż w C ++ (
std
vs.System.Collection.Generic
). Tak więc istnieje większe pragnienie i większy zysk w odczekaniu kodu w ten sposób. Ale nawet jeśli jest to prawda, ten argument ma zastosowanie tylko wtedy, gdy spojrzymy na standardowe przestrzenie nazw. Niestandardowe mogą mieć dowolną krótką nazwę, zarówno w języku C #, jak i C ++.Przestrzenie nazw wydają się być znacznie bardziej „drobnoziarniste” w C # niż w C ++. Jako przykład, w C ++ cała biblioteka standardowa jest zawarta w
std
(plus kilka drobnych zagnieżdżonych nazw podobachrono
), natomiast w C # trzebaSystem.IO
,System.Threading
,System.Text
itd. Tak więc, ryzyko wystąpienia kolizji nazewnictwa jest mniejszy. Jest to jednak tylko przeczucie. Tak naprawdę nie policzyłem, ile nazw „importujesz” za pomocąusing namespace std
iusing System
. I znowu, nawet jeśli jest to prawda, ten argument ma zastosowanie tylko w przypadku standardowych przestrzeni nazw. Własne mogą być zaprojektowane tak drobnoziarniste, jak chcesz, zarówno w języku C #, jak i C ++.
Czy jest więcej argumentów? Szczególnie interesują mnie faktyczne twarde fakty (jeśli takie istnieją), a nie opinie.
Ext(this T t, long l)
która nazywa się via t.Ext(0)
. Jeśli następnie dodasz inną przestrzeń nazw zawierającą metodę rozszerzenia Ext(this T t, int i)
, zostanie ona wywołana zamiast tego. Ale nie jestem ekspertem w C # (jeszcze).