10 个 C# 关键字和功能

在 Stack Overflow 调查中,C# 语言是排名第 5 位的编程语言。它广泛用于创建各种应用程序,范围从桌面到移动设备再到云原生。由于有如此多的语言关键字和功能,对于开发人员来说,要跟上新功能发布的最新信息将是一项艰巨的任务。本文深入探讨了每个 C# 开发人员都应该知道的 10 个 C# 关键字。

f450576615fc08a17d2baeec271714ea.png

1. Async 和 Await

  • 关键词: ,asyncawait

C# 中引入的 and 关键字使得在 C# 中处理异步编程变得容易。它们允许您编写在不阻塞主线程的情况下执行操作的代码。此功能对于受 I/O 限制或 CPU 密集型的任务特别有用。通过使用这些关键字,程序员可以轻松处理长时间运行的计算操作,例如调用外部 API 来获取数据或从网络驱动器写入或读取。这将有助于开发响应式应用程序,并可以处理并发操作。asyncawait

C#

1
public async Task<string> GetDataAsync()
2
{
3
    using (HttpClient client = new HttpClient())
4
    {
5
        string result = await client.GetStringAsync("http://bing.com");
6
        return result;
7
    }
8
}

2. LINQ

  • 关键词: , , , , , ,fromselectwheregroupintoorder byjoin

LINQ(语言集成查询)提供了一种简单的方法,可以直接在 C# 中查询各种数据源,如数据库、集合和 XML,而无需与其他框架(如 ADO.NET 等)交互。通过使用与 SQL 相同的语法,LINQ 使开发人员能够以可读的方式编写查询。

C#

1
var query = from student in students
2
            where student.Age > 18
3
            orderby student.Name
4
            select student;

3. 性能

  • 关键词property

属性主要是提供灵活机制来读取、写入或计算私有字段值的成员。通常,我们隐藏内部私有支持字段,并通过属性公开它们。这使调用者可以轻松访问数据。在下面的示例中,是隐藏名为 的支持字段的属性,标记为以避免外部调用者直接修改该字段。publicNamenameprivate

C#

1
class Person
2
{
3
  private string name; // backing field
4
  public string Name   // property
5
  {
6
    get { return name; }
7
    set { name = value; }
8
  }
9
}
10


11
class Program
12
{
13
  static void Main(string[] args)
14
{
15
    Person P1 = new Person();
16
    P1.Name = "Sunny";
17
    Console.WriteLine(myObj.Name);
18
  }
19
}

4. 泛型

  • 关键词: ,generic<T>

泛型允许您为类编写代码,而无需指定该类所处理的数据类型。它是一个类,允许用户使用占位符定义类和方法。C#2.0 中泛型的引入彻底改变了创建模块化可重用代码的格局,否则这些代码需要在多个地方复制。想象一下,您正在处理 2 个数字的相加,然后需要添加 s 或数据类型。我们最终创建了相同的重复代码,因为我们已经在方法参数中定义了一个具有数据类型的方法。泛型使定义占位符和处理不同数据类型的逻辑变得容易。intfloatdoubleint

C#

1
public class Print
2
{
3
    // Generic method which can take any datatype as method parameter
4
    public void Display<T>(T value)
5
    {
6
        Console.WriteLine($"The value is: {value}");
7
    }
8
}
9


10
public class Program
11
{
12
    public static void Main(string[] args)
13
{
14
        Print print = new Print();
15


16
        // Call the generic method with different data types
17
        print.Display<int>(10);
18
        print.Display<string>("Hello World");
19
        print.Display<double>(20.5);
20
    }
21
}

5. 代表和活动

  • 关键词: ,delegateevent

委托只不过是一个对象,它引用一个方法,你可以直接通过它来调用,而不直接调用该方法。委托等效于 C++ 中的函数指针。委托是指向任何方法的类型安全指针。委托主要用于实现回调方法和处理事件。 并且是 C# 中开箱即用的内置代表。delegateFunc<T>Action<T>

另一方面,事件使类或对象能够在发生感兴趣的事情时通知其他类或对象。例如,考虑用户单击您网站上的按钮的场景。它生成一个事件(在本例中为按钮单击),由相应的事件处理程序代码处理。

