Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Interessante Features aus Kotlin, die sich auch C# gut machen würden
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

Interessante Features aus Kotlin, die sich auch C# gut machen würden

beantworten | zitieren | melden

Hallo zusammen,

ich habe gerade in der neuen c't 15/17, S. 164 einen Artikel über die Programmiersprache Kotlin gelesen, die wohl von Java abstammt und daher auch Ähnlichkeiten zu C# hat.

Kotlin hat durchaus einige interessante Features:
  • generelles Verbot von null-Referenzen (das explizit aufgehoben werden kann und muss, um null zu verwenden)
  • switch erlaubt beliebige boolschen Bedingungen
  • fast alles kann als Ausdruck verwendet werden, z.B. auch if
  • Wenn im if eine Variable mit is auf einen bestimmten Typ geprüft wird, betrachtet der Compiler die entsprechende Variable im Then-Teil automatisch als von diesem Typ.

Ansonsten gibt es noch eine Reihe weiter Verbesserungen gegenüber Java, die aber C# auch schon enthalten sind, z.B. Properties statt getter und Erweiterungsmethoden. Andersherum gibt es aber eben auch eine Reihe von Verbesserungen, die (noch) nicht in C# enthalten sind, z.B. die oben genannten.

Die Motivation für die Entwicklung von Kotlin waren wohl genau solche Produktivitätsverbesserungen gegenüber Java.

In der nächsten c't gibt es den zweiten Teil des Artikels. Wenn dort weitere interessante Features vorgestellt werden, werde ich berichten.

Hat jemand von euch schon Erfahrungen mit Kotlin gesammelt? Und wenn ja, wie sind diese ausgefallen?

herbivore
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Die Funktion bzw. des switch und des if mit der Variable kommt in C# mit der nächsten Version ebenfalls.
Ist ja nur Syntax Zucker.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.986
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@herbivore
Danke für die Info.
Hatte total vergessen, dass heute/morgen die neue CT kommt.
Hol ich mir dann morgen mal und schau mir den Artikel an.
Klingt teilweise auch ganz gut.
Gerade das verbieten von null wäre bei manchen Stellen schon wünschenswert um Fehler besser abzufangen die im NullReferenceException enden.

Nachtrag:
Die Erweiterungsmethoden gibt es seit Java 8 auch schon.
Haben nur einen anderen Syntax/Namen als in C#
Dort heißen diese default Methods und erlauben entsprechende Erweiterungen, was auch teilweise schon in der API selbst gemacht wurde.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

F# bietet vieles ähnlich wie Kotlin an.
  • Statt null benutzt man in F# Options
  • Statt Switch benutzt man Pattern Matching (auch um Option Types auszupacken)
  • F# hat Type Inference

Kotlin wird für Google wegen Android gepusht.
Für FSharp am besten mal bei fsharpforfunandprofit schauen - das ist eine tolle Seite.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.986
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@weismat
F# ist eine Funktionale Programmiersprache und dürfte hier im Forum eher eine untergeordnete rolle spielen.
Mich würde aber interessieren wie weit verbreitet F# ist.
Hab bisher kaum was von der Sprache selbst gehört oder großartig gesehen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

F# ist nicht sehr verbreitet in Deutschland.
MS ist vor allem wegen jet.com an F# interessiert.
Es gibt halt klassische Domänen wie den Finanzbereich, die in Deutschland nicht so groß sind wie in London oder NYC, in denen es gerne eingesetzt wird. Mag vielleicht daran liegen, daß Mathematiker gerne funktionale Programmierung benutzen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Kurz als Vergleich:
Es gibt über 1500 Jobs in Stuttgart, die einen C# Entwickler suchen.
F#: Null (In Zahlen: 0).

Ich finde F# für viele Dinge spannend; aber es wird vermieden, weil die Ressourcen quasi nicht existent sind.
Leider finde ich aber auch, dass viele F# Evangelisten F# über alles stellen und wenig konstruktiv agieren - leider.
Sowas hilft einer Sprache nicht wirklich in Sachen Akzeptanz.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Zitat
generelles Verbot von null-Referenzen (das explizit aufgehoben werden kann und muss, um null zu verwenden)

Gabs die Idee nicht mal etwas anders für C#7?
Es war so gedacht, dass man eine Variable explizit als non-nullable deklarieren kann und die erlaubt dann nichts, was null ist oder sein könnte.

Ich kann's gerade nicht im VS2017 testen, aber wann ich das lese:
https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/
... finde ich nichts mehr dazu.

