最近 .NET
社区的大新闻是微软将在明年退役 Visual Studio for Mac
这个产品,该消息在社区的引发了巨大的讨论。
当微软宣布不再支持 Visual Studio for Mac
之后,JetBrains
就立马宣布旗下 Rider
IDE 进行 65% 的折扣销售,可谓是杀人诛心。
这是一篇非常有意思的博客,作者尝试了将 Rust 代码生成的结果运行在 .NET CLR 上
2、使用 String.Globalization.StringInfo 计算 Unicode 字符的长度
在处理 Unicode
字符串的时候,我们需要知道字符串所占用的字节长度。尤其是涉及到 Emoji 时候,它有时候是多个 Unicode 字符串拼接而成,所以在 C# 中我们可以通过 String.Globalization.StringInfo.GetNextTextElementLength
方法来获得字符所占用的字节数量。
using System.Globalization;
var characters = new[] { "a", "1", "👩🚀", "あ", "👨👩👧👦", "✨" };
var lengths = characters.Select(c => (value: c, length: StringInfo.GetNextTextElementLength(c)));
foreach(var (val, length) in lengths)
{
Console.WriteLine($"{val} (length: {length}");
}
Visual Studio
是一款广泛使用的 IDE,那么对于 Visual Studio 还有一些隐藏的功能。
- Drag & Drop 添加工程应用
- GitHub Action 在 Visual Studio 解决方案视图
- CPU/Memory Profiler: 通过在不同断点之间开启 CPU profile
- 拷贝带缩进
- Visual Studio 通常会保存上次的 profile,但是 Visual Studio 支持在启动的时候配置不同的 profile.
- 清理不同的 Azure Functional 工具
- 内嵌展示诊断信息
- 智能 JSON 校验
- 不同事件播放不同声音
4、HttpClient DelegatingHandler
我们都知道 ASP.NET Core
通过中间件的方式,处理一个个请求,对于定制化的业务逻辑,我们可以编写自己的中间件。同样的在 HttpClient
类中,我们 DelegateHandler
也可以当作中间件,可以对client 发出的请求进行定制化处理,比如缓存请求。
internal class CacheHttpMessageHandler : DelegatingHandler
{
private readonly IMemoryCache _cache;
public CacheHttpMessageHandler(IMemoryCache cache)
{
_cache = cache;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var queryString = HttpUtility.ParseQueryString(request.RequestUri.Query);
var key = queryString["city"];
if (_cache.TryGetValue<string>(key, out var content))
{
return new HttpResponseMessage(System.Net.HttpStatusCode.NotModified)
{
Content = new StringContent(content)
};
}
var response = await base.SendAsync(request, cancellationToken);
content = await response.Content.ReadAsStringAsync();
_cache.Set<string>(key, content, TimeSpan.FromSeconds(10));
return response;
}
}
那么可以将它注册到容器中
IServiceCollection service = new ServiceCollection();
service.AddMemoryCache();
service.AddTransient<CacheHttpMessageHandler>();
service.AddHttpClient("httpbin")
.AddHttpMessageHandler<CacheHttpMessageHandler>();
IServiceProvider provider = service.BuildServiceProvider();
var httpClientFactory = provider.GetService<IHttpClientFactory>();
HttpClient httpClient = httpClientFactory.CreateClient("httpbin");
for (int i = 0; i < 20; i++)
{
using var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://httpbin.org/get?city=beijing");
using var response = await httpClient.SendAsync(httpRequestMessage);
Console.WriteLine(response.StatusCode);
await Task.Delay(TimeSpan.FromSeconds(1));
}
这是一份来自 Stephen Toub
的文章,介绍了如何使用 Semantic Kernal
和 Azuer OpenAI
来一步步创建一个 .NET
的对话应用程序。
using System.Collections;
IStructuralEquatable one = new ValueTuple<int, int, int, int, int>(1, 2, 3, 4, 5);
IStructuralEquatable two = new ValueTuple<int, int, int, int, int>(1, 2, 3, 5, 5);
Console.WriteLine(one.Equals(two, EqualityComparer<int>.Default));
上面这段代码的返回输出是什么?应该是 false
,因为第四个元素的值不一样,但是在目前的 .NET
SDK 中,编译出来的结果是 true
。这是 .NET
BCL 的 bug,因为 Tuple
类型的 Equal
方法跳过了第四个元素。
目前 Fix
PR 已经合并。
在 C#
的控制台应用程序中,我们有时候需要输出一些表格的内容来更加直观的展示内容。ConsoleTables
这个开源库可以帮助我们很方便的输出。使用方法也是非常简单
var table = new ConsoleTable("one", "two", "three");
table.AddRow(1, 2, 3)
.AddRow("this line should be longer", "yes it is", "oh");
table.Write();
淡然可以控制输出表格的样式
var rows = Enumerable.Repeat(new Something(), 10);
ConsoleTable
.From<Something>(rows)
.Configure(o => o.NumberAlignment = Alignment.Right)
.Write(Format.Alternative);
这是 Visual Studio 的可以插件,当你把鼠标放在上面的时候,它会根据图片的地址获取,然后以缩略图的方式展示出来。支持下面的图片路径格式
- 绝对 URI 地址
- 相对 URI 地址
- 文件路径
- 数据 URI
- 包 URI
CSharpier
是一个 .NET
的代码格式化工具。首先安装工具
dotnet tool install csharpier -g
然后使用 dotnet charpier .
命令可以格式化相应的 .NET
项目。