C# 就像约会一样,既令人沮丧又充满回报。在我作为一名 C# 开发人员的经历中,我被高水平的程序员所包围,他们推动我认识到在这个行业中取得成功需要付出多大的努力。
本文将介绍 3 个高级的、必须掌握的 C# 特性,这些特性将让您成为一个编程专家,并将您的面向对象编程和 C# 技能提升到新的高度。
1、LINQ(语言集成查询)
简单来说,这是一组工具,可以方便地操作可枚举类型(例如 List、Dictionary 等)的数据。这个工具包括基于预设的 predicates/requirements 的方法来修改变量:
using System;
using System.Collections.Generic;
using Systems.Linq;
public class LinqMethodExample
{
public static void Main(string[] args)
{
// 创建一个整数列表。
var listOfNumbers = new List<int> { 10, 5, 20, 15, 30, 25, 33, 66 };
// 执行各种LINQ方法。
var result = listOfNumbers
.Where(num => num % 5== 0) // 得到可被5整除的数字。
.Select(num => (int)Math.Pow(num, 2)) // 将每个数字平方。
.Skip(1) // 跳过第一个元素。
.Last(num => num % 2 == 0) // 得到最后一个偶数。
Console.WriteLine($"{result}");
// 样例输出:
// 900
}
}
还有其他方法,比如:
- OrderBy() -> 根据谓词按升序对序列进行排序。
- GroupBy() -> 根据谓词对元素进行分组。
- SelectMany() -> 扁平化嵌套列表(即从 List<List<int>> 提取 List<int>)。
- Join() -> 根据谓词连接两个序列。
- Zip() -> 将两个序列组合成元组的单个序列。
- Distinct() -> 从序列中返回不同的元素。
这只是一个简单的示例,展示了 LINQ 方法的强大之处。这些方法的可扩展性和应用取决于您作为一名工程师的决策。在 LINQ 库中存在许多更多的方法。
2、异步编程
这是一种简单的技术,允许程序在不阻塞主线程的情况下运行多个不同过程的任务。
与等待任务完成不同,异步任务允许其他任务同时继续执行。这有助于提高应用程序的响应性和性能,通常可以使用 async 或 await 关键字来实现。下面的代码以异步方式执行三个任务。也就是说,如果编译此代码,您将看到这三个任务将同时运行,并在不同的时间完成:
using System;
using System.Threading.Tasks;
public class AsyncProgramming
{
public static async Task RandomDelayAsync(int workId)
{
// 为此给定任务设置一个随机延迟值(1s-5s)。
var rand = new Random();
var delay = rand.Next(1000, 5000);
await Task.Delay(delay);
// 打印消息,以便用户知道此任务何时完成。
Console.WriteLine($"Work {workId} completed in {delay}ms.");
}
public static async Task Main()
{
// 创建一个由3个任务组成的数组以异步执行。
var tasks = new Task[3];
for (var idx=0; idx < tasks.Length; idx++)
{
tasks[idx] = RandomDelayAsync(idx);
}
// 等待所有任务完成。
await Task.WhenAll(tasks);
Console.WriteLine("All tasks completed.");
// 示例输出:
// Work 2 completed in 1014ms.
// Work 0 completed in 2329ms.
// Work 1 completed in 4392ms.
// All tasks completed.
}
}
3、委托和事件
简单来说,这些工具提供了一种定义回调方法签名的方式,并提供了一种将事件处理程序附加/分离到事件的方式。
换句话说,委托就像你给别人的电话号码,事件就像通话后出现的语音邮件。当事件发生时,它是由电话号码通话引起的,代码会响应并做出相应的操作,比如触发一个语音邮件:
using System;
public class DelegateAndEventExample
{
// 声明表示方法的委托类型
// 不接受任何参数并返回void。
public delegate void PhoneNumber();
public class Class
{
// 声明类型为PhoneNumber的事件。
public event PhoneNumber VoiceMail;
// 定义引发事件的方法。
public void CallPhoneNumber()
{
Console.WriteLine("Calling the phone number...");
MyEvent?.Invoke();
}
}
public static void Main()
{
var instance = new MyClass();
// 使用lambda表达式将方法附加到语音邮件事件。
instance.VoiceMail += () => Console.WriteLine("Event handler called!");
// 调用CallPhoneNumber方法,该方法会引发语音邮件事件。
instance.CallPhoneNumber();
// 示例输出:
// Calling the phone number...
// Event handler called!
}
}
总之,掌握 LINQ、异步编程和委托/事件对于经验丰富的 C# 开发人员来说是必不可少的,他们的目标是提高编码技能。通过利用这些强大的功能,开发人员可以编写更高效、简洁和灵活的代码,轻松处理复杂操作。因此,如果您是一个 C# 专家或渴望成为一个专家,一定要将这些功能添加到您的工具箱中,并将您的编码水平提升到更高的水平。