C# 12 中新增的八大功能你都知道吗?
<h2 data-tool="mdnice编辑器">前言</h2><p data-tool="mdnice编辑器">转眼之间C#都已经更新到了12了,那么C# 12 中新增的八大功能你都了解过吗?今天我们来简单介绍一下C# 12 中新增的八大功能。</p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>C#/.NET该如何自学入门?:https://www.cnblogs.com/Can-daydayup/p/18006914👉</li>
<li>C#12详细功能介绍请阅读微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-12👉</li>
</ul>
<blockquote data-tool="mdnice编辑器">
<p>同学们可以使用最新的 Visual Studio 2022 版本或 .NET 8 SDK 尝试这些功能。</p>
</blockquote>
<h2 data-tool="mdnice编辑器">一、主构造函数</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.6 预览版 2 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">从 C# 12 开始,可以在类和结构中声明主构造函数。主构造函数参数都在类的整个主体的范围内。为了确保显式分配所有主构造函数参数,所有显式声明的构造函数都必须使用 this() 语法调用主构造函数。将主构造函数添加到 class 可防止编译器声明隐式无参数构造函数。在 struct 中,隐式无参数构造函数初始化所有字段,包括 0 位模式的主构造函数参数。</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编辑器"><code>public class NameParameter(string name)<br>{<br> public string Name => name;<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>以下代码初始化从主构造函数参数计算的两个只读属性:</strong></p>
<pre data-tool="mdnice编辑器"><code>public readonly struct Distance(double dx, double dy)<br>{<br> public readonly double Magnitude { get; } = Math.Sqrt(dx * dx + dy * dy);<br> public readonly double Direction { get; } = Math.Atan2(dy, dx);<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">二、集合表达式</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.7 预览版 5 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">集合表达式引入了一种新的简洁语法,用于创建常用集合值。可以使用展开运算符(..)将其他集合内联到这些值中。</p>
<h3 data-tool="mdnice编辑器">下面的示例展示了集合表达式的用法:</h3>
<pre data-tool="mdnice编辑器"><code>// Create an array<br>int[] array = ;<br><br>// Create a list<br>List<string> list = ["one", "two", "three", "five", "追逐时光者"];<br><br>// Create a span<br>Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i', 'k'];<br><br>// Create a jagged 2D array<br>int[][] two2D = [, , , ];<br><br></code></pre>
<h3 data-tool="mdnice编辑器">展开运算符(..)示例代码:</h3>
<p data-tool="mdnice编辑器">展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素。参数必须是集合类型。以下示例演示了展开运算符的工作原理:</p>
<pre data-tool="mdnice编辑器"><code>int[] item0 = ;<br>int[] item1 = ;<br>int[] item2 = ;<br>int[] single = [.. item0, .. item1, .. item2];<br>foreach (var element in single)<br>{<br> Console.Write($"{element}, ");<br>}<br></code></pre>
<p data-tool="mdnice编辑器">没有<code>..</code> 会有异常:</p>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202402/1336199-20240219002620749-1943142511.png" alt="" loading="lazy"></p>
<p data-tool="mdnice编辑器">正常输出:</p>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202402/1336199-20240219002633303-205031759.png" alt="" loading="lazy"></p>
<h2 data-tool="mdnice编辑器">三、内联数组</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.7 预览版 3 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">运行时团队和其他库作者使用内联数组来提高应用程序的性能。通过内联数组,开发人员可以在结构类型中创建固定大小的数组。具有内联缓冲区的结构体应具有与不安全固定大小缓冲区类似的性能特性。</p>
<h3 data-tool="mdnice编辑器">内联数组的声明与下面的结构类似:</h3>
<pre data-tool="mdnice编辑器"><code> <br> public struct Buffer<br> {<br> private int _element0;<br> }<br></code></pre>
<h3 data-tool="mdnice编辑器">你可以像使用其他数组一样使用它们:</h3>
<pre data-tool="mdnice编辑器"><code> public static void Test()<br> {<br> var buffer = new Buffer();<br> for (int i = 0; i < 20; i++)<br> {<br> buffer = i;<br> }<br><br> foreach (var i in buffer)<br> {<br> Console.WriteLine(i);<br> }<br> }<br></code></pre>
<h2 data-tool="mdnice编辑器">四、Lambda 表达式中的可选参数</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.5 预览版 2 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">可以为 Lambda 表达式的参数定义默认值。语法和规则与将参数的默认值添加到任何方法或本地函数相同。</p>
<h3 data-tool="mdnice编辑器">如果 lambda 表达式只有一个输入参数,则括号是可选的:</h3>
<pre data-tool="mdnice编辑器"><code>Func<double, double> cube = x => x * x * x;<br></code></pre>
<h3 data-tool="mdnice编辑器">两个或更多输入参数使用逗号加以分隔:</h3>
<pre data-tool="mdnice编辑器"><code>Func<int, int, bool> testForEquality = (x, y) => x == y;<br></code></pre>
<h3 data-tool="mdnice编辑器">可以显式指定类型,如下面的示例所示:</h3>
<p data-tool="mdnice编辑器">注意:输入参数类型必须全部为显式或全部为隐式;否则,便会生成 CS0748 编译器错误!!</p>
<pre data-tool="mdnice编辑器"><code>Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;<br></code></pre>
<h2 data-tool="mdnice编辑器">五、ref readonly参数</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.8 预览版 2 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">ref readonly修饰符表示方法希望参数是一个变量,而不是一个非变量的表达式。不是变量的表达式包括常量、方法返回值和属性。如果参数不是变量,编译器会发出警告。</p>
<h2 data-tool="mdnice编辑器">六、任何类型的别名</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.6 预览版 3 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">可以使用 using alias 指令来别名任何类型,而不仅仅是命名类型。也就是说,你可以为元组类型、数组类型、指针类型或其他不安全类型创建语义别名。</p>
<h3 data-tool="mdnice编辑器">使用 using 关键字为元组类型创建别名,并进行调用:</h3>
<pre data-tool="mdnice编辑器"><code>using PointTest = (int x, int y);<br><br>namespace Csharp12<br>{<br> internal class Class1<br> {<br> public static void Test()<br> {<br> PointTest point = (10, 20);<br> Console.WriteLine($"Point coordinates: X={point.Item1}, Y={point.Item2}");<br> }<br><br> }<br>}<br><br></code></pre>
<h2 data-tool="mdnice编辑器">七、Experimental属性</h2>
<blockquote data-tool="mdnice编辑器">
<p>在 Visual Studio 2022 版本 17.7 预览版 3 中引入。</p>
</blockquote>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>可以使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 来标记类型、方法或程序集,以指示实验性特征。如果访问使用 ExperimentalAttribute 注释的方法或类型,编译器将发出警告。用 Experimental 特性标记的程序集中包含的所有类型都是实验性的。</li>
</ul>
<h3 data-tool="mdnice编辑器">示例代码:</h3>
<pre data-tool="mdnice编辑器"><code>namespace Csharp12<br>{<br><br> <br> public class ExperimentalAttribute : Attribute<br> {<br> public ExperimentalAttribute()<br> {<br> }<br> }<br><br> <br> public class ExperimentalClass<br> {<br> public void DoSomething()<br> {<br> Console.WriteLine("Doing something experimental...");<br> }<br> }<br><br> internal class Class1<br> {<br> public static void Test()<br> {<br> ExperimentalClass exp = new ExperimentalClass();<br> exp.DoSomething();<br> }<br> }<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">八、拦截器</h2>
<blockquote data-tool="mdnice编辑器">
<p>预览功能在 Visual Studio 2022 版本 17.7 预览版 3 中引入。</p>
</blockquote>
<p data-tool="mdnice编辑器">拦截器是一种方法,该方法可以在编译时以声明方式将对可拦截方法的调用替换为对其自身的调用。通过让拦截器声明所拦截调用的源位置,可以进行这种替换。拦截器可以向编译中(例如在源生成器中)添加新代码,从而提供更改现有代码语义的有限能力。</p>
<blockquote data-tool="mdnice编辑器">
<p>注意:拦截器是一项试验性功能,在 C# 12 的预览模式下提供。在将来的版本中,该功能可能会发生中断性变更或被删除。因此,不建议将其用于生产或已发布的应用程序。</p>
</blockquote>
<p data-tool="mdnice编辑器">要使用拦截器,用户项目必须指定 <code><InterceptorsPreviewNamespaces></code> 属性。这是允许包含拦截器的命名空间列表。</p>
<pre data-tool="mdnice编辑器"><code><InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces></code></pre>
<h2 id="activity-name" class="rich_media_title ">DotNetGuide技术社区交流群</h2>
<ul>
<li>DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。</li>
<li>在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。</li>
<li>我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。</li>
</ul>
<blockquote>
<p id="activity-name" class="rich_media_title "><strong>欢迎加入DotNetGuide技术社区微信交流群👪</strong></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;'>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【♥推荐♥】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。
</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/Can-daydayup/p/18020222
頁:
[1]