例子

声明和实例化 a 的示例代码:delegate

C#

1
public delegate void MyDelegate1(string msg); // declare a delegate
2


3
// This method will be pointed to by the delegate
4
public static void PrintMessage(string message)
5
{
6
    Console.WriteLine(message);
7
}
8


9
public static void Main(string[] args)
10
{
11
    // Instantiate the delegate
12
    MyDelegate1 del = PrintMessage;
13


14
    // Call the method through the delegate
15
    del("Hello World");
16
}


用于启动事件并通过处理程序处理事件的示例代码:event

C#

1
// Declare a delegate
2
public delegate void Notify();  
3


4
public class ProcessBusinessLogic
5
{
6
    public event Notify ProcessCompleted; // Declare an event
7


8
    public void StartProcess()
9
{
10
        Console.WriteLine("Process Started!");
11
        // Some actual work here..
12
        OnProcessCompleted();
13
    }
14


15
    // Method to call when the process is completed
16
    protected virtual void OnProcessCompleted()
17
{
18
        ProcessCompleted?.Invoke();
19
    }
20
}
21


22
public class Program
23
{
24
    public static void Main(string[] args)
25
{
26
        ProcessBusinessLogic bl = new ProcessBusinessLogic();
27
        bl.ProcessCompleted += bl_ProcessCompleted; // Register event handler
28
        bl.StartProcess();
29
    }
30


31
    // Event handler
32
    public static void bl_ProcessCompleted()
33
{
34
        Console.WriteLine("Process Completed!");
35
    }
36
}

6. Lambda 表达式

  • 关键词: ,lambda=>

Lambda 表达式提供了一种表示方法的简单方法,在 LINQ 查询和定义短内联函数时特别有用。此功能允许开发人员在执行简单操作时消除对传统方法定义的需求,从而编写可读的代码。Lambda 表达式使 Lambda 表达式成为开发人员在使用 C# 时的宝贵工具,从而提高了代码的清晰度和效率。

C#

1
Func<int, int, int> add = (x, y) => x + y;
2


3
int result = add(3, 4);  // result is 7

7. 可为 null 的类型

  • 关键词?

在 C# 中,可以为 null 的类型也允许值类型具有状态。当您使用可能具有值的数据库或数据源时,这会派上用场。在值类型后添加 a 有助于开发人员处理数据可能丢失或未定义的情况。这样可以防止在代码运行时导致潜在错误。此功能提供了一种清晰直接的方式来处理可选或缺失的数据,从而使应用程序更加可靠。nullnull?

例:

C#

1
int? num = null;
2
if (num.HasValue)
3
{
4
    Console.WriteLine($"Number: {num.Value}");
5
}
6
else
7
{
8
    Console.WriteLine("No value assigned.");
9
}

8. 模式匹配

  • 关键词: ,switchcase

模式匹配是 C# 7.0 中引入的另一个有用功能,然后在该语言的后续版本中进行了一系列改进。模式匹配需要一个表达式,它有助于测试它是否符合特定条件。我们可以以易于阅读的紧凑方式编写代码,而不是冗长的语句。在下面的示例中,我使用了我赋值的地方(数据类型),然后使用模式匹配来打印它是什么数据类型。if-elseobject5int

C#

1
object obj = 5;
2


3
if (obj is int i)
4
{
5
    Console.WriteLine($"Integer: {i}");
6
}
7
switch (obj)
8
{
9
    case int j:
10
        Console.WriteLine($"Integer: {j}");
11
        break;
12
    case string s:
13
        Console.WriteLine($"String: {s}");
14
        break;
15
    default:
16
        Console.WriteLine("Unknown type.");
17
        break;
18
}

9. 扩展方式

  • 关键词:(在方法签名中)this

扩展方法允许开发人员在不更改其原始代码的情况下向现有类型添加新方法。这些方法是静态的,但工作方式类似于扩展类型的实例方法,提供了一种流畅的方式来添加新功能。扩展方法使代码更加模块化和可重用,使开发人员能够从库外部扩展类型,而不会弄乱原始代码。扩展方法还支持“开放/封闭”原则,这意味着代码对扩展是开放的,但对修改是封闭的。

