Skip to content

Latest commit

 

History

History
215 lines (153 loc) · 6.4 KB

episode-047.md

File metadata and controls

215 lines (153 loc) · 6.4 KB

.NET 每周分享第 47 期

卷首语

2023 年最后一期,感谢大家一直以来的支持,我们会在 2024 年继续为大家带来更多的内容。

image

行业资讯

1、.NET 8 Hack 活动获奖

image

前几个月 .NET 社区发起了 "黑客"活动,最近这个活动的获奖情况揭晓:

  • 最佳:NASA TechPort Headlines
  • AI 最佳:Betakads
  • 云原生最佳:AI Counselor

2、.NET Conf 2023 回顾

image

2023 年的 .NET Conf 已经结束,这个文章给出活动的回顾,主要有:

  • 全局视频列表
  • 幻灯片和 Demo 代码
  • eShop 应用程序
  • 客户故事
  • 本地 .NET 活动

文章推荐

1、HttpClient 定制化日志

image

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() 方法。

2、All 和 TrueForAll

image

List 类型中有一个 TrueForAllIEnumerableAll 方法都是完成同一件事,但是它们在性能上有显著的区别。

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");
}

4、为什么我现在不用 Aspire

image

作者在使用了 Aspire 之后,给出了负面的评价,观点如下

  • 启动太复杂
  • 所有项目都在同一个解决方案下
  • 在 Linux 下,本地环境非常难管理

5、c# 中的不可变类型

image

Immutable 类型有很多好处,在 C# 中存在两种不可变类型

  • 基础类型,比如 int, double 等
  • 值类型,比如 struct

除此之外,还有 System.Collections.Immutable 命名空间下类型。如果要对不可变类型做修改,通常是需要创建也给新的对象,比如在 switch 和 with 语句是现代 C# 代码创新不可变类型的方法。

6、Visual Studio Git 集成汇总

image

过去一年 Visual StudioGit 上面的提升汇总。

开源项目

1、GitHub Action Visual Studio 插件

image

Visual Studio 包含了 GitHub Action 的插件,它可以帮助我们浏览,管理和运行 GitHub Action.

2、Cocona

image

Cocona 库可以帮助我们非常简单写出应用台应用程序。

using Cocona;

CoconaApp.Run((string name) =>
{
    Console.WriteLine($"hello {name}");
});

这样运行 dotnet run -- --name .netwekly 就可以输出 hello .netweekly