2011-01-05 10 views
7

Podczas przeglądania starszego kodu odkryłem, że możesz zadeklarować klasę C# bez umieszczania jej w przestrzeni nazw (w tym scenariuszu mam aplikację ASP.NET WebForms i niektóre formularze internetowe są nie zadeklarowane w żadnej przestrzeni nazw).Klasa AC# z pustym obszarem nazw

Na takiej klasie zwraca wartość GetType(), dla której właściwość namespace ustawiono na null.

Nie wiedziałem, że to dozwolone - czy ktoś może zasugerować, dlaczego byłoby pożądane posiadanie klasy, która nie jest zadeklarowana w przestrzeni nazw?

+0

Och, nie wiem. Tworzę rzeczy, które nie (jawnie) żyją w klasach lub przestrzeniach nazw przez cały czas, ale znowu używam słabych hackowych języków dynamicznych;) – delnan

Odpowiedz

5

To z pewnością nie jest świetna praktyka. To robi sprawia, że ​​niektóre przykłady są łatwiejsze, jak "cześć świat" - może projektanci C# zamierzali grać w golfa, p

Ale tak, to jest dziwactwo. Nie jestem świadomy żadnego znaczącego powodu, dla którego potrzebujemy, aby móc bezpośrednio korzystać z globalnej przestrzeni nazw. Nawet dla metod rozszerzenie wolałbym dodać dyrektywę using aby dostosować je ...

Co ciekawe - nie wydają się być 40-dziwne takie w mscorlib.dll i 20-nieparzyste w system.dll

var mscorlib = typeof(string).Assembly.GetTypes() 
    .Where(t => string.IsNullOrEmpty(t.Namespace)).ToList(); 
var system = typeof(Uri).Assembly.GetTypes() 
    .Where(t => string.IsNullOrEmpty(t.Namespace)).ToList(); 

(ale wszystkie generowane prywatnie/kompilator)

+0

Jedną z racji, o której mogłem pomyśleć, było uproszczenie prostych przykładów. Ale pojęcie przestrzeni nazw jest całkiem proste, a także dość podstawowe ... –

3

Być może w celu umożliwienia współpracy z językami, które nie obsługują przestrzeni nazw.

Aktualizacja

Po trochę spelunking widzę sprawę, że MS korzystania.

Wszystkie złoszenia .Net Framework mają niektóre standardowe klasy w globalnym obszarze nazw, np.

  • FXAssembly: informacje o wersji.
  • ThisAssembly: informacje o montażu.
  • AssemblyRef: zależne informacje o zespole.

Te klasy zawierają metadane w puszkach, które w innym przypadku byłyby trudniejsze i droższe. Zgaduję, że zdecydowali się zlokalizować je w globalnej przestrzeni nazw, aby była to standardowa \ konwencjonalna lokalizacja, w której narzędzia \ narzędzia \ itd. Mogłyby uzyskać do nich dostęp. Ta informacja to informacja \ n "bootstrapping \", więc logicznie znajduje się powyżej pojęcia przestrzeni nazw.

+1

Wydaje się to możliwe, ale nie mogę oprzeć się wrażeniu, że każdy taki język byłby bardzo okaleczony, gdyby rozmawiał z BCL –

Powiązane problemy