2023 年最后一期,感谢大家一直以来的支持,我们会在 2024 年继续为大家带来更多的内容。
前几个月 .NET
社区发起了 "黑客"活动,最近这个活动的获奖情况揭晓:
- 最佳:NASA TechPort Headlines
- AI 最佳:Betakads
- 云原生最佳:AI Counselor
2023 年的 .NET Conf
已经结束,这个文章给出活动的回顾,主要有:
- 全局视频列表
- 幻灯片和 Demo 代码
- eShop 应用程序
- 客户故事
- 本地
.NET
活动
HttpClient
默认的日志格式是这样的
info: System.Net.Http.HttpClient.my-client.LogicalHandler[100]
Start processing HTTP request GET https://www.google.com
如果想要定制化,可以实现 IHttpClientLogger
接口
public class HttpLogger : IHttpClientLogger
{
private readonly ILogger<HttpLogger> _logger;
public HttpLogger(ILogger<HttpLogger> logger)
{
_logger = logger
}
public void LogRequestFailed(object? context, HttpRequestMessage request, HttpResponseMessage? response, Exception exception, TimeSpan elapsed)
{
}
public object? LogRequestStart(HttpRequestMessage request)
{
}
public void LogRequestStop(object? context, HttpRequestMessage request, HttpResponseMessage response, TimeSpan elapsed)
{
}
}
这样可以将它注册到容器中
service.AddSingleton<IHttpClientLogger, HttpLogger>();
service.AddHttpClient("my-client", client =>
{
client.BaseAddress = new Uri("https://www.google.com");
}).RemoveAllLoggers().AddLogger<IHttpClientLogger>(true);
为了移除默认的日志格式,需要调用 RemoveAllLoggers()
方法。
在 List
类型中有一个 TrueForAll
和 IEnumerable
中 All
方法都是完成同一件事,但是它们在性能上有显著的区别。
public class Benchmarks
{
private List<int> _list;
[GlobalSetup]
public void Setup()
{
Random rnd = new Random(42);
_list = Enumerable.Range(0, 1000).Select(i => rnd.Next()).ToList();
}
[Benchmark(Baseline = true)]
public bool All()
{
return _list.All(x => x < 1000);
}
[Benchmark]
public bool TrueForAll()
{
return _list.TrueForAll(x => x < 1000);
}
}
它们在性能和内存使用上,TrueForAll
有着显著的优势。它们区别这在于
public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
foreach (TSource element in source)
{
if (!predicate(element))
{
return false;
}
}
return true;
}
public bool TrueForAll(Predicate<T> match)
{
for (int i = 0; i < _size; i++)
{
if (!match(_items[i]))
{
return false;
}
}
return true;
}
答案显而易见,因为 All
方法使用 Foreach
方法,因为它存在装箱和拆箱的操作。
3、OR 操作符
C# 中 or
操作符可以简化 ||
操作。
if (student.Grade == Grade.Excellent ||
(student.Grade == Grade.Good)
{
Console.WriteLine("Well done");
}
那么 OR
操作符可以简化成一行代码
if (student.Grade is Grade.Excellent or Grade.Good)
{
Console.WriteLine("Well done");
}
作者在使用了 Aspire
之后,给出了负面的评价,观点如下
- 启动太复杂
- 所有项目都在同一个解决方案下
- 在 Linux 下,本地环境非常难管理
Immutable
类型有很多好处,在 C#
中存在两种不可变类型
- 基础类型,比如 int, double 等
- 值类型,比如 struct
除此之外,还有 System.Collections.Immutable
命名空间下类型。如果要对不可变类型做修改,通常是需要创建也给新的对象,比如在 switch 和 with
语句是现代 C#
代码创新不可变类型的方法。
过去一年 Visual Studio
在 Git
上面的提升汇总。
1、GitHub Action Visual Studio 插件
Visual Studio 包含了 GitHub Action
的插件,它可以帮助我们浏览,管理和运行 GitHub Action
.
2、Cocona
Cocona
库可以帮助我们非常简单写出应用台应用程序。
using Cocona;
CoconaApp.Run((string name) =>
{
Console.WriteLine($"hello {name}");
});
这样运行 dotnet run -- --name .netwekly
就可以输出 hello .netweekly
。