草庐IT

C# 专家:有经验的开发者应该掌握的三个高级特性

Linux迷 2023-03-29 原文

​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# 专家或渴望成为一个专家,一定要将这些功能添加到您的工具箱中,并将您的编码水平提升到更高的水平。

有关C# 专家:有经验的开发者应该掌握的三个高级特性的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  7. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  8. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