Wo ist der Gedanke geblieben?
Das würde einiges vereinfachen.
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Masse ist nicht gleich Klasse.
In Deutschland suchen gerade McKinsey und ThoughtWorks F# Entwickler.
Ich benutze es vor allem wegen der Type-Provider für CSV und XML. Da bin ich bedeutend schneller im Entwickeln als in C#.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Es gibt für jede Ansicht ein Spruch, weismat ;-)

Ja, F# ist für einige Dinge wirklich einfacher - aber es wird nicht der Weisheit letzter Schluss sein, wie es leider ganz oft auf Twitter und Co von bestimmten Leuten (teilweise wirklich Influencer) zu lesen ist.
Man liest ganz oft "F# ist immer besser als C#"; man liest "F# sei das bessere C#" - nicht wörtlich aber im Kontext; und das pauschal.
Und pauschal ist das halt nicht wahr, in keine Richtung.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,

mir wäre lieb, wenn wir den Ausflug in F# hier beenden und wieder zu Kotlin (und C#) zurückkehren könnten.


Hallo Palladin007,

ich weiß nicht, ob du vielleicht das meinst, was ich in C# 6 - Übersicht der Neuigkeiten vorgeschlagen hatte:
Zitat von herbivore
Der Null-conditional operator ist praktisch. Eigentlich sogar so praktisch, dass man überlegen könnte, das Verhalten zum Standard zu machen, wenn das denn nicht ein Beaking Change wäre. In den wenigen Fällen, in denen tatsächlich eine NullReferenceException geworfen werden soll, könnte man die "umgekehrte" Syntax einführen:

int length = customers!.Length;

Diesen Vorschlag habe ich aber nur auf myCSharp.de gemacht und nirgends eingereicht. Um zu verhindern, dass es ein Beaking Change wäre, könnte man das Default-Verhalten über eine neue Compiler-Option steuern. Ich vermute, dass sowas in C# trotzdem nicht kommt.

herbivore
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Dein Beispiel liefert int? und nicht int zurück.
Das ist so in C# 6 drin - bei mir wurde es sogar schon als Refactoring Tip angezeigt nachdem ich auf VS2017 umgestiegen bin.
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

@weismat

Das Beispiel funktioniert so gar nicht und wenn, dann würde es ein int liefern.

@hervibore

So eine Umstellung halte ich nicht für gut. Eine NullReferenceException kann man sehr leicht lokalisieren (wo ist das denn aufgetreten). Ein seltsames Ergebnis eher nicht.

Darum finde ich das bewusste Verwenden eines Null-Conditional-Operators richtiger.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Deaktiviertes Profil am .
private Nachricht | Beiträge des Benutzers
Torni
myCSharp.de - Member



Dabei seit:
Beiträge: 50

beantworten | zitieren | melden

Zitat von weismat
Statt null benutzt man in F# Options
...
Zitat von Abt
Kurz als Vergleich:
Es gibt über 1500 Jobs in Stuttgart, die einen C# Entwickler suchen.
F#: Null (In Zahlen: 0).
....


sorry, konnte ich mir nicht verkeifen :-)
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

@herbivore:

Ich meine sowas:

Man nehme eine Methode mit dem Operator:

void DoSomething(MyClass! obj)
{
    // ...
}

Dazu ein paar Nutzungen:

MyClass obj = new MyClass();
DoSomething(obj); // ok

// ====================

MyClass! obj = null; // Fehler
DoSomething(obj);

// ====================

MyClass! obj = new MyClass();
DoSomething(obj); // ok

// ====================

MyClass obj = null;
obj = new MyClass();
DoSomething(obj); // ok

// ====================

MyClass obj = null;
DoSomething(obj); // Fehler

// ====================

void Foo(MyClass obj)
{
    DoSomething(obj); // Fehler
}

// ====================

void Foo(MyClass obj)
{
    if (obj == null)
        throw new NullReferenceException();

    DoSomething(obj); // ok
}

// ====================

void Foo(MyClass obj)
{
    obj = obj ?? new MyClass();
    DoSomething(obj); // ok
}

// ====================

void Foo(MyClass! obj)
{
    DoSomething(obj); // ok
}

Sowas in der Art
Gerne auch nicht ganz so klug, hauptsache der Compiler verbietet mir, eine Variable zu nutzen, die null sein könnte.
Natürlich auch explizit, damit vorhandener Code weiterhin funktioniert. Bei neuem Code könnte dann aber der Compiler aufpassen, dass wir kein null haben.

Ich hab z.B. dort davon gelesen:
Kenneth Truyers: C# 7: New Features
Es gibt aber noch andere Quellen, aber alle älter.
Kann auch sein, dass die Idee nur zu beliebt war und ich sie daher für eine Idee von Microsoft gehalten habe.