C#

1
public static class StringExtensions
2
{
3
    public static bool IsNullOrEmpty(this string value)
4
{
5
        return string.IsNullOrEmpty(value);
6
    }
7
}
8


9
// Usage
10
string str = null;
11
bool result = str.IsNullOrEmpty();  // result is true

10. 元组

  • 关键词:tuple

元组允许您将多个值分组为一个单元。当您想要从方法发回多个值而不使用参数或仅为了在对象之间传输数据而创建新类时,它们会有所帮助。使用元组,您可以打包并返回一组相关值,这使我们的代码更易于阅读和理解。您可以为元组中的字段命名,也可以不命名它们。然后,使用 和 引用值,如下所示。Item1Item2

C#

1
public (int, string) GetPerson()
2
{
3
    return (1, "John Doe");
4
}
5


6
// Usage
7
var person = GetPerson();
8
Console.WriteLine($"ID: {person.Item1}, Name: {person.Item2}");

结论

通过使用 / 来很好地处理任务,使用 LINQ 来获取数据,保证数据安全,确保类型正确,对于对事件做出反应的程序,使用 Lambda 表达式来编写短函数,使用 null 类型来处理缺失的信息,使用 Pattern Matching 来使代码更清晰并说得更多,使用 Extension 方法添加新功能, 和元组 为了更好地组织数据,您可以编写更易于管理且不太可能中断的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/870936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm+vue+uniapp的二手物品交易平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

数据结构--图(Graph)

定义 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成的一种非线性表结构&#xff0c;通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G表示一个图&#xff0c;V是图G中顶点的集合&#xff0c;E是图G中边的集合。 顶点&#xff08;…

大模型之战-操作数据表-coze

工作流直接操作数据库啦【何时可以直接访问自己的数据库呢】 1&#xff0c;第一步创建一个bot智能体 1.1&#xff0c;bot中创建数据库表&#xff1a; 1.2&#xff0c;智能体可以通过对话&#xff0c;操作表&#xff1b;【增加&#xff0c;筛选查询等】 1.2.1&#xff0c;增加…

C++ 设计模式——模板方法模式

模板方法模式 模板方法模式逐步重构并引入模板方法模式初始实现提取共性并引入模板方法模式实现具体类 完整代码示例模板方法模式的 UML 图UML 图详细介绍 模板方法模式适用于以下场景 模板方法模式 模板方法模式是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#x…

Python(PyTorch)硅光电倍增管和量化感知训练亚光子算法验证

&#x1f3af;要点 &#x1f3af;亚光子光神经网络矩阵计算 | &#x1f3af;光学扇入计算向量点积 | &#x1f3af;表征测量确定不同光子数量下计算准确度 | &#x1f3af;训练全连接多层感知器基准测试光神经网络算法数字识别 | &#x1f3af;物理验证光学设备设置 | &#x…

美股收涨,半导体板块领涨;苹果iPhone出货预测上调

市场概况 在昨夜的交易中&#xff0c;美股三大股指全线收涨。道琼斯工业平均指数上涨1.39%&#xff0c;纳斯达克综合指数上涨2.34%&#xff0c;标准普尔500指数上涨1.61%。值得注意的是&#xff0c;英伟达股票涨幅近4%&#xff0c;推动了科技股的整体表现。美国十年期国债收益…

RK3576 芯片介绍

RK3576 芯片介绍 RK3576瑞芯微第二代8nm高性能AIOT平台&#xff0c;它集成了独立的6TOPS&#xff08;Tera Operations Per Second&#xff0c;每秒万亿次操作&#xff09;NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;用于处理人工智能相关的任务。此外&#xff0…

数字化转型对金融服务业的影响

数字化转型正在塑造每个行业&#xff0c;从快速消费品到金融&#xff0c;每个行业都受到新兴技术的影响。 那么&#xff0c;数字化转型在金融服务中扮演什么角色&#xff1f;这对招聘前景有何影响&#xff1f; 我们探讨了数字化转型对该行业的影响、其对招聘策略的影响、数据…

