C # frente a Kotlin

Cuando se trata de azúcar y funciones sofisticadas en lenguajes de programación, C # y Kotlin se encuentran entre las primeras opciones en mente. Dado que estos dos lenguajes ocupan nichos similares, es decir, están fuertemente tipados, recolectados de basura, son multiplataforma, usados ​​tanto en el backend como en el desarrollo móvil, hoy intentaremos comparar sus capacidades sintácticas y organizar una pequeña votación. Para que la comparación sea justa, consideraremos las últimas versiones de ambos idiomas. Haré una reserva sobre mi imparcialidad: me gustan igualmente los dos idiomas, están en continuo desarrollo y no se quedan atrás. Este artículo es un artículo de comparación, no un tutorial, por lo que se pueden omitir algunas posibilidades sintácticas corrientes.





Empecemos por el punto de entrada.

En C #, este papel lo desempeña el método principal estático o el método de punto de entrada de nivel superior, por ejemplo





using static System.Console;

WriteLine("Ok");
      
      



Kotlin necesita una función principal





fun main() = println("Ok")
      
      



De estos dos pequeños ejemplos, en primer lugar, se nota que en Kotlin puede omitir el punto y coma. Con un análisis más profundo, vemos que en C #, a pesar de la concisión del punto de entrada indicativo, los métodos estáticos en otros archivos aún deben estar empaquetados en una clase e importados explícitamente desde ella ( usando estática System.Console ), y Kotlin va más y le permite crear funciones completas ...





Declaración de variables

En C #, el tipo se escribe a la izquierda y la nueva palabra clave se usa para crear una instancia. Hay una palabra especial var, que puede reemplazar el nombre del tipo a la izquierda. Sin embargo, las variables dentro de los métodos en C # siguen siendo susceptibles de reasignación.





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