プログラミング言語の糖分や凝った機能に関して言えば、C# と Kotlin が最初に頭に浮かぶ選択肢の 1 つです。これら2つの言語は同様のニッチを占めています. 比較を公平にするために、両方の言語の最新バージョンを考慮します。私はどちらの言語も等しく気に入っています。どちらの言語も絶え間なく発展しており、お互いに遅れをとることはありません。この記事は比較記事であり、チュートリアルではないため、ありきたりな構文の可能性は省略される場合があります。
まずはエントリーポイントから
C# では、この役割は静的な Main またはトップレベルのエントリ ポイント メソッドによって実行されます。
using static System.Console;
WriteLine("Ok");
Kotlin には main 関数が必要です
fun main() = println("Ok")
これらの小さな 2 つの例から、まず、Kotlin ではセミコロンを省略できることがわかります。さらに詳しく分析すると、C# では、指標となるエントリ ポイントが簡潔であるにもかかわらず、他のファイルの静的メソッドをクラスにラップし、そこから (静的 System.Console を使用して) 明示的にインポートする必要があることがわかります。さらに、本格的な機能を作成できます...
変数の宣言
C#では左側に型を書き、インスタンスの作成にはnewキーワードを使います。左側の型名を置き換えることができる特別な単語 var があります。ただし、C # のメソッド内の変数は、再割り当ての影響を受けやすいままです。
Point y = new(0, 0);
var x = new Point(1, 2);
x = y; //
Kotlin , . var, val . new.
val y: Point = Point(0, 0)
val x = Point(1, 2)
x = y // !
C# ( ) ( ) . .
'==' , , . .
// ,
struct ValueType {}
// ,
class ReferenceType {}
Kotlin, . '==' , '==='. , , Int, Char, Double, jvm , . .NET , Kotlin , / .
Null safety
C# ( 8 ) null. !
var legalValue = maybeNull!;
// legalValue null,
// exception
Kotlin null ,
val legalValue = maybeNull!!
// maybeNull == null,
// exception
C# get/set, . .
class Example
{
// backing field
public string Name1 { get; set; } = "Pre-calculated expression";
//
public string Name2 => "Calculated now";
//
private const string Name3 = "Field";
}
Kotlin , , . , C#, public , . , set , var/val.
class Example {
// backing field
val name1 = "Pre-calculated expression"
//
val name2 get() = "Calculated now"
}
C# record , , ( ):
class JustClass
{
public string FirstName { init; get; }
public string LastName { init; get; }
}
record Person(string FirstName, string LastName);
...
Person person1 = new("Nancy", "Davolio");
Person person2 = person1 with { FirstName = "John" };
Kotlin data class
class JustClass(val firstName: String, val lastName: String)
data class Person(val firstName: String, val lastName: String)
...
val person1 = Person("Nancy", "Davolio")
val person2 = person1.copy(firstName = "John")
C# , this
static class StringExt
{
public static Println(this string s) => System.Console.WriteLine(s)
public static Double(this string s) => s + s
}
Kotlin , . ,
fun String.println() = println(this)
fun String.double get() = this * 2
C# =>
numbers.Any(e => e % 2 == 0);
numbers.Any(e =>
{
// ...
return calculatedResult;
})
Kotlin - , . DSL (Gradle + Kotlin ).
numbers.any { it % 2 == 0 }
numbers.any {
// ...
calculatedResult
}
C# pattern matching c ( )
static Point Transform(Point point) => point switch
{
{ X: 0, Y: 0 } => new Point(0, 0),
{ X: var x, Y: var y } when x < y => new Point(x + y, y),
{ X: var x, Y: var y } when x > y => new Point(x - y, y),
{ X: var x, Y: var y } => new Point(2 * x, 2 * y),
};
Kotlin switch when, , , , :
fun transform(p: Point) = when(p) {
Point(0, 0) -> Point(0, 0)
else -> when {
p.x > p.y -> Point(...)
p.x < p.y -> Point(...)
else -> Point(...)
}
}
. . Kotlin-way , , C# . Kotlin C# , C# Microsoft .