Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/gnobroga/c-sharp
Contém informações sobre as novidades do C# e experiências que encontro ao longo da vida relacionadas à linguagem e ao ecossistema .NET.
https://github.com/gnobroga/c-sharp
Last synced: 14 days ago
JSON representation
Contém informações sobre as novidades do C# e experiências que encontro ao longo da vida relacionadas à linguagem e ao ecossistema .NET.
- Host: GitHub
- URL: https://github.com/gnobroga/c-sharp
- Owner: GNobroga
- Created: 2024-01-03T09:06:43.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2024-02-15T16:44:28.000Z (11 months ago)
- Last Synced: 2024-04-09T15:11:51.733Z (9 months ago)
- Language: C#
- Homepage:
- Size: 24.4 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Novidades C# 12 e Formas de otimizar o código
### Logs
No ASP NET não é mais necessário injetar interface ILogger para se obter uma instância de Logger, agora é possível
utilizar **Attribute**.Exemplo:
```cs
public static partial class Log
{
[LoggerMessage(EventId = 0, Level = LogLevel.Error, Message = "An error occurred")]
public static partial Error(this ILogger, string YourMessage);
}
```### Conditions
Agora é possível fazer condições utilizando um nível mais elevado de sintaxe.
```cs
if (score is >= 60 and <= 100)
{
Console.WriteLine("Make Something");
}
```### Primary Constructors
Essa funcionalidade permite utilizar uma classe de forma semelhante a um record.
Obs: Como é um construtor primário é permitido utilizar ele pra injetar dependências.
```cs
public class PrimaryConstructor(string arg1, string arg2)
{
public string ArgUpper => arg1.ToUpper();
public string ArgLower => arg2.ToLower();
}
```### Spread Operator
Assim como no JavaScript, agora no C# é possível utilizar o operador spread que é denotado com **..**. Além disso,
uma nova forma de se declarar Arrays e Lists surgiu que usando o **[]**.```cs
List names = ["Gabriel", "Lívia", "Children"];List expandFamily = [..names, "Claudio", "José", "Wilson", "Chimbinha"];
```### Random
Dentro da classe Random tem a classe **Shared** que contém métodos generics úteis para randomificação distribuída.
**Shuffle** - Permite embaralhar um Array (Apenas Array)
```cs
string[] names = ["Gabriel", "Lívia", "Children"];Random.Shared.Shuffle(names);
Array.ForEach(names, Console.WriteLine);
```**GetItems** - Permite obter elementos de um Enumerable de forma aleatória.
```cs
string[] names = ["Gabriel", "Lívia", "Children"];Array.ForEach(Random.Shared.GetItems(names, 2), Console.WriteLine);
```
<<<<<<< HEAD:RADME.md#### Otimization Comparison
```cs
public bool TheNamesIsSimilar(string first, string second)
{
return string.Equals(first, second, StringComparsion.OrdinalIgnoreCase);
}
```### Null Condition Operator
Permite navegar sobre propriedades de um objeto que pode ser nulo, mas sem gerar Exception. Isso evita a utilização de **If** desnecessários.
```cs
customer?.Orders?.Ship();
```### Null Argument Checks
**ArgumentNullException** é uma classe que contém metódos pra validar objetos nulos.
```cs
public void MapTo (T source) where T: class
{
ArgumentNullException.ThrowIfNull(source);
}
```### Parallel ForEach Loop
Permite executar um loop ForEach de forma assincrona, dividindo em threads, muito útil para operações custosas.
```cs
List paths = GetFilePathList();Parallel.ForEach(paths, CompressFile);
```### Cancel Tasks
No Javascript tem o **AbortController** no C# tem o **CancellationTokenSource** pra cancelar operações assincronas por meio de Task. Lembrando que isso não funciona com TaskValue, inclusive, isso é uma das diferenças entre utilizar Task e TaskValue.
```cs
CancellationTokenSource tokenSource = new()/
CancellationToken token = tokenSource.Token;Task task = Task.Run(async () =>
{
await using var reader = new("./file.txt");while (reader.ReadLine() is {} line && !token.IsCancellationRequested)
{
Console.WriteLine(line);
}
}, token);```
### Attributes Validation
Alguns atributos de validação de model, muito bom como alternativa do RegexExpression.
```cs
public readonly record struct Product (
[Base64String]
string Name;
[DaniedValues("Eletronic", "Clean")]
string Category;
[AllowedValues("Brazil", "Castelo")]
string Location;
);```
### Alias with using directive
Permite definir um alias para um tipo, namespace, etc, por exemplo, no C existe o **typedef** que permite dar um nome diferente para o tipo da struct. No C# é semelhante com o using.
Exemplo:
```cs
using Point3D = string; // Dando um alias para stringPoint3D point = "Hello world";
```
### Collection Expression
É uma forma mais simples de se inicializar coleções do tipo, arrays, spans, ReadonlySpan e lists
```cs
int[] numeros = [1, 2, 3, 4, 5];Span regiaoSul = ["pr", "sc"];
ReadOnlySpan regiaoSuldeste = ["es", "mg", "rj", "sp"];
List frutas = ["Maçã", "Pera"];
```### Default values for lambda expression
Podemos definir agora valores padrões pra funções anônimas
```cs
var increment = (int origem, int quantificador = 10) => origem * quantificador;
```### Explicit operator
Isso já existia em versões antigas
```cs
public class Fish (string type)
{
public string Type { get; private set; } = type;public static explicit operator int (Fish instance) => instance.GetHashCode();
}var fish = new Fish("Morcego");
var castToInt = (int) fish;
```### Property Pattern
Permite fazer validações utilizando o padrão de property, as condições de cada propriedade representa uma operação &&
```cs
if (product is { Category: "books", Price: > 100 })
{
Console.WriteLine("This is truth");
}
```### in method
Agora com o in é possível tornar um tipo como sendo imutável em questão de referência, ou seja, eu não consigo reatribuir o parâmetro prod para uma outra instância.
```cs
void Fnc(in Product prod)
{
prod.Name = "Smartphone";
}
```### Operador ??=
Esse operador permite atribuir valor a uma variável nula caso ela esteja com valor nulo, caso contrário, não será atribuído nada.
```cs
string? name = null;
string initialName = "Gabriel Cardoso"name ??= initialName;
Console.Writeline(name); // Output: Gabriel Cardoso
```[Veja mais](/Markdowns/More.md)