webentwicklung-frage-antwort-db.com.de

Klasse gegen öffentliche Klasse

Was ist der Unterschied zwischen:

namespace Library{
    class File{
        //code inside it
   }
}

und:

namespace Library{
   public class File{
       //code inside it
   }
}

Also, was wird der Unterschied zwischen öffentliche Klasse und Klasse sein?

55
user1678541

Ohne Angabe von public ist die Klasse implizit internal. Dies bedeutet, dass die Klasse nur innerhalb derselben Assembly sichtbar ist. Wenn Sie public angeben, wird die Klasse außerhalb der Assembly angezeigt.

Es ist auch erlaubt, den Modifikator internal explizit anzugeben:

internal class Foo {}
61
driis

Ersteres entspricht:

namespace Library{
    internal class File{
        //code inside it
   }
}

Alle Sichtbarkeiten werden standardmäßig so wenig wie möglich angezeigt - private für Mitglieder von classes und structs (Methoden, Eigenschaften, Felder, verschachtelte Klassen und verschachtelte enums) und internal für direkte Mitglieder von namespaces, da diese nicht privat sein können.

internal bedeutet, dass anderer Code in derselben Assembly es sehen kann, aber nichts anderes (mit Ausnahme von Friend-Assemblys und der Verwendung von Reflection).

Dies ist aus zwei Gründen sinnvoll:

  1. Sie sollten bewusst dafür sorgen, dass die Dinge sowieso so wenig wie möglich sichtbar sind, um Ihre Kapselung zu stärken.
  2. Wenn sie standardmäßig public verwenden, können Sie versehentlich etwas veröffentlichen, das privat oder intern sein sollte. Wenn Sie versehentlich etwas nicht sichtbar genug machen, wird ein offensichtlicher Kompilierungsfehler angezeigt und behoben. Wenn Sie versehentlich etwas zu sichtbar machen, führen Sie einen Fehler in Ihren Code ein, der nicht als Fehler gekennzeichnet wird und eine wichtige Änderung darstellt, die später behoben werden muss.

Es wird oft als besserer Stil angesehen, mit Ihren Zugriffsmodifikatoren explizit umzugehen, um klarer im Code zu sein, was gerade vor sich geht.

22
Jon Hanna

Standardmäßig sind alle classes (und auch alle anderen Typen) internal, damit Sie von außen darauf zugreifen können (ohne Dinge wie InternalsVisibleToAttribute) um sie public explizit zu machen.

1
Anton Gogolev