日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

初識(shí) C# 源代碼生成器,編寫代碼的代碼

admin
2025年1月3日 21:8 本文熱度 1257

前言

嗨,大家好!

今天我們來聊一聊 C# 里的源代碼生成器,一個(gè)有趣的代碼生成工具。

源代碼生成器(Source Generators)是 C# 9.0 引入的一項(xiàng)強(qiáng)大功能,允許你在編譯時(shí)動(dòng)態(tài)生成源代碼。

這意味著,你可以編寫代碼來自動(dòng)生成其他代碼,從而減少手動(dòng)重復(fù)的工作。

這個(gè)過程在編譯階段發(fā)生,生成的代碼會(huì)在編譯輸出中包含,從而使你的類庫(kù)或應(yīng)用程序更輕便、更可維護(hù)。

首先我們通過一個(gè) Step By Step 例子來感受一下它的魅力吧!

Step By Step 例子

我們來創(chuàng)建一個(gè)源生成器,它可以自動(dòng)為一個(gè)類生成一個(gè) ToString 方法,方便快速打印統(tǒng)一的對(duì)象信息

1. 創(chuàng)建項(xiàng)目

  • 在 Visual Studio 2022 IDE 中,創(chuàng)建一個(gè)新的類庫(kù)項(xiàng)目,命名為 SourceGen

  • 選擇 .NET Standard 2.0 版本,如圖:

2. 添加 NuGet 包

<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />

注意:

  1. 不要選擇太高的版本,否則可能會(huì)出現(xiàn)編譯器版本太高的問題,比如:

    分析器程序集“...”引用了編譯器的版本 “4.12.0.0”,該版本高于當(dāng)前正在運(yùn)行的版本 “4.8.0.0”
  2. 包 Microsoft.CodeAnalysis.CSharp 已經(jīng)包含了 Microsoft.CodeAnalysis.Analyzers,所以無需繼續(xù)添加此包

3. 配置 EnforceExtendedAnalyzerRules 規(guī)則

打開項(xiàng)目文件 SourceGen.csproj,在 PropertyGroup 節(jié)點(diǎn)下手動(dòng)增加 EnforceExtendedAnalyzerRules 配置,如圖:

4. 創(chuàng)建源生成器

在項(xiàng)目中,創(chuàng)建一個(gè)新的類文件,命名為 ToStringGenerator.cs,并編寫以下代碼:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespaceSourceGen
{
    [Generator]
    publicclassToStringGenerator : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            var syntaxTrees = context.Compilation.SyntaxTrees;

            foreach (var tree in syntaxTrees)
            {
                var root = tree.GetRoot();
                var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();

                foreach (var classDeclaration in classes)
                {
                    // 獲取類名
                    var className = classDeclaration.Identifier.Text;
                    // 獲取類成員
                    var properties = classDeclaration.Members.OfType<PropertyDeclarationSyntax>();
                    var propertiesList = string.Join(", ", properties.Select(p => $"{p.Identifier.Text} = {{{p.Identifier.Text}}}"));

                    // 寫 ToString 方法
                    // 注意這里用了 partial 修飾符
                    var toStringMethod = $@"
public partial class {className} {{
    public override string ToString() => ""{className} {{{propertiesList}}}"";
}}
                "
;
                    context.AddSource($"{className}_ToString.g.cs", SourceText.From(toStringMethod, Encoding.UTF8));
                }
            }
        }

        public void Initialize(GeneratorInitializationContext context)
        {
            // 可以在這里初始化任何需要的對(duì)象或資源
        }
    }
}

編譯一下確定代碼沒問題。

5. 創(chuàng)建新控制臺(tái)項(xiàng)目

在解決方案中,添加一個(gè)新的控制臺(tái)項(xiàng)目,命名為 SourceGeneratorSample

6. 引用源代碼生成器項(xiàng)目 SourceGen

注意,引用后,需要打開 SourceGeneratorSample.csproj,修改項(xiàng)目引用節(jié)點(diǎn)內(nèi)容,添加 OutputItemType 和 ReferenceOutputAssembly 配置:

<ProjectReference Include="..\SourceGen\SourceGen.csproj" 
                OutputItemType="Analyzer" 
                ReferenceOutputAssembly="false" />

7. 定義一個(gè)類

在 SourceGeneratorSample 項(xiàng)目中,創(chuàng)建一個(gè)簡(jiǎn)單的類,例如 Person

public partial class Person
{
    public string? Name { getset; }
    public int Age { getset; }
}

注意:

  1. 不要放在任何命名空間下

  2. 使用 partial 修飾符

8. 使用源代碼器生成的方法

在 Program.cs 文件中,創(chuàng)建一個(gè) Person 實(shí)例對(duì)象并打印它的 ToString

