{"id":23449677,"url":"https://github.com/gnobroga/c-sharp","last_synced_at":"2025-09-09T21:33:42.605Z","repository":{"id":215650769,"uuid":"738452990","full_name":"GNobroga/C-Sharp","owner":"GNobroga","description":"Contém informações sobre as novidades do C# e experiências que encontro ao longo da vida relacionadas à linguagem e ao ecossistema .NET.","archived":false,"fork":false,"pushed_at":"2024-02-15T16:44:28.000Z","size":25,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-01T08:03:52.250Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GNobroga.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-01-03T09:06:43.000Z","updated_at":"2024-02-05T12:07:14.000Z","dependencies_parsed_at":"2024-02-03T16:31:49.621Z","dependency_job_id":"8850b9ad-a4b9-46a6-bb5a-7d31ab18a35e","html_url":"https://github.com/GNobroga/C-Sharp","commit_stats":null,"previous_names":["gnobroga/novidadesc-sharp_12","gnobroga/c-sharp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/GNobroga/C-Sharp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GNobroga%2FC-Sharp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GNobroga%2FC-Sharp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GNobroga%2FC-Sharp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GNobroga%2FC-Sharp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GNobroga","download_url":"https://codeload.github.com/GNobroga/C-Sharp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GNobroga%2FC-Sharp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274366427,"owners_count":25272294,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-09T02:00:10.223Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-23T23:28:44.759Z","updated_at":"2025-09-09T21:33:42.584Z","avatar_url":"https://github.com/GNobroga.png","language":"C#","readme":"# Novidades C# 12 e Formas de otimizar o código\n\n### Logs\n\nNo ASP NET não é mais necessário injetar interface ILogger para se obter uma instância de Logger, agora é possível\nutilizar **Attribute**.\n\nExemplo:\n\n```cs\n    public static partial class Log \n    {\n        [LoggerMessage(EventId = 0, Level = LogLevel.Error, Message = \"An error occurred\")]\n        public static partial Error(this ILogger, string YourMessage);\n    }\n```\n\n### Conditions\n\nAgora é possível fazer condições utilizando um nível mais elevado de sintaxe.\n\n```cs\n    if (score is \u003e= 60 and \u003c= 100)\n    {\n        Console.WriteLine(\"Make Something\");\n    }\n```\n\n### Primary Constructors\n\nEssa funcionalidade permite utilizar uma classe de forma semelhante a um record. \n\nObs: Como é um construtor primário é permitido utilizar ele pra injetar dependências.\n\n```cs\n    public class PrimaryConstructor(string arg1, string arg2)\n    {\n        public string ArgUpper =\u003e arg1.ToUpper();\n        public string ArgLower =\u003e arg2.ToLower();\n    }\n```\n\n\n### Spread Operator\n\nAssim como no JavaScript, agora no C# é possível utilizar o operador spread que é denotado com **..**. Além disso,\numa nova forma de se declarar Arrays e Lists surgiu que usando o **[]**.\n\n\n```cs\n    List\u003cstring\u003e names = [\"Gabriel\", \"Lívia\", \"Children\"];\n\n    List\u003cstring\u003e expandFamily = [..names, \"Claudio\", \"José\", \"Wilson\", \"Chimbinha\"];\n```\n\n### Random\n\nDentro da classe Random tem a classe **Shared** que contém métodos generics úteis para randomificação distribuída.\n\n**Shuffle** - Permite embaralhar um Array (Apenas Array)\n\n```cs\n    string[] names = [\"Gabriel\", \"Lívia\", \"Children\"];\n\n    Random.Shared.Shuffle(names);\n\n    Array.ForEach(names, Console.WriteLine);\n```\n\n**GetItems** - Permite obter elementos de um Enumerable de forma aleatória.\n\n```cs\n    string[] names = [\"Gabriel\", \"Lívia\", \"Children\"];\n\n    Array.ForEach(Random.Shared.GetItems(names, 2), Console.WriteLine);\n```\n\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD:RADME.md\n\n#### Otimization Comparison\n\n```cs\n    public bool TheNamesIsSimilar(string first, string second)\n    {\n        return string.Equals(first, second, StringComparsion.OrdinalIgnoreCase);\n    }\n```\n\n\n### Null Condition Operator\n\nPermite navegar sobre propriedades de um objeto que pode ser nulo, mas sem gerar Exception. Isso evita a utilização de **If** desnecessários.\n\n```cs\n    customer?.Orders?.Ship();\n```\n\n### Null Argument Checks \n\n**ArgumentNullException** é uma classe que contém metódos pra validar objetos nulos.\n\n\n```cs\n    public void MapTo \u003cT\u003e (T source) where T: class\n    {\n        ArgumentNullException.ThrowIfNull(source);\n    }\n```\n\n### Parallel ForEach Loop\n\nPermite executar um loop ForEach de forma assincrona, dividindo em threads, muito útil para operações custosas.\n\n```cs\n   List\u003cstring\u003e paths = GetFilePathList();\n\n   Parallel.ForEach(paths, CompressFile);\n```\n\n### Cancel Tasks \n\nNo 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.\n\n```cs\n\n    CancellationTokenSource tokenSource = new()/\n    CancellationToken token = tokenSource.Token;\n\n    Task task = Task.Run(async () =\u003e \n    {\n        await using var reader = new(\"./file.txt\");\n\n        while (reader.ReadLine() is {} line \u0026\u0026 !token.IsCancellationRequested)\n        {\n            Console.WriteLine(line);\n        }\n        \n    }, token);\n\n```\n\n### Attributes Validation\n\nAlguns atributos de validação de model, muito bom como alternativa do RegexExpression.\n\n```cs\n\npublic readonly record struct Product (\n    [Base64String]\n    string Name;\n    [DaniedValues(\"Eletronic\", \"Clean\")]\n    string Category;\n    [AllowedValues(\"Brazil\", \"Castelo\")]\n    string Location;\n);\n\n```\n\n### Alias with using directive\n\nPermite 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.\n\nExemplo:\n\n```cs\n    using Point3D = string; // Dando um alias para string\n\n    Point3D point = \"Hello world\";\n\n```\n\n### Collection Expression\n\nÉ uma forma mais simples de se inicializar coleções do tipo, arrays, spans, ReadonlySpan e lists\n\n```cs\n    int[] numeros = [1, 2, 3, 4, 5];\n\n    Span\u003cstring\u003e regiaoSul = [\"pr\", \"sc\"];\n\n    ReadOnlySpan\u003cstring\u003e regiaoSuldeste = [\"es\", \"mg\", \"rj\", \"sp\"];\n\n    List\u003cstring\u003e frutas = [\"Maçã\", \"Pera\"];\n```\n\n\n### Default values for lambda expression\n\nPodemos definir agora valores padrões pra funções anônimas\n\n```cs\n    var increment = (int origem, int quantificador = 10) =\u003e origem * quantificador;\n```\n\n\n### Explicit operator\n\nIsso já existia em versões antigas\n\n```cs\n\n    public class Fish (string type) \n    {\n        public string Type { get; private set; } = type;\n\n        public static explicit operator int (Fish instance) =\u003e instance.GetHashCode();\n    }\n\n    var fish = new Fish(\"Morcego\");\n\n    var castToInt = (int) fish;\n```\n\n### Property Pattern\n\nPermite fazer validações utilizando o padrão de property, as condições de cada propriedade representa uma operação \u0026\u0026\n\n```cs\n    if (product is { Category: \"books\", Price: \u003e 100 })\n    {\n        Console.WriteLine(\"This is truth\");\n    }\n```\n\n### in method\n\nAgora 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.\n\n\n```cs\n    void Fnc(in Product prod)\n    {\n        prod.Name = \"Smartphone\";\n    }\n```\n\n### Operador ??=\n\nEsse operador permite atribuir valor a uma variável nula caso ela esteja com valor nulo, caso contrário, não será atribuído nada.\n\n```cs\n    string? name = null;\n    string initialName = \"Gabriel Cardoso\"\n\n    name ??= initialName; \n\n    Console.Writeline(name); // Output: Gabriel Cardoso\n```\n\n\n[Veja mais](/Markdowns/More.md)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgnobroga%2Fc-sharp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgnobroga%2Fc-sharp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgnobroga%2Fc-sharp/lists"}