Die Entwickler von Java hassen die Komplexität von C++, daher ist Java sehr prägnant und GC macht die Speicherverwaltung auch sehr praktisch. C# ist an der GC- und Virtual-Machine-Technologie von Java interessiert und hofft, mehrere wichtige Microsoft-Sprachen in .NET zu integrieren. . Daher ist C# sprachlich weder einfach noch komplex.
Auch die Designideen der beiden Sprachen sind unterschiedlich. Java ist eine kompilierte und interpretierte Sprache, während C# eine kompilierte und dann kompilierte und ausgeführte Sprache ist. Java hat keine Delegaten, C# hat Delegaten. Java verwendet tendenziell die Schnittstelle zur Implementierung von Delegate-Funktionen, während in C# die abstrakte Klasse eine größere Rolle spielt als die Schnittstelle.
Java folgt den Kamel-Namensregeln und C# folgt den Pascal-Namensregeln. Aber jetzt beginnen immer mehr Java-Benutzer, C# zu verwenden, und bringen gleichzeitig die Camel-Benennungsregeln in C# ein, was die Lesbarkeit von C#-Code möglicherweise immer schwieriger macht. Warum folgte C# nicht überhaupt Camel? Ich sehe nichts Schlechtes an der Benennungskonvention für Kamele.
1. Klassenname.diese und innere Klasse
In Java sehen wir oft eine ähnliche Verwendung wie „Klassenname“. Dies ist die aktuelle Objektinstanz. Warum steht der Klassenname davor? C#-Programmierer werden dadurch verwirrt sein.
In Java werden an vielen Stellen innere Klassen verwendet, und auf Mitglieder der äußeren Klasse kann sogar in der inneren Klasse zugegriffen werden. Wenn dies in der inneren Klasse verwendet wird, stellt sich die Frage, wer das ist und was es ist Bedeutet: Ist es die aktuelle Objektinstanz der inneren Klasse oder die aktuelle Objektinstanz der äußeren Klasse?
In Java bedeutet das Hinzufügen des Klassennamens der äußeren Klasse davor, dass die aktuelle Objektinstanz der äußeren Klasse in der inneren Klasse verwendet wird.
Schauen wir uns unten ein Beispiel an.
//Externe Klassendefinition
öffentliche Klasse OuterClass {
//Innere Klassendefinition
private Klasse InnerClass
{
// In der inneren Klasse ist kein ID-Mitglied definiert. Hier greifen wir auf die Mitglieder in der äußeren Klasse zu.
public int getId(){ return OuterClass.this.id }
public void setId(int id) { OuterClass.this.id = id;}
// Das Namensmitglied wird in der inneren Klasse definiert und auf Mitglieder in der inneren Klasse wird direkt zugegriffen. Standardmäßig wird auf Mitglieder in der aktuellen Klasse zugegriffen.
privater String-Name;
public String getName() { return this.name;}
// Davor können Sie den Namen einer inneren Klasse hinzufügen
public void setName(String name) { InnerClass.this.name = name;}
// Die innere Klasse kann auch auf gleichnamige Mitglieder in der äußeren Klasse zugreifen, und der Name der äußeren Klasse muss hinzugefügt werden.
public String getOuterName() { return OuterClass.this.name;}
public void setOuterName(String name) { OuterClass.this.name = name;}
@Override
öffentlicher String toString()
{
return "Id: " + this.getId() + ", Innerer Name: " + this.getName() + ", Äußerer Name: " + this.getOuterName();
}
}
//Member-ID und Name, definiert in der externen Klasse
private int-id;
privater String-Name;
private InnerClass innerInstance;
öffentliche OuterClass()
{
this.innerInstance = new InnerClass();
this.innerInstance.setId(20);
this.innerInstance.setName("Tom");
this.innerInstance.setOuterName("Alice");
}
öffentlicher String toString()
{
return this.innerInstance.toString();
}
}
In C# werden Klassen in verschachtelte und nicht verschachtelte Klassen unterteilt. Erstere ist eine Klasse, die innerhalb anderer Datentypen deklariert wird. Letzteres ist eine Klasse, die direkt in einem bestimmten Namespace definiert ist. Verschachtelte Klassen werden in C# selten definiert.
Nicht eingebettete Klassen ermöglichen nur die Verwendung öffentlicher und interner Zugriffskontrollen, während integrierte Klassen die Verwendung aller fünf Zugriffskontrollzeichen ermöglichen: privat, geschützt, intern geschützt, öffentlich und intern. Innere Klassen können auch auf alle Methoden der äußeren Klasse zugreifen, einschließlich Instanzmethoden und privater Methoden, müssen jedoch explizit eine Instanz der äußeren Klasse übergeben.
Innere Klassen in C# können von externen Klassen definierte Typen und statische Methoden verwenden, jedoch nicht direkt Instanzmethoden externer Klassen. Daher besteht das oben genannte Problem nicht.
In C# verhält sich die äußere Klasse eher wie ein Namespace für die innere Klasse. Solange die Zugriffskontrolle dies zulässt, können Sie die folgende Methode verwenden, um eine Instanz des inneren Klassenobjekts zu erstellen.
OuterClass.InnerClass obj = new OuterClass.InnerClass(); Diese Instanz hat keine direkte Beziehung zu einer Instanz der äußeren Klasse. Ähnlich wie statische innere Klassen in Java.
2. Klassenname.Klasse und Typ
In Java sehen wir häufig die Verwendung von Klassenname.class. Diese Verwendung entspricht typeof (Klassenname) in C#, mit dem die Typobjektinstanzreferenz des Typs abgerufen wird.
In Java verfügt jede Klasse über ein entsprechendes Klassenobjekt. Wenn eine Klasse geschrieben und kompiliert wird, wird in der generierten .class-Datei ein Klassenobjekt generiert, das die Typinformationen der Klasse darstellt. Drei Möglichkeiten, Klasseninstanzen zu erhalten:
Rufen Sie die Klasseninstanz des Objekts ab, indem Sie die Methode getClass() der Objektinstanz aufrufen.
Verwenden Sie die statische Methode forName() von Class, um eine Klasseninstanz unter Verwendung des Namens der Klasse abzurufen. Class.forName(xxx.xx.xx) gibt eine Klasse zurück. Seine Funktion besteht darin, die JVM aufzufordern, die angegebene Klasse zu finden und zu laden, was bedeutet, dass die JVM das statische Codesegment der Klasse ausführt.
Rufen Sie die Klasseninstanz mit dem Klassennamen .calss ab. Für Kapselungsklassen von Basisdatentypen können Sie auch .TYPE verwenden, um die Klasseninstanz des entsprechenden Basisdatentyps abzurufen.
Der Weg, eine Instanz eines Typobjekts in C# abzurufen, ist einfacher und klarer.
Wird durch Aufrufen der GetType()-Methode der Dateninstanz erhalten. Diese Methode wird von Object geerbt, sodass jedes Objekt in C# über die GetType()-Methode x.GetType() verfügt, wobei x der Variablenname ist.
x in typeof(x) muss ein bestimmter Klassenname, Typname usw. sein und darf kein Variablenname sein.
Über die statische Methode System.Type.GetType() von System.Type.
3. Anonyme Klasse
In Java werden auch häufiger anonyme Klassen verwendet. In Android sieht man beispielsweise bei der Implementierung der Schaltflächenüberwachung häufig Code wie diesen.
@Override
public void onClick(View arg0) {
Intent intent = new Intent( MainActivity.this, ActivityFrameLayout.class);
setTitle("FrameLayout");
startActivity(absicht);
}
};
Hier ist OnClickListenter tatsächlich eine Schnittstelle. Kann die Schnittstelle zum Erstellen von Objektinstanzen verwendet werden? Natürlich nicht.
Daher erstellt Java automatisch eine anonyme Klasse, die die Schnittstelle hier implementiert. Was wir erstellen, ist tatsächlich eine Objektinstanz dieser anonymen Klasse.
Dies hat den Vorteil, dass wir keine Klasse definieren müssen, die nur einmal verwendet wird, und dann über diese Klasse Objektinstanzen erstellen müssen, was die Programmentwicklung vereinfacht.
Wir haben zum Beispiel die folgende Schnittstelle.
Instanz.onClick(); In C# werden wir diese Form überhaupt nicht verwenden, die gleiche Funktion kann sehr einfach erreicht werden.
Beachten Sie, dass es in Java keine Delegaten gibt.
Wenn wir den Typ dieser Instanz drucken, sehen Sie den tatsächlichen Typ dieser anonymen Klasse.
Das Konzept der Attribute sollte jedem bekannt sein. Klassenmitgliedsfunktionen können frei auf jedes Attributmitglied in dieser Klasse zugreifen. Da es jedoch schwieriger ist, von einer Klasse aus auf die Eigenschaften einer anderen Klasse zuzugreifen, verwenden wir häufig die Methoden Getxxx und Setxxx, was äußerst unnatürlich aussieht. In Java oder C++ sieht der Code beispielsweise so aus:
In C# werden solche Methoden jedoch „zugeschrieben“. Derselbe Code wird in C# zu:
foo.size++;
label.font.bold = true;
Wie Sie sehen, ist C# offensichtlich einfacher zu lesen und zu verstehen. Eine ähnliche Situation können wir auch aus dem Unterprogrammcode dieser „Eigenschaftsmethode“ erkennen:
Java/C++:
C#:
Um diese Art von attributierter Methode von den Attributmitgliedern der Klasse zu unterscheiden, werden Attributmitglieder in C# als „Felder“ bezeichnet, und „Attribut“ wird zum speziellen Substantiv für diese „attributierte Methode“. Tatsächlich kommt diese Art von Attributmethode häufig in VB und DELPHI vor. In VB wird sie auch als Attribut bezeichnet. Darüber hinaus müssen Get und Set in C# paarweise vorkommen. Eine Eigenschaft kann nicht nur Get ohne Set haben (in Java und C++ kann sie nur Get oder nur Set haben). Wenn Sie ein bestimmtes Attribut ändern möchten, achten Sie gleichzeitig auf die Get- und Set-Methoden und ändern Sie diese gleichzeitig.
5. Objektindizierungsmechanismus (Indexer)
Der Objektindizierungsmechanismus wurde in C# eingeführt. Um es klarer auszudrücken: Ein Objektindex ist eigentlich ein Array von Objekten. Lassen Sie uns im Zusammenhang mit den Eigenschaften im vorherigen Abschnitt darüber sprechen. Eigenschaften müssen die Get- und Set-Methoden verbergen, aber im Indexmechanismus werden die Get- oder Set-Methoden jedes Objekts angezeigt. Das folgende Beispiel verdeutlicht diesen Punkt beispielsweise deutlicher. Das Obige stellt die Unterschiede zwischen C# und Java vor
Geschichten [Index] = Wert;
}
}
}
...
}
Das Obige stellt die Unterschiede zwischen C# und JAVA vor. Ich hoffe, es wird Ihnen helfen, C# und JAVA zu verstehen.