今年 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
插件可以帮助我们方便的完成,只要选择该文件,然后输入开始字符,结束字符会自动开结尾添加上。