Schade, weil mir hat die Idee gut gefallen
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Schau Dir mal Optional an - das ist ein Optional Implementierung auf Basis eines Structs (der als Value Type nicht null werden kann).
Vielleicht ist das etwas für Dich....
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von weismat am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo Sir Rufo,
Zitat
Das Beispiel funktioniert so gar nicht und wenn, dann würde es ein int liefern.
richtig!
Zitat
So eine Umstellung halte ich nicht für gut.
Der Vorschlag ist alt (um nicht zu sagen veraltet) und war auch damals nur ein Gedankenspiel im Zusammenhang mit der Einführung des Null-conditional operator in C#. Der Ansatz von Kotlin, null gar nicht erst zuzulassen, ist da tatsächlich viel konsequenter. Dann fliegt auch keine NRE, aber weil gar keine entstehen kann.


Hallo Palladin007,

ok, ich glaube, den Vorschlag kannte ich nicht. Hätte durchaus was für sich.

herbivore
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.829
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Palladin007,

du hast vermutlich C# 7 New Features: Non-Nullable references, Local Functions, Immutable Objects gemeint.

In Proposal for C# Non-Nullable Reference Types gibt es einen offiziellen Vorschlag dazu.

Schauen wir einmal ob (bin mir ziemlich sicher dass das kommt) und wie genau das eingeführt wird.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Genau diesen Feature-Wunsch meine ich - ich hab wohl überlesen, dass es "nur" ein Feature-Wunsch war.

Jetzt fällt mir aber auch auf, dass in dem von mir verlinkten Artikel folgendes steht:
Zitat
Update 22/07/2016: Non-nullable reference types are probably not coming in C# 7, but will have to wait until the next version (supposedly c# 8)

Wie sagt man so schön: Wer lesen kann ist klar im Vorteil :D
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.976

beantworten | zitieren | melden

Wenn man die Vorträge der diesjährigen Google Konferenz zu Kotlin anschaut fällt einem schon auf das sie in jedem 2. Satz sagen so wie in C#.

Habe jetzt auch ein Projekt in Kotlin angefangen ( Xamarin unterstützt ja leider keine MIPS prozessoren wie in meine Amazfit pace) und da ist schon einiges anders als in Java.
Ob das alles besser ist, naja, darüber lässt sich streiten.

Aber die IDE Unterstützung ist derzeit noch grottig, vor allem wenn man VS gewohnt ist, und die Beispiele sind leider auch noch recht rar gesät.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.105

beantworten | zitieren | melden

Freut mich dass ich nicht der einzige bin der neue Features gerne in einer bekannten Sprache sehen würde statt in jeweils einer eigenen neuen ;-)
Influencer ist ein gutes Wort. Ständig kommt was neues raus und natürlich ist das neue dann das beste. Dass sich die Entwicklergemeinde dagegen nicht wehrt wundert mich.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am .
private Nachricht | Beiträge des Benutzers
Rioma
myCSharp.de - Member



Dabei seit:
Beiträge: 228

beantworten | zitieren | melden

Wenn ich mich recht entsinne, gibt es eine Diskussion unter dem Titel: "Nullable reference types".

https://github.com/dotnet/csharplang/issues/36

https://github.com/dotnet/csharplang/blob/master/proposals/nullable-reference-types.md
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Rioma am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.976

beantworten | zitieren | melden

@chilic:
Ich denke bei Kotlin war es ein anderer Hintergrund.

Java wird von Oracle und einigen Konsortien "bestimmt", weshalb Neuerungen hier sehr langsam durchschlagen.
Bei C# ist es nur MS das die Richtung und Implementierung vornehmen, also geht einiges schneller.

Aber Kotlin ist von Google aus einem anderen Grund mit offenen Armen aufgenommen worden.
Oracle America, Inc. v. Google, Inc.
private Nachricht | Beiträge des Benutzers
TBR
myCSharp.de - Member



Dabei seit:
Beiträge: 154

beantworten | zitieren | melden

Switch mit generellen bool'schen Ausdrücken ist doch schon in C#7 drinnen. Kurz: Pattern Matching.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,
Zitat von herbivore
In der nächsten c't gibt es den zweiten Teil des Artikels. Wenn dort weitere interessante Features vorgestellt werden, werde ich berichten.
ich hab den zweiten Teil schon vor einiger Zeit gelesen, eigentlich nur überflogen. Die dort vorgestellten Feature fand ich nicht so überzeugend, teilweise sogar unpassend bzw. kontraproduktiv. Ich habe aber nicht die Zeit gefunden das näher auszuführen. Falls jemand anders den zweiten Teil gelesen hat und darin Features gefunden hat, die er interessant fand, kann er das gerne schreiben.

herbivore
private Nachricht | Beiträge des Benutzers