2009-05-05 15 views
32

W Visual Studio, gdy dodajesz nową klasę, zawsze tworzy ona bez modyfikatorów i czyni klasę wewnętrzną.Dlaczego program Visual Studio domyślnie nie tworzy klasy publicznej?

class MyClass 
{ 
} 

Wolałbym, aby moja klasa domyślnie została utworzona jako publiczna.

Dlaczego jest domyślnie wewnętrzna?

Co byś chciał?

+12

Teraz, jeśli tylko była zapieczętowana domyślnie, jak również idealnie. –

+1

To nie jest duplikat pytania do zaznaczonego. To pytanie w szczególności pyta, dlaczego, a nie jak to zmienić. – Syndog

+0

Jeśli chcesz zmodyfikować domyślne zachowanie, sprawdź to pytanie/odpowiedź ... [http://stackoverflow.com/questions/700086/how-do-you-default-a-new-class-to-public- podczas tworzenia-w-w-visual-studio] (http://stackoverflow.com/questions/700086/how-do-you-default-a-new-class-to-public-when-creating-it-in -visual-studio) –

Odpowiedz

25

Domyślnie domyślam się, że klasa internal: zachowaj swoich szeregowych dla siebie i tylko jawnie ujawniaj części, które naprawdę muszą być widoczne: wszystko inne to tylko szczegóły implementacji i nie powinno być widoczne dla świata zewnętrznego.

W przypadku, gdy chcesz sprawdzić swoje zajęcia internal, .NET 2.0 roku wprowadza nowy atrybut o nazwie InternalsVisibleToAttribute, który

określa, że ​​typy, które są zwykle widoczne tylko w ramach bieżącego montażu są widoczne do innego zespołu.

Jeśli to Cię naprawdę denerwuje, zobacz %ProgramFiles%\Microsoft Visual Studio 8\Common7 IDE\ItemTemplates\CSharp\1033\Class.zip. Jest to szablon, który możesz zmienić w zależności od potrzeb. ReSharper ma podobne możliwości, ale jest dostępny bezpośrednio z poziomu interfejsu użytkownika.

+9

ReSharper domyślnie tworzy klasę publiczną. I to ma dla mnie sens. – Vadim

+0

Możesz użyć InternalsVisbleToAttribute tylko z silnie podpisanymi złożeniami. – Vadim

+4

@Vadim: Mylisz się. –

4

C# dąży do ustawienia domyślnego wszystkiego na niezbędny minimalny zakres. Jest to miłe konwencja i cytowane w książce Skeet za (C# In Depth, str 224 „Uwaga/Ciekawostki”):

[Properties są] jedyne miejsce, gdzie „prywatne” jest wymagane -Everywhere innego w C#, domyślny modyfikator dostępu w dowolnej sytuacji jest najbardziej prywatny. Innymi słowy, jeśli coś można zadeklarować jako prywatne, to całkowite pominięcie modyfikatorów dostępu spowoduje, że będzie on prywatny. Jest to miły element projektowania języka, ponieważ trudno jest go przypadkowo pomylić: jeśli chcesz, aby coś było bardziej publiczne niż to, zauważysz, kiedy spróbujesz go użyć.

+7

Właściwie klasy są domyślnie wewnętrzne. Członkowie klasy są prywatni. –

+0

Spróbuj stworzyć klasę z reflektorem. – Vadim

+2

Joe ma rację. Klasy * nie mogą * być prywatne (chyba, że ​​są zagnieżdżone w innych typach), ale ich członkami są domyślnie. – Noldorin

1

Co ciekawe dzieje się tylko w języku C# - w VB.NET masz public class domyślnie.

Osobiście preferuję klasę publiczną domyślnie, ponieważ zazwyczaj inne klasy potrzebują do niej dostępu. (Większość moich prac jest w warstwie danych chociaż)

+1

Czy inne klasy spoza twojego zespołu naprawdę potrzebują dostępu do większości twoich zajęć? Wątpię w to, ale jeśli tak, powinieneś zastanowić się, jak pogrupujesz klasy na zjazdy! Domyślnie C# to internal, gdzie wszystkie klasy w tym samym zespole mają dostęp. –

+2

Robią to w warstwie danych ... – Pondidum

1

Można zmienić szablony dla klasy C# - zwykle znajduje się w "C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC#"

lub nawet utworzyć własny szablon.

+0

sarnath'd - osobiście lubię otrzymywać monit z rzeczywistym słowem kluczowym, ale w 99% przypadków moje zajęcia są i tak publiczne. Hmm, może to zapach ... – annakata

2

Wolę to tak, jak jest. W ten sposób musisz świadomie zdecydować, że chcesz go udostępnić publicznie.To bardzo przypomina argument, czy chcesz, aby twój komputer był domyślnie otwarty na świat zewnętrzny, czy raczej sam skonfigurowałbyś go do dostępu do Internetu.

Oba podejścia mają swoje zalety, jeden ma poważne potencjalne konsekwencje dla bezpieczeństwa, które moim zdaniem powinny być świadome i podejmować świadomą decyzję, zamiast po prostu automatycznie.

+0

Dobra argumentacja, moim zdaniem. Opt-in publiczna ekspozycja jest lepszym rozwiązaniem niż rezygnacja. – Noldorin

1

Osobiście wolę, jak jest, Zmusza cię do aktywnego myślenia, które zajęcia chcesz upublicznić.

Ostatecznie domyślnie jest to czystszy projekt interfejsu API, a co za tym idzie, lepsze oprogramowanie. Nie chciałbyś ujawnić wewnętrznego działania twojego kodu, co nieuchronnie by się stało, gdyby wszystko było domyślnie publiczne.

To jest nieco subiektywne, osobiście wolę wszystko, aby wyłączyć i włączyć tylko to, czego nie potrzebuję na odwrót.

0

Dobrą praktyką we wszystkich obszarach kodeksu jest ograniczanie możliwości. Bez konkretnego powodu, dla którego byłoby inaczej, wszystko powinno być prywatne, tylko do odczytu (jeszcze lepsze) i statyczne. Jeśli zmienna, metoda lub właściwość może być prywatna, uczyń ją prywatną. Jeśli nie może być prywatny, ale może być chroniony, uczyń go chronionym. Jeśli może być tylko do odczytu, zrób to tylko do odczytu. Jeśli może być statyczny, uczyń go statycznym. To samo dotyczy klas: powinny one być domyślnie wewnętrzne i upubliczniane tylko wtedy, gdy zdecydujesz, że jest to klasa, którą chcesz eksportować.

3

Aby utworzyć klasę domyślnie publiczne dla Visual Studio 2012:

Edytuj ten plik: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs

Aby wyglądać następująco:

using System; 
using System.Collections.Generic; 
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq; 
$endif$using System.Text; 
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks; 
$endif$ 
namespace $rootnamespace$ 
{ 
    public class $safeitemrootname$ 
    { 
    } 
} 

Więcej informacji: http://aaron-hoffman.blogspot.com/2013/05/edit-default-visual-studio-2012-item.html

Powiązane problemy