如果您能正确回答这 7 个概念,那么您在 .NET 方面就不错了

作者:微信公众号:【架构师老卢】
9-15 19:22
105

本文深入探讨了每个开发人员都必须了解的不同 C# 概念。测试您的知识总是一个好主意,我在本文中汇总了一些示例,其中包含解释和代码示例。

如果您了解并理解代码示例,则您可能在 .NET 方面做得很好。

1. 与IEnumerable<T>ICollection<T>

在 C# 中编写逻辑时,开发人员经常会遇到 和 。它们可能看起来非常相似,但它们在软件开发中的用途不同。IEnumerable<T>ICollection<T>

  • **IEnumerable<T>**充当非泛型集合的基接口。它有助于迭代已定义类型的集合。

最好有一个更安全的轻量级集合,因为不允许数据操作。任何集合 如果你想防止数据操作,建议使用IEnumerable<T>

IEnumerable<int> numbers = new List<int> { 1, 2, 3 };   
  
foreach (var number in numbers) {       
    
  Console.WriteLine(number); // Outputs: 1 2 3   
}
  • **ICollection<T>**extends 允许在 change 方法的帮助下进行修改。此接口包含用于在集合中添加、删除和检查 count 的方法。IEnumerable<T>
ICollection<int> data = new List<int> { 12,43,556};   
numbers.Add(4);   
Console.WriteLine(data.Count); // Outputs: 4

当集合和简单读取操作需要 alter methods 时,建议使用 TRANSFORM。ICollection<T>IEnumerable<T>

2. 依赖项注入在 .NET Core 中的作用

当你想编写松散耦合且可测试的代码时,建议使用DI设计模式。使用 DI,开发人员可以轻松管理类之间的依赖关系。

.NET Core 具有对 DI 的内置支持,使其易于实现。

开发人员如何在 C 中实现 DI#

  • 在文件的方法中注册服务。您可以在此处定义哪些服务可用于注入。ConfigureServicesStartup.cs
public void ConfigureServices(IServiceCollection services) {       
  // Register a transient service   
  services.AddTransient<IMyService, MyService>();   
}
  • 通过构造函数注入将服务注入到您的类中。这可确保您的类接收其依赖项,而无需直接创建它们。
public class MyController : Controller  
{  
    private readonly IMyService _myService;  
    public MyController(IMyService myService) { _myService = myService; }  
    public IActionResult Index() {   
        var data = _myService.GetData();   
        return View(data);   
    }  
}

当开发人员将服务的创建解耦时,代码的可维护和可测试性更强。

3. AND 参数的区别refout

在 C# 中,用于通过引用传递参数,但它们具有不同的特征。refout

  • refparameters 要求在将变量传递给方法之前对其进行初始化。然后,该方法可以修改变量的值。
public void UpdateValue(ref int number)  
{  
    number += 10;  
}  
  
int myNumber = 5;  
UpdateValue(ref myNumber);  
Console.WriteLine(myNumber); // Outputs: 15
  • out参数在传递之前不需要初始化。该方法必须在返回参数之前为参数分配一个值。out
public void GetValues(out int value1, out int value2)  
{  
    value1 = 10;  
    value2 = 20;  
}  
  
GetValues(out int a, out int b);  
Console.WriteLine(a); // Outputs: 10  
Console.WriteLine(b); // Outputs: 20

ref通常在方法需要修改现有变量时使用,而当方法需要返回多个值或初始化调用方未提供的值时使用。out

4. Async 和 Await:提高应用程序性能

在 .NET 中,异步编程对于编写在负载下性能良好的高效应用程序至关重要。和 关键字简化了异步操作的使用。asyncawait

  • async方法允许您异步执行任务。使用关键字标记方法,以允许在其内部使用 。asyncawait
public async Task<string> FetchDataAsync()  
{  
    await Task.Delay(1000); // Simulates an asynchronous operation  
    return "Data fetched";  
}
  • await通过不阻塞主线程来帮助应用程序 UI。
public async Task ShowDataAsync()  
{  
    string data = await FetchDataAsync();  
    Console.WriteLine(data);  
}

摘要:如果您想提高应用程序的性能,请有效地使用 async 和 await,同时保持应用程序 UI 的响应性。

5. .NET Core 应用程序中的异常处理

妥善处理异常对于维护健壮且用户友好的应用程序至关重要。.NET Core 提供了各种异常处理机制。

  • **本地异常处理:**使用 try-catch 块捕获和处理异常。
try  
{  
    int result = 10 / 0; // This will throw a DivideByZeroException  
}  
catch (DivideByZeroException ex)  
{  
    Console.WriteLine("An error occurred: " + ex.Message);  
}
  • ASP.NET Core 中的全局异常处理可以使用中间件进行管理。在一个公共位置捕获所有类型的异常,这有助于开发人员为用户管理用户友好/常见的错误消息。
public void Configure(IApplicationBuilder app)  
{  
    app.UseExceptionHandler("/Home/Error");  
}

全局异常处理中间件提供了一个处理所有应用程序错误和异常的公共位置。它确保应用程序一致地处理响应。

6. ASP.NET 核心的作用appsettings.json

该文件用于管理应用程序凭证,例如配置字符串和其他特定于应用程序的密钥。配置设置也可以根据环境进行划分appsettings.json

  • 示例 文件:appsettings.json
{  
  "ConnectionStrings": {  
    "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"  
  },  
  "Logging": {  
    "LogLevel": {  
      "Default": "Warning"  
    }  
  }  
}
  • 使用内置配置系统访问应用程序中的配置值非常简单。
public class MyService  
{  
    private readonly string _connectionString;  
  
    public MyService(IConfiguration configuration)  
    {  
        _connectionString = configuration.GetConnectionString("DefaultConnection");  
    }  
}

该文件允许轻松获取配置设置,需要有效地处理。appsettings.json

7. 理解 vs. 在 C 语言中#TaskThread

两者都用于 C# 中的并发编程,但它们的用途不同。TaskThread

  • Thread表示单个执行路径,并且是较低级别的构造。它提供了对执行的更多控制,但需要手动管理。
Thread thread = new Thread(() =>  
{  
    Console.WriteLine("Running on a new thread");  
});  
  
thread.Start();
  • Task提供用于实现异步操作的抽象功能,并与 async/await 一起使用。
Task.Run(() =>  
{  
    Console.WriteLine("Running asynchronously");  
});

任务简化了异步操作的管理,通常是现代 C# 开发的首选。

相关留言评论
昵称:
邮箱:
阅读排行