一建防护还有脸出来叫 發表於 2024-7-24 22:08:00

C# 12 新增功能实操!

<h2 data-tool="mdnice编辑器">前言</h2>
<p data-tool="mdnice编辑器">今天咱们一起来探索并实践 C# 12 引入的全新功能!</p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">C#/.NET该如何自学入门?</span></span></li>
</ul>
<blockquote data-tool="mdnice编辑器">
<p>注意:使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。</p>
</blockquote>
<h2 data-tool="mdnice编辑器">主构造函数</h2>
<p data-tool="mdnice编辑器">主构造函数允许你直接在类定义中声明构造函数参数,并自动生成相应的属性。</p>
<h3 data-tool="mdnice编辑器">主构造函数参数的最常见用途包括:</h3>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>作为 base() 构造函数调用的参数。</li>
<li>初始化成员字段或属性。</li>
<li>引用实例成员中的构造函数参数。</li>
</ul>
<h3 data-tool="mdnice编辑器">代码示例</h3>
<p data-tool="mdnice编辑器"><strong>将任何参数放在类型名称后面的括号中:</strong></p>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;CSharp12GrammarExercise<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;OutputPrint()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;person&nbsp;=&nbsp;new&nbsp;Person("追逐时光者",&nbsp;30);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine($"{person.Name},&nbsp;{person.Age}");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;Person(string&nbsp;name,&nbsp;int&nbsp;age)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;Name&nbsp;=&gt;&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;Age&nbsp;=&gt;&nbsp;age;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></code></span></pre>
<p data-tool="mdnice编辑器"><strong>以下代码初始化从主构造函数参数计算的两个只读属性:</strong></p>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;CSharp12GrammarExercise<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;OutputPrint()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建&nbsp;Distance&nbsp;结构体实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Distance&nbsp;distance&nbsp;=&nbsp;new&nbsp;Distance(10,&nbsp;55);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;访问&nbsp;Magnitude&nbsp;和&nbsp;Direction&nbsp;属性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine($"Magnitude:&nbsp;{distance.Magnitude},Direction:&nbsp;{distance.Direction}");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;readonly&nbsp;struct&nbsp;Distance(double&nbsp;dx,&nbsp;double&nbsp;dy)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;readonly&nbsp;double&nbsp;Magnitude&nbsp;{&nbsp;get;&nbsp;}&nbsp;=&nbsp;Math.Sqrt(dx&nbsp;*&nbsp;dx&nbsp;+&nbsp;dy&nbsp;*&nbsp;dy);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;readonly&nbsp;double&nbsp;Direction&nbsp;{&nbsp;get;&nbsp;}&nbsp;=&nbsp;Math.Atan2(dy,&nbsp;dx);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></code></span></pre>
<h2 data-tool="mdnice编辑器">集合表达式</h2>
<p data-tool="mdnice编辑器">集合表达式引入了一种新的简洁语法,用于创建常用集合值。可以使用展开运算符(..)将其他集合内联到这些值中。</p>
<h3 data-tool="mdnice编辑器">下面的示例展示了集合表达式的用法:</h3>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;CollectionExpressions()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建一个数组<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;array&nbsp;=&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建一个列表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;string&gt;&nbsp;list&nbsp;=&nbsp;["one",&nbsp;"two",&nbsp;"three",&nbsp;"five",&nbsp;"追逐时光者"];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建一个&nbsp;Span<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Span&lt;char&gt;&nbsp;span =&nbsp;['a',&nbsp;'b',&nbsp;'c',&nbsp;'d',&nbsp;'e',&nbsp;'f',&nbsp;'h',&nbsp;'i',&nbsp;'k'];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建一个交错二维数组<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[][]&nbsp;two2D&nbsp;=&nbsp;[,&nbsp;,&nbsp;,&nbsp;];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br></code></span></pre>
<h3 data-tool="mdnice编辑器">展开运算符(..)示例代码:</h3>
<p data-tool="mdnice编辑器">展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素。 参数必须是集合类型。 以下示例演示了展开运算符的工作原理:</p>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;item0&nbsp;=&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;item1&nbsp;=&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;item2&nbsp;=&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;totalList&nbsp;=&nbsp;[..&nbsp;item0,&nbsp;..&nbsp;item1,&nbsp;..&nbsp;item2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;element&nbsp;in&nbsp;totalList)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write($"{element},&nbsp;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></code></span></pre>
<p data-tool="mdnice编辑器">没有<code>..</code>&nbsp;会有异常:</p>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202407/1336199-20240724220622355-1822754860.png" alt="" loading="lazy"></p>
<p>正常输出:</p>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202407/1336199-20240724220633322-83735847.png" alt="" loading="lazy"></p>
<h2 data-tool="mdnice编辑器">内联数组</h2>
<p data-tool="mdnice编辑器">内联数组用于提高应用程序性能,允许在结构体中创建固定大小的数组。虽然你可能不会自己声明内联数组,但当它们通过&nbsp;<code>System.Span&lt;T&gt;</code>&nbsp;或&nbsp;<code>System.ReadOnlySpan&lt;T&gt;</code>&nbsp;从运行时 API 暴露出来时,你可以透明地使用它们。内联数组提供与不安全固定大小缓冲区类似的性能特性。</p>
<h3 data-tool="mdnice编辑器">内联数组的声明与下面的结构类似:</h3>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;struct&nbsp;Buffer<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;_element0;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></code></span></pre>
<h3 data-tool="mdnice编辑器">你可以像使用其他数组一样使用它们:</h3>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;InlineArrays()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;buffer&nbsp;=&nbsp;new&nbsp;Buffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;20;&nbsp;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer&nbsp;=&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;i&nbsp;in&nbsp;buffer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></code></span></pre>
<h2 data-tool="mdnice编辑器">默认 lambda 参数</h2>
<p data-tool="mdnice编辑器">现在可以为&nbsp;<span class="wx_search_keyword_wrap">Lambda&nbsp;表达式的参数定义默认值,语法和规则与将参数的默认值添加到任何方法或本地函数相同。</span></p>
<h3 data-tool="mdnice编辑器">如果 lambda 表达式只有一个输入参数,则括号是可选的:</h3>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>Func&lt;double,&nbsp;double&gt;&nbsp;testcube&nbsp;=&nbsp;x&nbsp;=&gt;&nbsp;x&nbsp;*&nbsp;x&nbsp;*&nbsp;x;<br></code></span></pre>
<h3 data-tool="mdnice编辑器">两个或更多输入参数使用逗号加以分隔:</h3>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>Func&lt;int,&nbsp;int,&nbsp;bool&gt;&nbsp;testForEquality&nbsp;=&nbsp;(x,&nbsp;y)&nbsp;=&gt;&nbsp;x&nbsp;==&nbsp;y;<br></code></span></pre>
<h3 data-tool="mdnice编辑器">可以显式指定类型,如下面的示例所示:</h3>
<p data-tool="mdnice编辑器">注意:输入参数类型必须全部为显式或全部为隐式;否则,便会生成 CS0748 编译器错误!!</p>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>Func&lt;int,&nbsp;string,&nbsp;bool&gt;&nbsp;isTooLong&nbsp;=&nbsp;(int&nbsp;x,&nbsp;string&nbsp;s)&nbsp;=&gt;&nbsp;s.Length&nbsp;&gt;&nbsp;x;<br></code></span></pre>
<h2 data-tool="mdnice编辑器">任何类型的别名</h2>
<p data-tool="mdnice编辑器">可以使用 using 别名指令创建任何类型的别名,而不仅仅是命名类型。也就是说,你可以为元组类型、数组类型、指针类型或其他不安全类型创建语义别名。</p>
<h3 data-tool="mdnice编辑器">使用 using 关键字为元组类型创建别名,并进行调用:</h3>
<pre data-tool="mdnice编辑器"><span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDtgicUibK46DrJf0yV2eBlJzLTu7Us8ia6r6mSzuvaUG83SzbA0G4cfCAccADFY8JONb17w48WkfCR5y/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>using&nbsp;PointTest&nbsp;=&nbsp;(int&nbsp;item1,&nbsp;int&nbsp;item2);<br><br>namespace&nbsp;HelloDotNetGuide.CSharp语法<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;CSharp12GrammarExercise<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;OutputPrint()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用&nbsp;using&nbsp;关键字为元组类型创建别名,并进行调用:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PointTest&nbsp;point&nbsp;=&nbsp;(10,&nbsp;20);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine($"输出:Item1={point.Item1},&nbsp;Item2={point.Item2}");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></code></span></pre>
<h2 data-tool="mdnice编辑器">参考文章</h2>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>详细功能介绍请阅读微软官方文档:<span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-12</span></span></li>
<li>文章示例源码地址:<span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://github.com/YSGStudyHards/DotNetGuide/blob/main/DotNetGuidePractice/HelloDotNetGuide/CSharp%E8%AF%AD%E6%B3%95/CSharp12GrammarExercise.cs</span></span></li>
</ul>
<h2 id="activity-name" class="rich_media_title ">DotNetGuide技术社区交流群</h2>
<ul>
<li>DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。</li>
<li>在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。</li>
<li>我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。</li>
</ul>
<blockquote>
<p><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)"><strong>欢迎加入DotNetGuide技术社区微信交流群👪</strong></span></span></p>
</blockquote>

</div>
<div id="MySignature" role="contentinfo">
    <blockquote >
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者名称:</span>追逐时光者</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者简介:</span>一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【&hearts;推荐&hearts;】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。
</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/Can-daydayup/p/18321876
頁: [1]
查看完整版本: C# 12 新增功能实操!