C# 语言在 Stack Overflow 调查中排名前 5 位。它广泛用于创建各种应用程序,从桌面到移动设备再到云原生。由于语言关键字和功能如此之多,开发人员要跟上新功能的发布将是一项艰巨的任务。本文深入探讨了每个 C# 开发人员都应该了解的前 10 个 C# 关键字。
1. async和 await
关键词:,
async
await
C# 中引入的 and 关键字使在 C# 中处理异步编程变得容易。它们允许您编写执行操作而不会阻塞主线程的代码。此功能对于 I/O 密集型或 CPU 密集型任务特别有用。通过使用这些关键字,程序员可以轻松处理长时间运行的计算操作,例如调用外部 API 以获取数据或从网络驱动器写入或读取数据。这将有助于开发响应式应用程序,并且可以处理并发操作。async
await
C#
public async Task<string> GetDataAsync()
{
using (HttpClient client = new HttpClient())
{
string result = await client.GetStringAsync("http://bing.com");
return result;
}
}
2. LINQ
关键词:, ,
from
select
where
group
into
order by
join
LINQ(语言集成查询)提供了一种直接在 C# 中查询各种数据源(如数据库、集合和 XML)的简单方法,而无需与 ADO.NET 等其他框架交互。通过使用与 SQL 相同的语法,LINQ 使开发人员能够以可读的方式编写查询。
例
C#
var query = from student in students
where student.Age > 18
orderby student.Name
select student;
3. 属性
关键词:
property
属性主要是提供灵活机制来读取、写入或计算私有字段的值的成员。通常,我们隐藏内部私有支持字段并通过属性公开它们。这使调用方可以轻松访问数据。在下面的示例中,是隐藏名为 的支持字段的属性,标记为以避免外部调用方直接修改该字段。public
Name
name
private
C#
class Person
{
private string name; // backing field
public string Name // property
{
get { return name; }
set { name = value; }
}
}
class Program
{
static void Main(string[] args)
{
Person P1 = new Person();
P1.Name = "Sunny";
Console.WriteLine(myObj.Name);
}
}
4. 泛型
关键词:,
generic
<T>
泛型允许您为类编写代码,而无需指定类处理的数据类型。它是一个允许用户使用占位符定义类和方法的类。C#2.0 中泛型的引入完全改变了创建模块化可重用代码的格局,否则这些代码需要在多个地方复制。想象一下,您正在处理 2 个数字的加法,然后需要添加 s 或 datatypes。我们最终创建了相同的重复代码,因为我们已经在方法参数中使用数据类型定义了一个方法。泛型使定义占位符和处理不同数据类型的逻辑变得容易。int
float
double
int
C#
public class Print
{
// Generic method which can take any datatype as method parameter
public void Display<T>(T value)
{
Console.WriteLine($"The value is: {value}");
}
}
public class Program
{
public static void Main(string[] args)
{
Print print = new Print();
// Call the generic method with different data types
print.Display<int>(10);
print.Display<string>("Hello World");
print.Display<double>(20.5);
}
}
5. delegate和event
关键词:,
delegate
event
委托只不过是一个对象,它引用一个方法,你可以直接通过它调用它,而无需直接调用该方法。委托等效于 C++ 中的函数指针。委托是指向任何方法的类型安全指针。委托主要用于实现回调方法和处理事件。并且是 C# 中开箱即用的内置委托。delegate
Func<T>
Action<T>
另一方面,事件使类或对象能够在发生感兴趣的事件时通知其他类或对象。例如,考虑用户单击您网站上的按钮的场景。它生成一个事件(在本例中为按钮单击),由相应的事件处理程序代码处理
声明和实例化 :delegate
C#
public delegate void MyDelegate1(string msg); // declare a delegate
// This method will be pointed to by the delegate
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
public static void Main(string[] args)
{
// Instantiate the delegate
MyDelegate1 del = PrintMessage;
// Call the method through the delegate
del("Hello World");
}
启动事件并通过处理程序处理事件的示例代码:event
C#
// Declare a delegate
public delegate void Notify();
public class ProcessBusinessLogic
{
public event Notify ProcessCompleted; // Declare an event
public void StartProcess()
{
Console.WriteLine("Process Started!");
// Some actual work here..
OnProcessCompleted();
}
// Method to call when the process is completed
protected virtual void OnProcessCompleted()
{
ProcessCompleted?.Invoke();
}
}
public class Program
{
public static void Main(string[] args)
{
ProcessBusinessLogic bl = new ProcessBusinessLogic();
bl.ProcessCompleted += bl_ProcessCompleted; // Register event handler
bl.StartProcess();
}
// Event handler
public static void bl_ProcessCompleted()
{
Console.WriteLine("Process Completed!");
}
}
6. Lambda 表达式
关键词:,
lambda
=>
Lambda 表达式提供了一种表示方法的简单方法,在 LINQ 查询和定义短内联函数时特别有用。此功能允许开发人员在执行简单操作时无需传统方法定义,从而编写可读代码。Lambda 表达式使它们成为开发人员在使用 C# 时的宝贵工具,从而提高了代码的清晰度和效率。
C#
Func<int, int, int> add = (x, y) => x + y;
int result = add(3, 4); // result is 7
7. 可为 null 的类型
关键词:
?
在 C# 中,可为 null 的类型也允许值类型具有状态。当您使用可能具有值的数据库或数据源时,这会派上用场。在值类型后添加可帮助开发人员处理可能缺少或未定义数据的情况。这可以防止在代码运行时导致潜在错误。此功能通过提供一种清晰直接的方式来处理可选数据或缺失数据,使应用程序更加可靠。null
null
?
C#
int? num = null;
if (num.HasValue)
{
Console.WriteLine($"Number: {num.Value}");
}
else
{
Console.WriteLine("No value assigned.");
}
8. switch
case
关键词:,
switch
case
模式匹配是 C# 7.0 中引入的另一个有用功能,随后在该语言的后续版本中进行了一系列改进。模式匹配需要一个表达式,它有助于测试它是否匹配某个条件。我们可以以易于阅读的紧凑方式编写代码,而不是冗长的语句。在下面的示例中,我使用了 where I assign value(数据类型),然后使用模式匹配来打印它是哪种数据类型。if-else
object
5
int
例
C#
object obj = 5;
if (obj is int i)
{
Console.WriteLine($"Integer: {i}");
}
switch (obj)
{
case int j:
Console.WriteLine($"Integer: {j}");
break;
case string s:
Console.WriteLine($"String: {s}");
break;
default:
Console.WriteLine("Unknown type.");
break;
}
9. 扩展方法
关键字:(在方法签名中)
this
扩展方法允许开发人员向现有类型添加新方法,而无需更改其原始代码。这些方法是静态的,但其工作方式与扩展类型的实例方法类似,提供了一种添加新功能的流畅方式。扩展方法使代码更加模块化和可重用,使开发人员能够从外部库扩展类型,而不会弄乱原始代码。扩展方法还支持 “Open/Closed” 原则,这意味着代码对扩展开放,但对修改关闭。
C#
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
// Usage
string str = null;
bool result = str.IsNullOrEmpty(); // result is true
10. 元组
关键词:
tuple
元组允许您将多个值分组到一个单元中。当你想从一个方法发回多个值而不使用 out 参数或创建一个新类仅用于在对象之间传输数据时,它们会有所帮助。使用元组,您可以打包并返回一组相关值,这使我们的代码更易于阅读和理解。您可以为 Tuples 中的字段命名,也可以不为它们命名。然后,使用 和 引用值,如下所示。Item1
Item2
C#
public (int, string) GetPerson()
{
return (1, "John Doe");
}
// Usage
var person = GetPerson();
Console.WriteLine($"ID: {person.Item1}, Name: {person.Item2}");
通过使用 / 很好地处理任务,使用 LINQ 获取数据,确保数据安全,确保类型正确,以及对于对事件做出反应的程序,Lambda 表达式编写短函数,可空类型处理缺失信息,模式匹配使代码更清晰并说更多,扩展方法添加新功能, 和元组来很好地组织数据,您可以编写更易于管理且不太可能中断的代码。当您擅长使用这些功能时,您将能够构建响应迅速、可扩展且一流的应用程序