C#対コトリン

プログラミング言語の糖分や凝った機能に関して言えば、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 .








All Articles