如何在 C# 中包装函数,就像在 C 中使用内联标头函数一样

本文关键字:函数 一样 包装 | 更新日期: 2023-09-27 18:31:50

我正在用 c# 编写一些具有函数的类

Print(string s)

在上一版本中,我发现这个函数从许多线程调用,每次调用这个函数时都应该被锁定。在 C 语言中,我可以将此函数重命名为

PrintA(string s) 

并将头文件更改为类似

#define Print(a) {Lock(PrintA) //
                  { //
                      PrintA(a) //
                  } //
                 } 

是否可以用 C# 编写这样的东西?我只想在整个代码中更改一个位置而不是多个位置。

如何在 C# 中包装函数,就像在 C 中使用内联标头函数一样

C# 中没有宏。若要向方法添加同步,可以使用:

void Print(string s)
{
    lock (lockObject) { PrintA(s); }
}

您需要定义一个锁定对象,只需向类添加一个字段即可

private readonly object lockObject = new object();

不太推荐使用 [MethodImpl(MethodImplOptions.Synchronized)],因为它使用 this 作为锁定对象,这意味着用户可能会干扰锁定逻辑并导致死锁。

如果要锁定整个方法,可以使用[MethodImpl(MethodImplOptions.Synchronized)]属性来装饰它:

[MethodImpl(MethodImplOptions.Synchronized)]
public void Print(string s)
{
    ...
}

对于更具体的控件,您必须在代码块上使用lock