【游戏开发】【Unity】如何快速建造人物模型并赋予动画动作

背景 之前介绍了简单将模型从Vroid Studio置入Blender的方法,本篇介绍如何快速将Vroid的模型赋予动画动作。 工艺流程 大致的路线就是用Vroid快速建模,从Maximo上导入骨架动作,最后用Blender将两者结合。 操作方法 在Blender中打开Edit-》Preferences-》Add-ons 搜索关键…

计算机毕业设计选题推荐-springboot 基于SpringBoot的家电销售展示平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好&#xff0c;我是程序员鱼皮&#xff0c;8 月 19 日下午&#xff0c;网易云音乐突发严重故障&#xff0c;并登顶微博热搜&#xff0c;跟黑神话悟空抢了热度。 根据用户的反馈&#xff0c;故障的具体表现为&#xff1a;用户无法登录、歌单加载失败、播放信息获取失败、无法…

PromptEngineering:ReAct 框架(LangChain 使用的 Agents 框架)

今天介绍 ReAct 框架&#xff0c;前面介绍的提示工程技术除了 CoT 大家可能很少接触到&#xff0c;那么今天的主角会稍有名气。ReAct 是著名工具 LangChain 最主要的代理类型。 ReAct 的全称是《语言模型中的协同推理和同步》[1]&#xff0c; 论文名字是《ReAct: Synergizing …

源码构建LAMP

目录 一、安装Apache 二、安装Mysql 三、安装PHP 四、安装论坛 一、安装Apache 1.cd 到opt目录下面&#xff0c;将压缩包拉进Xhell 2.解压缩apr和httpd压缩包 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf httpd-2.4.29.tar.bz2 3.将apr-1.6.2 移动到ht…

数学建模预测类—【多元线性回归】

每日名言&#xff1a;成名每在穷苦日&#xff0c;败事多因得意时 目录 文章目录 前言 二、参数估计 三、多元线性回归模型和回归系数的检验 四、预测 总结 前言 本文将根据回归建模过程来讲解多元线性回归模型&#xff0c;有关回归分析的知识以及一元线性回归的内容可以戳…

stm32的UART重定向printf()

1配置好uart 2打开usart.c文件 3在此文件前面添加头文件 4在末尾添加重定向代码 添加的代码 /* USER CODE BEGIN 1 *///加入以下代码,支持printf函数,而不需要选择use MicroLIB //#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #if 1 //#pragma import(__use_n…

暑假算法刷题日记 Day 10

目录 重点整理 054、 拼数 题目描述 输入格式 输出格式 输入输出样例 核心思路 代码 055、 求第k小的数 题目描述 输入格式 输出格式 输入输出样例 核心思路 代码 总结 这几天我们主要刷了洛谷上排序算法对应的一些题目&#xff0c;相对来说比较简单 一共是13道…

什么是逃逸分析

如何快速判断是否逃逸就看方法内new的对象实体是否能够被外部方法进行调用 什么是逃逸分析 在java虚拟机中&#xff0c;对象是在java堆中分配内存的&#xff0c;这是一个普遍的常识。但是&#xff0c;有一种特殊情况&#xff0c;那就是如果经过逃逸分析&#xff08;escape an…

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 二、ArkWeb 1、概念介绍 ArkWeb是用于应用程序中显示Web页面内容的Web组件&#xff0c;为开发者提供页面加载、页面交互、页面调…

『功能项目』移动后的光标显示【04】

我们打开上一篇03的射线双击项目&#xff0c; 本章要做的事情是在PlayerRayNavgation脚本中添加一个移动光标&#xff0c;实现人物在场景中鼠标点击移动后在移动过程中出现移动目标光标的效果。 在unity编辑器中创建一个Plane 重命名为MovementSign 删掉碰撞器 创建一个材质 选…

Linux安装MQTT 服务器(图文教程)

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;专为低带宽和不稳定的网络环境设计&#xff0c;非常适合物联网&#xff08;IoT&#xff09;应用。 官网地址&#xff1a;https://www.emqx.com/ 一、版本选择 根据自己…