Normalerweise entwickle ich in C #, aber ich habe noch keine Schnittstelle für C # in der API, sodass ich mit der Entwicklung in Java begonnen habe. Ich habe Java nicht so sehr berührt, deshalb habe ich versucht, "xxxx" in C # als "xxxx" in Java zusammenzufassen. Es konzentriert sich auf die reservierten Wörter und Implementierungsmethoden, die ich oft benutze. Daher werden nicht alle Unterschiede abgedeckt.
Ich habe die Unterschiede zwischen reservierten Wörtern in C # und Java und die Punkte zusammengefasst, die sich nicht ändern. Vergleichen wir dieselben und ähnliche Elemente nebeneinander.
Unterschied | C# | Java | Bemerkungen |
---|---|---|---|
namespace | package | ||
using | import | ||
Keiner | class | class | |
: | extends | Klassenvererbung | |
Keiner | interface | interface | |
Keiner | abstract | abstract | |
virtual | Keiner | Wenn die Funktion am Vererbungsziel überschrieben werden soll, wird C.#はvirtualを付与、JavaはKeiner | |
override | @Override | C#Ist in der Definition enthalten, aber Java ist eine Anmerkung(C#Attribut, Attribut) | |
readonly | final | Schreibgeschütztes Feld | |
const | final | Konstante | |
sealed | final | Klassenvererbung verboten, Java auch als Funktionsüberschreibung verboten | |
Keiner | Enum | Enum | Aufzählungstyp |
struct | Keiner | Struktur |
Java hatte nicht "struct", "virtual". Es scheint kein Problem zu geben, da "struct" so durch class ersetzt werden kann, aber ohne "virtual" scheint es ein wenig mühsam zu sein. Stöbern Sie für "virtuell" am Ende der Seite mit dem Titel unten. ・ "C # virtuell und Java final"
Außerdem enthielt Javas "final" mehrere C # -Funktionen. Nicht nur das, es gibt auch nur Java-Verwendung, daher werde ich diesen Unterschied am Ende der Seite mit dem Titel unten untersuchen. ・ "Unterschiede in der konstanten Deklaration und Einstellungsmethode"
Ich habe versucht, die Implementierungsmethode in C #, die Implementierungsmethode in Java und die Implementierungsmethode, die nur in beiden zu finden sind, zusammenzufassen. Vergleichen wir dieselben Elemente, von denen ich dachte, dass sie nebeneinander ähnlich sind.
Was du machen willst | C# | Java |
---|---|---|
Attribut selbst gemacht | Vererbung von Attributen | @Klassendefinition in der Schnittstelle |
Erweiterungsmethode | public static class | Keiner |
Standardimplementierung der Schnittstelle | ~~Keiner~~ C#8.0 (.NET Core 3.0)Fügen Sie mit hinzu |
Schnittstelle erben und standardmäßig Mitglieder definieren |
Automatische Freigabe von Ressourcen | using(Stream stream = new Stream()) | try-with-resources |
Geben Sie Parametereinschränkungen ein | where T: int | <T extends Number> |
Oben Beispiel)void Test<T>(T arg) | void Test<T>(T arg) where T : int | <T extends Number> void Test(T arg) |
Null-tolerante Deklaration | Nullable<T>,T? | Optional<T> |
Lambda-Stil | ()=>{ } | ()->{ } |
Kein Rückrufargument | Action | Runnable |
Gleich wie oben 1 Argument | Action<T> | Consumer<T> |
Gleich wie oben 2 Argumente | Action<T1,T2> | BiConsumer<T,U>(Bis zu 2 Argumente) |
Gleich wie oben Es gibt einen Rückgabewert | Function<R> | Supplier<T> ~~API-SpezifikationFunktionsschnittstelleKeine Grenze zu sehen~~ |
Wie oben, 1 Argument, mit Rückgabewert | Function<T,R> | Function<T,R> |
Wie oben, 2 Argumente mit Rückgabewert | Function<T1,T2,R> | BiFunction<T,U,R>(Bis zu 2 Argumente) |
In Bezug auf die diesmal aufgeführten Funktionen wurde festgestellt, dass sowohl C # als auch Java dieselben Funktionen haben, obwohl die Benutzerfreundlichkeit unterschiedlich ist.
Wie Sie im Kommentarbereich ausgeführt haben, wurde C # seit C # 8.0 die Standardimplementierungsfunktion der Schnittstelle hinzugefügt. Ich war verwirrt über Abstract und Interface und habe es in letzterem implementiert, aber ich bin sicher, dass es Leute gibt, die dieselbe Implementierung im Vererbungsziel haben. ~~ Ich bin ~~ Ich möchte das auf jeden Fall nutzen.
Auch die Verwendbarkeit von "Action" und "Function" in C #, sogenannte Callbacks, scheint ganz anders zu sein. Stöbern Sie für "Rückruf" am Ende der Seite mit dem Titel unten. ・ Unterschiede bei der Verwendung von Rückrufen
Wir werden uns mit den drei Punkten befassen, die unter "Unterschiede in reservierten Wörtern" und "Unterschiede in den Implementierungsmethoden" aufgeführt sind.
In C # aktiviert "virtuell" das Überschreiben (um genau zu sein als virtuelle Methode implementiert), und Java verbietet das Überschreiben mit "final". Mit anderen Worten, wenn Sie einer Java-Funktion nicht "final" hinzufügen, wird sie immer als "virtuell" im Sinne von C # implementiert. Es wurde überschrieben, bevor ich es wusste! ?? Wenn Sie nicht in einer solchen Situation sein möchten, sollten Sie auf jeden Fall "final" hinzufügen. ..
Der Unterschied zwischen C # - und Java-Rückrufen ist ungefähr so. Wenn Sie diesen Unterschied verstehen, werden Sie nicht durch C # und Java verwechselt.
Java-Rückrufe haben eine Obergrenze für die Anzahl der Argumente, und C # kann bis zu 16 dauern.
Java-Rückrufe können keine numerischen Typen als Argumente verwenden, aber C # kann alle Typen als Argumente verwenden. (* 1)
※1 Die in diesem Artikel erwähnten Java-Rückrufe können nur Referenztypen als Argumente verwenden. Daher kann Java im Gegensatz zu C # keinen numerischen Typ als Argument verwenden. ~~ Ich war verwirrt, weil ich den Wert nicht einstellen konnte ~~ Stattdessen gibt es einen Rückruf für den numerischen Typ, der durch den folgenden Namen definiert wird. Verwenden Sie diesen. ・ Verbraucher "Numerischer Typ" ・ Obj "Numerischer Typ" Verbraucher ・ "Numerische Funktion" ・ Zur Funktion "Numerischer Typ" ・ Zu "Numerischer Typ" BiFuction
Wir haben die Unterschiede zusammengefasst, wenn C # "const", "readonly" und Java "final" als Konstanten und schreibgeschützt verwendet werden.
Konstante Deklaration, Zuweisungsmethode | const | readonly | final |
---|---|---|---|
Deklaration im konstanten Feld | 〇 | 〇 | 〇 |
Zuordnung zu einem anderen konstanten Feld als dem deklarierten Ort | × | 〇 ※1 | × |
Deklaration mit lokalen Variablen | 〇 | × | 〇 |
Andere Zuordnung als der Deklarationsspeicherort in der lokalen Variablen | × | × | 〇 |
Gewähren Sie dem Argument | × | × | 〇 |
Typbeschränkungen zum Zeitpunkt der Deklaration | Ja * 2 | Keiner | Keiner |
Anders als oben ist es der Funktion "final" untersagt, sie neu zuzuweisen, wie im Kommentar ausgeführt. Da C # grundsätzlich keine anderen Zuweisungen als am Deklarationsort vornehmen kann, gibt es keine entsprechende Funktion. Wenn Sie es erzwingen, ist es so etwas wie "schreibgeschützt", das auch mit lokalen Variablen deklariert werden kann? Natürlich gibt es keine solche Funktion, also möchte ich sie definitiv in C #.
Ich habe gehört, dass C # und Java ähnlich sind, weil sie dieselbe Sprachbasis haben. Als ich recherchierte, hatte ich das Gefühl, dass viele der reservierten Wörter gleich waren und dass sie sicherlich ähnlich waren. Darüber hinaus gab es Unterschiede, die ich nicht bemerkte, wenn ich den Code nicht tatsächlich schrieb (kleine Unterschiede wie das Verwechseln der reservierten Wörter). Daher war es mir wichtig, nicht nur Wissen zu sammeln, sondern auch auszugeben. Obwohl es auf ähnliche Weise geschrieben ist, verhält es sich möglicherweise anders. Daher möchte ich vermeiden, es anzupassen, wenn ein Fehler auftritt.
Vor allem auch Informationsaktualisierungen. .. Vielen Dank an alle, die darauf hingewiesen haben.
Recommended Posts