.net 知识拾遗

计时 GetElapsedTime

Stopwatch被广泛用于测量运行时的性能。到目前为止,存在的问题是,使用Stopwatch需要分配堆内存。为了解决这个问题,dotnet 社区实现了一个静态函数GetTimestamp(),它仍然需要一个复杂的逻辑来有效地获得时间差。.net 7现在又实现了另一个静态方法,名为GetElapsedTime(),在这里你可以传递之前的时间戳,并在不分配堆内存的情况下获得经过的时间。

[Benchmark(Baseline = true)]
public TimeSpan OldStopwatch()
{
    Stopwatch sw = Stopwatch.StartNew();
    return sw.Elapsed;
}

[Benchmark]
public TimeSpan NewStopwatch()
{
    long timestamp = Stopwatch.GetTimestamp();
    return Stopwatch.GetElapsedTime(timestamp);
}

using语句

使用大括号的using

using 语句可确保正确使用IDisposable实例:

var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
}

当执行流程离开 using 语句块时,将释放获取的IDisposable实例。 using 语句可确保即使在 using 语句块内发生异常的情况下也会释放可释放实例。 在前面的示例中,打开的文件在处理完所有行后关闭。

使用 await using 语句来正确使用IAsyncDisposable实例:

await using (var resource = new AsyncDisposableExample())
{
    // Use the resource
}
不需要大括号的 using 声明
static IEnumerable<int> LoadNumbers(string filePath)
{
    using StreamReader reader = File.OpenText(filePath);
    
    var numbers = new List<int>();
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
    return numbers;
}

在 using 声明中进行声明时,局部变量在声明它的作用域末尾释放。 在前面的示例中,会在某个方法的末尾释放对象。

由 using 语句或声明进行声明的变量是只读的。 无法重新分配该变量或将其作为ref或out参数传递。

匿名对象与dynamic

与COM对象、动态语言交互或处理反射时,dynamic类型非常有用。在与COM对象进行交互时,我们通常需要进行类型转换和调用COM对象的特定方法。使用dynamic类型可以在运行时动态地解析和调用COM对象的成员,而无需进行显式的类型转换。

示例:

void Func()
{
    Socket socketWatch = new  Socket(...);
    int deviceType = 1;
    Thread a = new   Thread(Listen);
    a.IsBackground = true;
    a.start(new {item1 = socketWatch, item2 = deviceType});
}

private void Listen(dynamic o)
{

        Socket socketSend = o.item1;
        if(o.item2 == 2)
        {

            Log.information("类型2");
        }
        else if(o.item2 == 1)
        {
            Log.information("类型1")
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破浪征程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值