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 .