.NET 每周分享第 36 期
卷首语
今年 Microsoft Build 大会在 5 月份召开,其中最重要的关键词就是 AI 和 Copliot。当然对于 .NET也是有涉及,主要是在性能上的提升,还介绍了 Windows11 的 DevHome, 可以非常方便开发者进行环境搭建,开发机器性能监控和 GitHub 看板功能。
行业资讯
JetBrains 更新了 Fleet 对 C# 支持的特性,主要包括
- 解决方案视图
- Build/Rebuild/Clean 操作
- 单元测试
Visual Studio 团队打算遵循 Fluent UI 的为 VS 重新设计 UI 界面,主要处于下面三个考虑
- 一致性
- 可访问行
- 效率
下拉菜单对比:
Sticky 是一个非常使用的功能,非常类似在 Excel 中将表头固定,然后向下翻动行。在编写代码的时候,有很多 for, foreach 等循环,如果循环体非常长,或者存在嵌套循环,那么这个功能还是非常有用的。
文章推荐
.NET 8 中支持 Native AOT 编译,也就是说编译出来的应用程序就是原生的应用程序,而不是需要 .NET 运行时才能的执行,跟 Rust 和 Go 一样。
只需要在 csproj 文件中配置 <publishAot>true<publishaot> 即可。
2、C# IDisposable 和 Go defer 的区别
C# 和 Go 中有两个非常相似的功能叫,分别为 IDisposable 和 defer, 通常是在方法执行完毕后,执行一些清理工作。比如关闭开打的文件流和网络 socket。但是这两者还是有一些区别
IDisposable并不保证的Dispose方法肯定被调用,除非放在using的语句块中,而且变量离开了作用域就会执行。defer只会在函数return之后才会执行,而且肯定会执行。
3、正确的输出日志
日志是应用程序中不可或缺的的组成部分,随着 Microsoft.Extensions.Logging 扩展包推出,不同的日志输出源只要配置好 LoggerProvider 就可以了。 ILogger 的 LogInformation, 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));
}
}
可以看出,模板方法在性能和内存方面都优势。
最近 InfoQ 组织了一场讨论 .NET 和云应用迁移的讨论,主要包含下面主题
.NET开发者在面对云的主要痛点- 最小的迁移成本
- 当迁移到云之后,下一步该怎么办
- 选择
Serverless还是Kubernetes - 托管容器平台
- 除了
App Service还有其他最有选择 - ....
开源项目
在编辑器中,我们常常需要一个功能就选择为一段文本或者代码添加双引号,括号等等。通常我们的操作是分别找到开始位置和结束位置,然后分别输入开始字符和结束字符。Surrounder 插件可以帮助我们方便的完成,只要选择该文件,然后输入开始字符,结束字符会自动开结尾添加上。
