雪千纯 發表於 2025-3-21 08:01:00

C# 中比较实用的关键字,基础高频面试题!

<h2 data-tool="mdnice编辑器"><span>前言</span></h2>
<p data-tool="mdnice编辑器"><span>在C#编程中<code><span>关键字</span></code><span>是构建逻辑和实现功能的基石,它承载着编程语言的语法规则和编程智慧。熟练掌握这些基础高频关键字对提升编程能力和面试表现至关重要,它们是日常开发和解决复杂问题的关键。</span></span></p>
<h2><span class="content">DotNetGuide</span></h2>
<p>全面的C#/.NET/.NET Core学习、工作、面试指南,记录、收集和总结C#/.NET/.NET Core基础知识、学习路线、开发实战、编程技巧练习、学习视频、文章、书籍、项目框架、社区组织、开发必备工具、技术前沿周刊、常见面试题、面试须知、简历模板、人才招聘、以及自己在学习和工作中的一些微薄见解。</p>
<ul>
<li><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)"><strong><span style="color: rgba(0, 0, 0, 1)">DotNetGuide知识库:</span></strong></span></span><span style="color: rgba(0, 0, 255, 1)"><strong><span style="color: rgba(0, 0, 255, 1)">https://github.com/YSGStudyHards/DotNetGuide</span></strong></span></li>
<li><strong>DotNetGuide技术社区交流8群:</strong>&nbsp;<span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://mp.weixin.qq.com/s/6H2-x-Von_s-04-c2CtSHg</span></span></li>
<li><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">🎯互联网寒冬下,如何写好一份.NET求职简历?附带简洁简历模板和简历优化服务来了!!!</span></span></li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202503/1336199-20250320220136136-1428106312.png" alt="" loading="lazy"></p>
<h2 data-tool="mdnice编辑器"><span>C#访问修饰符</span></h2>
<h3 data-tool="mdnice编辑器"><span>访问修饰符的作用</span></h3>
<p data-tool="mdnice编辑器"><span>访问修饰符是用于指定成员或类型的声明可访问性的关键字。</span></p>
<h3 data-tool="mdnice编辑器"><span>四种常见的访问修饰符</span></h3>
<ul class="list-paddingleft-1">
<li><span>public(公共的)</span></li>
<li><span>protected(受保护的)</span></li>
<li><span>internal(内部的)</span></li>
<li><span>private(私有的)</span></li>
</ul>
<h3 data-tool="mdnice编辑器"><span>访问修饰符的六种组合及其可访问性级别</span></h3>
<ul class="list-paddingleft-1">
<li><span>public 访问不受限制</span></li>
<li><span>protected 访问限于包含类或派生自包含类的类型</span></li>
<li><span>internal 访问限于当前程序集</span></li>
<li><span>private 访问限于包含类</span></li>
<li><span>protected internal 访问限于当前程序集或派生自包含类的类型访问</span></li>
<li><span>private protected 访问限于包含类或当前程序集中包含类的派生类的类型访问</span></li>
</ul>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>//包含类<span><br>publicclassBaseClass<span><br><span>{<span><br><span>&nbsp; &nbsp;&nbsp;privateprotectedint<span>&nbsp;myValue =&nbsp;0<span>;<span><br><span>}<span><br><span><br>//当前程序集中包含类的派生类<span><br>publicclassDerivedClass1<span>&nbsp;:&nbsp;BaseClass<span><br><span>{<span><br><span>&nbsp; &nbsp;&nbsp;<span>void<span>&nbsp;<span>Access<span>(<span>)<span><br><span>&nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var<span>&nbsp;baseObject =&nbsp;new<span>&nbsp;BaseClass();<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; myValue =&nbsp;5<span>;<span><br><span>&nbsp; &nbsp; }<span><br><span>}<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h3 data-tool="mdnice编辑器"><span>C#类和结构默认访问修饰符</span></h3>
<blockquote>
<p><span>Internal</span></p>
</blockquote>
<h3 data-tool="mdnice编辑器"><span>C#适用于类和结构访问修饰符有哪些</span></h3>
<blockquote>
<p><span>public 或 internal</span></p>
</blockquote>
<h3 data-tool="mdnice编辑器"><span>类成员和结构成员的默认访问修饰符为</span></h3>
<blockquote>
<p><span>private</span></p>
</blockquote>
<h3 data-tool="mdnice编辑器"><span>结构成员(包括嵌套的类和结构)可以声明为</span></h3>
<p data-tool="mdnice编辑器"><span>public、internal 或 private 注意:结构成员无法声明为 protected、protected internal 或 private protected,因为结构不支持继承。</span></p>
<h3 data-tool="mdnice编辑器"><span>类成员(包括嵌套的类和结构)可以声明为</span></h3>
<p data-tool="mdnice编辑器"><span>public、protected internal、protected、internal、private protected 或 private</span></p>
<h2 data-tool="mdnice编辑器"><span>readonly与const区别?</span></h2>
<p data-tool="mdnice编辑器"><span>readonly关键字(运行时常量):字段可以在声明或构造函数中初始化,常作为运行时常量使用。</span></p>
<p data-tool="mdnice编辑器"><span>const关键字(编译时常量):字段只能在该字段的声明时初始化,常作为编译时常量使用过。</span></p>
<h2 data-tool="mdnice编辑器"><span>virtual作用?</span></h2>
<blockquote>
<p><span>详情阅读:<span>https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual</span></span></p>
</blockquote>
<p data-tool="mdnice编辑器"><span>virtual关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写(使用override关键字对虚方法重写)。 如下是虚方法声明和重写虚方法的示例:</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>&nbsp; &nbsp;// 基类虚方法声明<span><br><span>&nbsp; &nbsp;class BaseClass &nbsp;<span><br><span>&nbsp; &nbsp; { &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public virtual void Method1() &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Base - Method1"); &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public virtual void Method2() &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Base - Method2"); &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<span><br><span>&nbsp; &nbsp; } &nbsp;<span><br><span><br><span>&nbsp; &nbsp; class DerivedClass : BaseClass &nbsp;<span><br><span>&nbsp; &nbsp; { &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; // 重写基类中的虚方法<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public override void Method1() &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Derived - Method1"); &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public new void Method2() &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Derived - Method2"); &nbsp;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;<span><br><span>&nbsp; &nbsp; } &nbsp;<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 data-tool="mdnice编辑器"><span>override作用?</span></h2>
<p data-tool="mdnice编辑器"><span>扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要 override 修饰符。</span></p>
<h2 data-tool="mdnice编辑器"><span>static作用?</span></h2>
<blockquote>
<p><span>详情阅读:<span>https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/static</span></span></p>
</blockquote>
<p data-tool="mdnice编辑器"><span>使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员。 static 修饰符可用于声明 static 类。 在类、接口和结构中,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器。</span></p>
<h3 data-tool="mdnice编辑器"><span>静态<span>类与非静态类的区别?</span></span></h3>
<ol class="list-paddingleft-1">
<li><span>静态类无法实例化(换句话说,无法使用 new 运算符创建类类型的变量。 由于不存在任何实例变量,因此可以使用类名本身访问静态类的成员)。</span></li>
<li><span>静态构造函数只调用一次,在程序所驻留的应用程序域的生存期内,静态类会保留在内存中(即使用Static修饰的类,应用一旦启用静态类就会保留在内存中)。</span></li>
<li><span>静态类只包含静态成员</span></li>
<li><span>不能包含实例构造函数。</span></li>
<li><span>静态类会进行密封,因此不能继承。 它们不能继承自任何类(除了 Object)。 静态类不能包含实例构造函数。 但是,它们可以包含静态构造函数。</span></li>
</ol>
<h3 data-tool="mdnice编辑器"><span>静态成员和非静态成员的区别?</span></h3>
<blockquote>
<p><span>成员主要指的是:字段、方法、属性、运算符、事件和构造函数等。</span></p>
</blockquote>
<ol class="list-paddingleft-1">
<li><span>静态成员用static修饰符,非静态成员不需要。</span></li>
<li><span>静态成员属于类所有,非静态成员属于类的实例化对象所有。</span></li>
<li><span>静态方法里不能使用非静态成员,非静态方法可以使用静态成员。</span></li>
<li><span>每创建一个类的实例,都会在内存中为非静态成员新分配一块新的存储。</span></li>
<li><span>静态成员无论类创建多少个实例,在内存中只占同一块区域。</span></li>
</ol>
<h3 data-tool="mdnice编辑器"><span>静态方法的使用场合</span></h3>
<ol class="list-paddingleft-1">
<li><span>静态方法最适合工具类中方法的定义。</span></li>
<li><span>静态变量<span>适合全局变量的定义。</span></span></li>
</ol>
<h3 data-tool="mdnice编辑器"><span>静态方法和非静态方法区别(优/缺点)?</span></h3>
<h4 data-tool="mdnice编辑器"><span>优点:</span></h4>
<ol class="list-paddingleft-1">
<li><span>属于类级别的,不需要创建对象就可以直接使用。</span></li>
<li><span>全局唯一,内存中唯一,静态变量可以唯一标识某些状态。</span></li>
<li><span>在类加载时候初始化,常驻在内存中,调用快捷方便。</span></li>
</ol>
<h4 data-tool="mdnice编辑器"><span>缺点:</span></h4>
<ol class="list-paddingleft-1">
<li><span>静态方法不能调用非静态的方法和变量。(</span><strong><span>非静态方法可以任意的调用静态方法/变量</span></strong><span>)</span></li>
<li><span>不可以使用&nbsp;</span><span>this<span>&nbsp;引用&nbsp;</span><span>static</span><span>&nbsp;方法或属性访问器。</span></span></li>
</ol>
<h2 data-tool="mdnice编辑器"><span>sealed 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>sealed 关键字用于修饰类、方法或属性,表示该类或成员不可被继承或重写。如果一个类被声明为 sealed,其他类不能继承该类;如果一个方法或属性被声明为 sealed,其他类不能重写该方法或属性。</span></p>
<h2 data-tool="mdnice编辑器"><span>this 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>this 关键字表示当前对象的引用,可以用于访问当前对象的成员。它可以用来区分局部变量和实例变量、在构造函数中调用其他构造函数、传递当前对象给其他方法等。</span></p>
<h2 data-tool="mdnice编辑器"><span>base 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>base 关键字表示基类的引用,可以用于访问基类的成员。它可以用来在子类中调用基类的构造函数、调用基类的方法或属性等。</span></p>
<h2 data-tool="mdnice编辑器"><span>sizeof 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>sizeof 运算符返回给定类型的变量所占用的字节数。 sizeof 运算符的参数必须是一个<span>非托管类型<span>的名称,或是一个<span>限定<span>为非托管类型的类型参数。</span></span></span></span></span></p>
<h2 data-tool="mdnice编辑器"><span>lock 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>lock 关键字用于在多线程环境下对共享资源进行互斥访问。使用 lock 关键字可以将代码块标记为临界区,使得只有一个线程能够进入临界区执行代码。</span></p>
<h2 data-tool="mdnice编辑器"><span>async 和 await 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>async 和 await 关键字用于异步编程。通过使用 async 标记方法和 await 等待异步操作完成,可以实现在异步任务执行过程中不阻塞主线程。</span></p>
<h2 data-tool="mdnice编辑器"><span>delegate 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>delegate 关键字用于声明委托类型,即代表一个或多个方法的对象。使用 delegate 可以实现事件和回调机制,简化方法的调用和管理。</span></p>
<h2 data-tool="mdnice编辑器"><span>using关键字的作用</span></h2>
<ol class="list-paddingleft-1">
<li><span>using指令为命名空间创建别名,或导入在其他命名空间中定义的类型</span></li>
<li><span>using 语句定义一个范围,在此范围的末尾将释放对象资源,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。</span></li>
</ol>
<h2 data-tool="mdnice编辑器"><span>C# 中的 in 关键字有什么作用?</span></h2>
<p data-tool="mdnice编辑器"><span>in 关键字用于参数传递时,将参数按只读引用传递。使用 in 关键字可以提高性能,避免不必要的参数复制。</span></p>
<blockquote>
<p><span>在 C# 中,in 关键字用于将参数标记为输入参数。它告诉编译器在方法调用过程中不会修改该参数的值,并且可以通过引用传递避免对参数进行复制。这对于大型结构或对象参数非常有用,因为直接引用参数可以提高性能和内存效率。</span></p>
</blockquote>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code>class<span>&nbsp;Program<span><br><span>{<span><br><span>&nbsp; &nbsp;&nbsp;<span>static<span>&nbsp;<span>void<span>&nbsp;<span>Main<span>(<span>string<span>[] args<span>)<span><br><span>&nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;int<span>&nbsp;x =&nbsp;5<span>;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; MultiplyByTwo(in<span>&nbsp;x);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(x);&nbsp;// 输出 5<span><br><span>&nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp;&nbsp;<span>static<span>&nbsp;<span>void<span>&nbsp;<span>MultiplyByTwo<span>(<span>in<span>&nbsp;<span>int<span>&nbsp;number<span>)<span><br><span>&nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 无法修改 in 参数的值<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// number *= 2; // 编译错误<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 仅能读取 in 参数的值<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(number *&nbsp;2<span>);&nbsp;// 输出 10<span><br><span>&nbsp; &nbsp; }<span><br><span>}<span><br><span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 data-tool="mdnice编辑器"><span>C# 中的 ref 关键字有什么作用?</span></h2>
<ul class="list-paddingleft-1">
<li><span>参数在使用 ref 关键字进行引用传递时,必须在方法调用之前对其进行初始化。</span></li>
<li><span>ref 关键字既可以在进入方法之前初始化参数的值,也可以在方法内部对参数进行修改。</span></li>
<li><span>ref 参数在进入方法时保持原始值,并在方法结束后将值带回到调用处。</span></li>
</ul>
<h2 data-tool="mdnice编辑器"><span>C# 中的&nbsp;</span><span>out</span><span>&nbsp;关键字有什么作用?</span></h2>
<ul class="list-paddingleft-1">
<li><span>参数在使用 out 关键字进行引用传递时,不需要在方法调用之前进行初始化。</span></li>
<li><span>out 关键字通常用于表示方法返回多个值的情况,或者用于修改方法外部的变量。</span></li>
<li><span>out 参数必须在方法内部进行初始化,并确保在方法结束前完成赋值操作。方法内部没有为 out 参数赋值的情况下,方法调用将会导致编译错误。</span></li>
</ul>
<h2 data-tool="mdnice编辑器"><span>C#中参数传递 ref与out 的区别?</span></h2>
<p data-tool="mdnice编辑器"><span>ref 指定此参数由引用传递,指定的参数在函数调用时必须先初始化(有进有出)。</span></p>
<p data-tool="mdnice编辑器"><span>out 指定此参数由引用传递,指定的参数在进入函数时会清空参数值,因此该参数必须在调用函数内部进行初始化赋值操作(无进有出)。</span></p>
<p data-tool="mdnice编辑器"><strong><span>总结:</span></strong></p>
<ul class="list-paddingleft-1">
<li><span>ref 和 out 都用于引用传递参数。</span></li>
<li><span>ref 参数在方法调用前必须被初始化,而 out 参数不需要。</span></li>
<li><span>ref 参数可以保留原始值并在方法内部进行修改,而 out 参数必须在方法内部进行初始化赋值。</span></li>
</ul>
<h2 data-tool="mdnice编辑器"><span>不能将 in、ref 和 out 关键字用于以下几种方法:</span></h2>
<ul class="list-paddingleft-1">
<li><span>异步方法,通过使用 async 修饰符定义。</span></li>
<li><span>迭代器方法,包括 yield return 或 yield break 语句。</span></li>
<li><span>扩展方法的第一个参数不能有 in 修饰符,除非该参数是结构。</span></li>
<li><span>扩展方法的第一个参数,其中该参数是泛型类型(即使该类型被约束为结构)</span></li>
</ul>
<h2 data-tool="mdnice编辑器"><span>as和is的区别</span></h2>
<ol class="list-paddingleft-1">
<li><span>is 只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false。</span></li>
<li><span>as运算符将表达式结果显式转换为给定的引用类型或可以为null值的类型。 如果无法进行转换,则as运算符返回 null。</span></li>
</ol>
<p data-tool="mdnice编辑器"><span>总结:as模式的效率要比is模式的高,因为借助is进行类型转换的化,需要执行两次类型兼容检查。而as只需要做一次类型兼容,一次null检查,null检查要比类型兼容检查快。</span></p>
<h3 data-tool="mdnice编辑器"><span>is 运算符</span></h3>
<p data-tool="mdnice编辑器"><span>is 运算符用于检查对象是否是某个特定类型,或者是否可以转换为该类型。它返回一个布尔值 (true 或 false)。</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>string title =&nbsp;"Hello DotNetGuide"<span>;<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(title is string)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("是 string 类型"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("不是 string 类型"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(title is not null)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("不为 null"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("为 null"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p data-tool="mdnice编辑器"><strong>模式匹配:</strong><span>C# 7.0 引入了模式匹配,允许在 is 表达式中进行类型检查和转换:</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>object obj =&nbsp;"追逐时光者"<span>;<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(obj is string str)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($" {str}"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("不是指定类型"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p data-tool="mdnice编辑器"><strong>列表模式:</strong><span>从 C# 11 开始,可以使用列表模式来匹配列表或数组的元素。以下代码检查数组中处于预期位置的整数值:</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>int[] empty = [];<span><br><span>int[] one = ;<span><br><span>int[] odd = ;<span><br><span>int[] even = ;<span><br><span>int[] fib = ;<span><br><span><br><span>Console.WriteLine(odd is ); &nbsp; //&nbsp;false<span><br><span>Console.WriteLine(fib is ); &nbsp; //&nbsp;true<span><br><span>Console.WriteLine(fib is ); &nbsp; &nbsp; //&nbsp;true<span><br><span>Console.WriteLine(fib is [.., 1, 2, 3, _ ]); &nbsp; &nbsp; //&nbsp;true<span><br><span>Console.WriteLine(even is ); &nbsp; &nbsp; //&nbsp;true<span><br><span>Console.WriteLine(even is ); &nbsp; &nbsp;//&nbsp;true<span><br><span>Console.WriteLine(odd is [.., 3, 5]); //&nbsp;true<span><br><span>Console.WriteLine(even is [.., 3, 5]); //&nbsp;false<span><br><span>Console.WriteLine(fib is [.., 3, 5]); //&nbsp;true<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h3 data-tool="mdnice编辑器"><span>as 运算符</span></h3>
<p data-tool="mdnice编辑器"><span>as 运算符尝试将对象转换为特定类型,如果转换失败,则返回 null 而不是抛出异常。它通常用于在不需要显式检查对象是否为特定类型的情况下进行安全的类型转换。</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>object title =&nbsp;"Hello DotNetGuide"<span>;<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string str = title as string;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(str != null)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("是 string 类型: "<span>&nbsp;+ str);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("不是 string 类型"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int? num = title as int?;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(num.HasValue)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("是 int 类型: "<span>&nbsp;+ num.Value);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("不是 int 类型"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 data-tool="mdnice编辑器"><span>null是什么类型?</span></h2>
<p data-tool="mdnice编辑器"><span>null 关键字是表示不引用任何对象的空引用的文字值。 null是引用类型变量的默认值。 普通值类型不能为 null,<span>可为空的值类型<span>除外。</span></span></span></p>
<h2 data-tool="mdnice编辑器"><span>new关键字的作用?</span></h2>
<ol class="list-paddingleft-1">
<li><span>运算符:创建类型的新实例</span></li>
<li><span>修饰符:可以显式隐藏从基类继承的成员。</span></li>
<li><span>泛型约束:泛型约束定义,约束可使用的泛型类型。</span></li>
</ol>
<h2 data-tool="mdnice编辑器"><span>return、continue、break的区别?&nbsp;</span></h2>
<h3 data-tool="mdnice编辑器"><span>return:</span></h3>
<p data-tool="mdnice编辑器"><span>结束整个方法,return关键字并不是专门用于跳出循环的,return的功能是结束一个方法。 一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。</span></p>
<h3 data-tool="mdnice编辑器"><span>continue:</span></h3>
<p data-tool="mdnice编辑器"><span>结束本次循环,然后持续进行下一次循环。</span></p>
<h3 data-tool="mdnice编辑器"><span>break:</span></h3>
<p data-tool="mdnice编辑器"><span>break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。</span></p>
<h2 data-tool="mdnice编辑器"><span>yield</span></h2>
<p data-tool="mdnice编辑器"><span>yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,减少了内存占用,并允许在迭代时执行复杂逻辑。</span></p>
<p data-tool="mdnice编辑器"><span>咱们来看看传统迭代方式和yield关键字迭代方式对比,是否如传说中的代码实现起来更简洁和高效:</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>/// &lt;summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// 传统迭代方式和yield关键字迭代方式对比<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;/summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public static void&nbsp;IteratorComparisonRun<span>()<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("迭代器方法使用yield关键字:"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var number&nbsp;in<span>&nbsp;GetNumbersWithYield())<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(number);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("传统迭代方法返回一个List&lt;int&gt;"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var numbers = GetNumbersWithoutYield();<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var number&nbsp;in<span>&nbsp;numbers)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(number);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// 迭代器方法使用yield关键字<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;/summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;returns&gt;&lt;/returns&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public static IEnumerable&lt;int&gt;&nbsp;GetNumbersWithYield<span>()<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for<span>&nbsp;(int i = 0; i &lt; 6; i++)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield&nbsp;return<span>&nbsp;i;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// 传统迭代方法返回一个List&lt;int&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;/summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;returns&gt;&lt;/returns&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public static List&lt;int&gt;&nbsp;GetNumbersWithoutYield<span>()<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var numbers = new List&lt;int&gt;();<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for<span>&nbsp;(int i = 0; i &lt; 6; i++)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; numbers.Add(i);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return<span>&nbsp;numbers;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202503/1336199-20250320220208404-71766692.png" alt="" loading="lazy"></p>
<h3 data-tool="mdnice编辑器"><span>什么情况不能使用yield关键字</span></h3>
<ul class="list-paddingleft-1">
<li><span>带有 in、ref 或 out 参数的方法。</span></li>
<li><span><span>Lambda 表达式和匿名方法。</span></span></li>
<li><span>在 C# 13 之前,yield 在具有 unsafe 块的任何方法中都无效。从 C# 13 开始,可以在包含 unsafe 块的方法中使用 yield,但不能在 unsafe 块中使用。</span></li>
<li><span>不能在catch和finally块中使用yield return和yield break。</span></li>
<li><span>不能在具有catch块的try块中使用yield return和yield break。</span></li>
<li><span>可以在只有finally块的try块中使用yield return和yield break。</span></li>
</ul>
<h2 data-tool="mdnice编辑器"><span>params</span></h2>
<p data-tool="mdnice编辑器"><span>params适用于参数个数动态变化的场景,例如日志、数学计算或格式化输出等,减少冗余代码,增强方法通用性。</span></p>
<h3 data-tool="mdnice编辑器"><span>在 C# 13 之前:</span></h3>
<p data-tool="mdnice编辑器"><span>params 仅支持一维数组(如<code><span>params int[] list</span></code><span>、<code><span>params object[] list</span></code><span>)。调用方法时需显式传递数组或数组元素类型的参数的逗号分隔列表。</span></span></span></p>
<h3 data-tool="mdnice编辑器"><span>在 C# 13 中:</span></h3>
<p data-tool="mdnice编辑器"><span>params 修饰符并不局限于数组类型。 现在可以将 params 用于任何已识别的集合类型,包括&nbsp;<code><span>System.Span&lt;T&gt;、System.ReadOnlySpan&lt;T&gt;</span></code><span>,以及那些实现&nbsp;<code><span>System.Collections.Generic.IEnumerable&lt;T&gt;</span></code><span>&nbsp;并具有 Add 方法的类型。 除了具体类型外,还可以使用接口&nbsp;<code><span>System.Collections.Generic.IEnumerable&lt;T&gt;、System.Collections.Generic.IReadOnlyCollection&lt;T&gt;、System.Collections.Generic.IReadOnlyList&lt;T&gt;、System.Collections.Generic.ICollection&lt;T&gt;和 System.Collections.Generic.IList&lt;T&gt;</span></code><span>。</span></span></span></span></p>
<h3 data-tool="mdnice编辑器"><span>注意事项</span></h3>
<p data-tool="mdnice编辑器"><span>在方法声明中的&nbsp;<code><span>params</span></code><span>&nbsp;关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。</span></span></p>
<h2 data-tool="mdnice编辑器"><span>goto跳转语句</span></h2>
<ul class="list-paddingleft-1">
<li><span>goto 语句由关键字 goto 后跟一个标签名称组成,通过标签名称指定跳转的位置。</span></li>
<li><span>可以在方法的任何地方放置标签,并且可以多次使用相同的标签。</span></li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/1336199/202503/1336199-20250320220239518-2141353227.png" alt="" loading="lazy"></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfzNFlBn3E31QA9XWKw1JtCCszxnILRGkKL9dBYMDPWL9kns7a19lOicQThmGDpsHn4uICk71KXAJ0P9qa4rfHiaU/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>/// &lt;summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// 使用goto进行代码重试示例<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;/summary&gt;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; public static void&nbsp;GotoRetryUseExample<span>()<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int retryCount = 0;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for<span>&nbsp;(int i = 0; i &lt; 10; i++)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; retryLogic:<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //模拟可能出错的操作<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Random random = new Random();<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int result = random.Next(0, 2);<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(result == 0)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new Exception("Error occurred"<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Operation successful on attempt: "<span>&nbsp;+ retryCount);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (Exception ex)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; retryCount++;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if<span>&nbsp;(retryCount &lt; 3)<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Error occurred, retrying..."<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; goto retryLogic; //跳转到重试逻辑<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("Max retry limit reached."<span>);<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return<span>;<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; }<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 data-tool="mdnice编辑器"><span>参考文章</span></h2>
<ul class="list-paddingleft-1">
<li><span>https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/access-modifiers</span></li>
<li><span>https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords</span></li>
</ul>

</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/18784074
頁: [1]
查看完整版本: C# 中比较实用的关键字,基础高频面试题!