Skip to content

Latest commit

 

History

History
150 lines (99 loc) · 6.53 KB

episode-036.md

File metadata and controls

150 lines (99 loc) · 6.53 KB

.NET 每周分享第 36 期

卷首语

image

今年 Microsoft Build 大会在 5 月份召开,其中最重要的关键词就是 AICopliot。当然对于 .NET也是有涉及,主要是在性能上的提升,还介绍了 Windows11 的 DevHome, 可以非常方便开发者进行环境搭建,开发机器性能监控和 GitHub 看板功能。

行业资讯

1、Fleet C# 支持更新

image

JetBrains 更新了 Fleet 对 C# 支持的特性,主要包括

  1. 解决方案视图
  2. Build/Rebuild/Clean 操作
  3. 单元测试

2、Visual Studio UI 更新

image

Visual Studio 团队打算遵循 Fluent UI 的为 VS 重新设计 UI 界面,主要处于下面三个考虑

  • 一致性
  • 可访问行
  • 效率

下拉菜单对比:

image

2、Visual Studio Sticky 滚动

image

Sticky 是一个非常使用的功能,非常类似在 Excel 中将表头固定,然后向下翻动行。在编写代码的时候,有很多 for, foreach 等循环,如果循环体非常长,或者存在嵌套循环,那么这个功能还是非常有用的。

文章推荐

1、NET 8 中 NativeAOT 编译

image

.NET 8 中支持 Native AOT 编译,也就是说编译出来的应用程序就是原生的应用程序,而不是需要 .NET 运行时才能的执行,跟 RustGo 一样。 只需要在 csproj 文件中配置 <publishAot>true<publishaot> 即可。

2、C# IDisposable 和 Go defer 的区别

image

C#Go 中有两个非常相似的功能叫,分别为 IDisposabledefer, 通常是在方法执行完毕后,执行一些清理工作。比如关闭开打的文件流和网络 socket。但是这两者还是有一些区别

  • IDisposable 并不保证的 Dispose 方法肯定被调用,除非放在 using 的语句块中,而且变量离开了作用域就会执行。
  • defer 只会在函数 return 之后才会执行,而且肯定会执行。

3、正确的输出日志

image

日志是应用程序中不可或缺的的组成部分,随着 Microsoft.Extensions.Logging 扩展包推出,不同的日志输出源只要配置好 LoggerProvider 就可以了。 ILoggerLogInformation, LogWarning 方法就是公开的接口,方法签名是这样的

/// <summary>
/// Formats and writes an informational log message.
/// </summary>
/// <param name="logger">The <see cref="ILogger"/> to write to.</param>
/// <param name="message">Format string of the log message in message template format. Example: <c>"User {User} logged in from {Address}"</c></param>
/// <param name="args">An object array that contains zero or more objects to format.</param>
/// <example>logger.LogInformation("Processing request from {Address}", address)</example>
public static void LogInformation(this ILogger logger, string? message, params object?[] args)

请注意第三个参数 message, 但是注释中却是 message template format。所以我们的日志是应该这样

logger.LogInformation("data: {Data}, {now}", Data, DateTime.Now);

而不是这样

logger.LogInformation($"data: {Data}, {DateTime.Now}");

应为日志库是将模板缓存下来,而不是在输出的时候,就开始构造日志字符串。benchmark 测试

[MemoryDiagnoser]
public class BenchmarkLogging
{
    public static readonly ILogger logger;

    public static readonly Random random;

    private int Data => random.Next();

    static BenchmarkLogging()
    {
        logger = new LoggerFactory().CreateLogger<BenchmarkLogging>();
        random = new Random();
    }

    [Benchmark]
    public void Templated()
    {
        logger.LogInformation("data: {Data}, {now}", Data, DateTime.Now);
    }

    [Benchmark]
    public void Interpolated()
    {
        logger.LogInformation($"data: {Data}, {DateTime.Now}");
    }

    [Benchmark]
    public void Formatted()
    {
        logger.LogInformation(string.Format("data: {0}, {1}", Data, DateTime.Now));
    }
}

image

可以看出,模板方法在性能和内存方面都优势。

4、.NET 云应用程序

image

最近 InfoQ 组织了一场讨论 .NET 和云应用迁移的讨论,主要包含下面主题

  • .NET 开发者在面对云的主要痛点
  • 最小的迁移成本
  • 当迁移到云之后,下一步该怎么办
  • 选择 Serverless 还是 Kubernetes
  • 托管容器平台
  • 除了 App Service 还有其他最有选择
  • ....

开源项目

1、Visual Studio 环绕选择

image

在编辑器中,我们常常需要一个功能就选择为一段文本或者代码添加双引号,括号等等。通常我们的操作是分别找到开始位置和结束位置,然后分别输入开始字符和结束字符。Surrounder 插件可以帮助我们方便的完成,只要选择该文件,然后输入开始字符,结束字符会自动开结尾添加上。