Dart para Desenvolvedores C#

Dart, a linguagem de programação multiplataforma da Google por trás do Flutter vista sob a ótica de um desenvolvedor C#.

Dart para Desenvolvedores C#

Por mais que o título seja “para desenvolvedores C#”, a reciprocidade é verdadeira, ou seja, desenvolvedores Dart também terão uma ideia de C#.

Esse artigo é uma evolução e continuidade de Flutter para Desenvolvedores .NET, porém mais focado na linguagem de programação e não apenas no framework.

Da mesma forma que o C#, com Dart é possível criar aplicações para Web, Mobile e Desktop.

DESIGN PATTERNS Programação no Mundo Real

A primeira vista, a sintaxe de Dart é parecido com Javascript, Java, NodeJS e com o próprio C#.


Dart e suas Plataformas

Com Dart é possível criar aplicações para Web, mobile, desktop, command-line e até aplicações para servidor. Para isso basta escolher entre as plataformas Dart Native ou Dart Web.

Assim como o Flutter, Dart possui uma documentação rica em exemplos incluindo CodeLabs.

A Google usa Dart em alguns de seus produtos como Google AdSense, Elections e Shopping Express.

Essa linguagem de programação pode ser usada tranquilamente no Visual Studio Code, para isso basta instalar o extension correspondente.

Abaixo comparo algumas funcionalidades entre essas duas linguagens que julgo ser interessante.

Nos exemplos, sempre mostrarei o código C# primeiro e depois o código Dart.


Extension methods

Uma das coisas que gosto de criar são Extension Methods.

public static class NumberParsing
{
    public static int ParseInt(this string value)
    {
        return int.Parse(value);
    }
}
extension NumberParsing on String {
  int parseInt() {
    return int.parse(this);
  }
}

Falando em classes, no Dart é necessário explicitar a palavra-chave “extension” e dizer o tipo de dados que está sendo extendido “on String“. Em contra partida, no C# é necessário que a classe seja estática “static class“.

Referente ao método em si, ainda é preciso usar a palavra-chave “this” referenciando ao tipo “String” definido anteriormente, enquanto no C#this” é usado como parâmetro no método.

Como pode ver a sintaxe é tranquila, nada muito diferente do C#.

Vale ressaltar apenas a questão da identação, capitalização e quebras de linha, que nesse caso é praticamente igual ao Javascript.


String Interpolation

Uma das coisas interessantes no C# é a interpolação de strings, uma forma de formatar e concatenar textos.

var name = "Fabio";
var lastName = "Silva Lima";
var text = $"My name is {name} and my last name is {lastName}. Sum {2 + 2}";
var name = "Fabio";
var lastName = "Silva Lima";
var text = "My name is $name and my last name is $lastName. Sum {2 + 2}";

A string interpolation na linguagem da Google parece ser mais simples que no C#, basta adicionar o “$” nas variáveis que desejar fazer a substituição. Porém, ainda funciona a questão de abrir/fechar chaves para algo mais complexo.

Inclusive como padrão de design, a Google não recomenda o uso das chaves.


Generics

O que seria a programação hoje em dia se não fosse o Generics?

var names = new List<string>();
names.Add("Fabio");
names.Add("Thomas");
var names = List<String>();
names.add("Fabio");
names.add("Thomas");

Na boa, não precisa de comentários, é exatamente igual salvo que no Dart não é necessário explicitar o operador “new“.

A questão de criar classes genéricas é exatamente igual, dá uma olhada:

abstract class Cache<T> {
  T GetCache(string key);
  void SetCache(string key, T value);
}
abstract class Cache<T> {
  T getCache(String key);
  void setCache(String key, T value);
}

Podemos ver que a capitalização segue padrões praticamente iguais aqueles adotados a Javascript/Typescript.

Não foi em vão usar o exemplo acima sobre Cache. Citei para fazer um gancho sugerindo meu artigo Crie seu Framework em ASP.NET CORE 3 e Blazor, que possui um módulo genérico completo sobre Cache em .NET Core.


Async/Await

Chegamos a um ponto interessante, a chamada de métodos assíncronos usando os operadores async e await.

public async Task<string> GetNameAsync()
{
    return await _repository.GetNameByIdAsync(1);
}

// call
var name = await GetNameAsync();
Future<String> getNameAsync() async {
  return await _repository.getNameByIdAsync(1);
}

// call
var name = await getNameAsync();

Analogicamente podemos dizer que o Task do C#, é o Future no Dart.

Além de Future, podemos usar o Stream para encapsular o resultado, muito similar o que fazemos no Vue ou Angular, usando o objeto Promise.

Com Future é possível verificar seu conteúdo de modo seguro e alternar entre sucesso ou erro conforme exemplo Dart abaixo:

// Dart
var name = await wf.getNameAsync().then((name) => name + ' FSL').catchError((e) => 'Error!');

Usando a função then() é onde podemos manipular o valor que será retornando, e na função catchError(), usamos para tratar possíveis exceções no método getNameAsync().


Herança

Usando como exemplo duas classes de pagamento, uma básica e outra específica de cartão de crédito, fica fácil perceber a semelhança entre essas duas linguagens.

A curva de aprendizado é muito rápida.

public abstract class Payment
{
    public virtual void Pay()
    {

    }
}

public class CreditCardPayment : Payment
{
    public override void Pay()
    {

    }
}
abstract class Payment {
  void pay() {

  }
}

class CreditCardPayment extends Payment {
  @override
  void pay() {

  }
}

Enquanto uma linguagem usa o símbolo “:” para herança, a outra usa a keyword “extends“.

Apenas um complemento sobre esse exemplo, para acessar o método Pay da classe básica no C# basta usar base.Pay(), enquanto no Dart é super.pay().


Interfaces

Essa parte de interfaces pode ser um pouco confusa caso você nunca tenha visto TypeScript, NodeJS ou alguns outros frameworks frontend.

Primeiro vou mostrar um exemplo de código.

public interface IPayment
{
    public void Pay();
}

public class CreditCardPayment : IPayment
{
    public void Pay()
    {

    }
}
class Payment {
  void pay() {

  }
}

class CreditCardPayment implements Payment {
  void pay() {

  }
}

Na linguagem usada no Flutter, a diferença que entre uma classe e uma interface é na sua usabilidade, se usar extends é classe, e se usar implements é interface.

Assim como no C#, pode-se usar mais de uma interface.


Considerações finais

Todos os exemplos desse artigo foram criados através de uma IDE chamada DartPad.

Nesse artigo eu trouxe o que há de mais interessante entre essas duas linguagens de programação.

É claro que existem coisas totalmente diferentes, mas para ter uma noção está muito bom rss.

E aí, você tem algo a comentar sobre semelhanças e diferenças entre C# e Dart?

Comenta aí! Muito obrigado e até a próxima 🙂

Sobre o Autor:
Trabalha como arquiteto de soluções e desenvolvedor, tem mais de 18 anos de experiência em desenvolvimento de software em diversas plataformas sendo mais de 16 anos somente para o mercado de seguros.
Revisado por:
Apaixonado por tecnologia e sempre disposto a encarar novos desafios, atualmente trabalho focado em aplicações web e mobile com a plataforma .NET, e me aventurando nas diversas linguagens, desafios e experiências que a área nos proporciona.