Quando se trata de recursos sofisticados e sofisticados em linguagens de programação, C # e Kotlin estão entre as primeiras opções em mente. Como essas duas linguagens ocupam nichos semelhantes, ou seja, são fortemente tipadas, coletadas no lixo, multiplataforma, utilizadas tanto no backend quanto no desenvolvimento móvel, hoje vamos tentar comparar suas capacidades sintáticas e fazer uma pequena votação. Para tornar a comparação justa, consideraremos as versões mais recentes de ambos os idiomas. Farei uma ressalva quanto à minha imparcialidade: gosto igualmente dos dois idiomas, estão em contínuo desenvolvimento e não ficam para trás. Este artigo é um artigo de comparação, não um tutorial, portanto, algumas possibilidades sintáticas comuns podem ser omitidas.
Vamos começar no ponto de entrada
Em C #, essa função é desempenhada pelo método estático principal ou de ponto de entrada de nível superior, por exemplo
using static System.Console;
WriteLine("Ok");
Kotlin precisa de uma função principal
fun main() = println("Ok")
A partir desses dois pequenos exemplos, em primeiro lugar, é notável que em Kotlin você pode omitir o ponto-e-vírgula. Com uma análise mais profunda, vemos que em C #, apesar da concisão do ponto de entrada indicativo, os métodos estáticos em outros arquivos ainda precisam ser agrupados em uma classe e importados explicitamente dela ( usando System.Console estático ), e Kotlin vai ainda mais e permite que você crie funções completas ...
Declarando Variáveis
Em C #, o tipo é escrito à esquerda e a nova palavra-chave é usada para criar uma instância. Existe uma palavra especial var, que pode substituir o nome do tipo à esquerda. No entanto, as variáveis dentro dos métodos em C # permanecem suscetíveis a reatribuição.
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 .