计时 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")
}
}