var person = new Person { Name = "Alice", Age = 30 };
Console.WriteLine(person.ToString()); 

9. 運(yùn)行

按 Ctrl+F5 編譯并運(yùn)行程序,你會(huì)在控制臺(tái)看到如下圖輸出:

優(yōu)勢(shì)與劣勢(shì)

在上面的例子里,我們?yōu)轫?xiàng)目中所有的類統(tǒng)一了 ToString 方法的輸出,從中我們可以看出一些源代碼生成器的優(yōu)勢(shì)和劣勢(shì):

優(yōu)勢(shì)

  1. 減少重復(fù)勞動(dòng):源代碼生成器可以自動(dòng)生成一些繁瑣的重復(fù)性代碼,特別是那些不變的基本數(shù)據(jù)結(jié)構(gòu)或方法,比如數(shù)據(jù)傳輸對(duì)象(DTO)或?qū)嶓w類。

  2. 提高代碼一致性:生成的代碼遵循預(yù)設(shè)的邏輯,可以更好地保持一致性,減少了人為錯(cuò)誤

  3. 保持代碼整潔:將生成的代碼與手寫的代碼分開,主代碼會(huì)顯得更加清晰易讀

劣勢(shì)

  1. 編譯時(shí)錯(cuò)誤難以調(diào)試:因?yàn)榇a是在編譯階段生成的,如果生成的代碼有問題,定位和修復(fù)會(huì)相對(duì)比較困難

  2. 學(xué)習(xí)成本:源代碼生成器的概念和使用方式跟傳統(tǒng)開發(fā)方式差別比較大,需要一定的學(xué)習(xí)時(shí)間來掌握其使用方法

  3. 可能增加復(fù)雜性:源代碼生成器的實(shí)現(xiàn)需要對(duì)語法樹有深入的理解,這可能增加開發(fā)的復(fù)雜性。

  4. 版本兼容性:如果使用的源生成器依賴于特定版本的編譯器或框架,升級(jí)時(shí)可能會(huì)有兼容性的問題

總結(jié)

隨著 .NET 8 的發(fā)布,源代碼生成器這一強(qiáng)大特性也逐漸走進(jìn)了更多程序員的視野。

相比傳統(tǒng)的 T4 模板等代碼生成工具,源代碼生成器的最大魅力在于它能在編譯時(shí)動(dòng)態(tài)生成代碼。

這意味著你生成的代碼能立刻融入項(xiàng)目中,無需反復(fù)編譯,就像魔法一樣——寫完代碼馬上就能看到結(jié)果,大大提升了開發(fā)效率。

不過,任何好東西都有它的 “小脾氣”,源代碼生成器也不例外,有時(shí)候調(diào)試它很讓人抓狂,特別是如果你對(duì)語法樹不太熟悉的話,剛開始接觸時(shí),可能會(huì)覺得有點(diǎn)棘手,需要花點(diǎn)時(shí)間去適應(yīng)和學(xué)習(xí)。

所以呢,要不要在你的項(xiàng)目里引入這個(gè)強(qiáng)大的特性,其實(shí)取決于具體情況。如果你的項(xiàng)目適合并且你能接受一點(diǎn)初期的學(xué)習(xí)成本,那么源代碼生成器絕對(duì)會(huì)讓你的開發(fā)體驗(yàn)煥然一新。但如果項(xiàng)目時(shí)間緊迫或團(tuán)隊(duì)成員對(duì)它還不夠熟悉,可能就需要再三考慮一下啦。


該文章在 2025/1/6 10:15:30 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

成人小说综合影院| 91 视频三级| 日韩激情久久久久久| 国产18黄色| 黄色av久| 午夜福利多人淫乱| 欧美一级日韩A| c725国产精品| 不卡一区二区三区免费| 色综合综合| 火爆一区二区三区| 久久久久高| 老少配性爱高潮1区2区| 欧美日韩内射一区| 国内剧情激情在线| 欧美日韩亚熟一区| 久久精品人人| 国产日韩群乱交| 日木不卡区二区三区高清| 欧美精品美女综合| 一级欧美一级| 五月婷婷大香蕉天天射| 天天射天天干国产无码免费| 久久www久久黄片| 国产精品福利在线观看免费不卡| 丝袜导航 国产区| 白嫩极品在线| 国产精品露脸射了| 人妻AV鲁丝一区二区三区精品| 成人黄色三级小说| 宗合一区二区三区| 叫少妇网站| 天天日天天干天天插天天添天天柔 | 亚洲网大香蕉| avhuang在线| 白丝袜AV观看| 91熟女高潮| 日韩久久蜜臀AV| 中文字幕熟妇久久久人妻| a欧美一区二| 麻豆三级播放|