C# 静态 public 字段用于增量线程 actor 执行
C# Static public fields for increment thread actors execution
我正在使用 AKKA.net 构建一个系统(可能与这个问题无关)并且我有一个 class 负责计算演员的数量 运行 (对于谁不知道演员他们可以看作是简化的线程)。所以基本上我有一个静态 public 字段:
class MyClass{
public static long TotalOutstandingRequests;
}
我 increment/decrement 它在 actors/threads 里面(因为我有演员 start/run 其他演员)与:
Interlocked.Increment(ref MyClass.TotalOutstandingRequests);
Interlocked.Decrement(ref MyClass.TotalOutstandingRequests);
发生的事情是 IDE 和互联网说拥有 public 静态字段是个坏主意,所以我想知道是否有其他方法可以解决我的问题,或者不,如果完全可以,让事情保持原样。
如果你使用得当,这样也未尝不可。
无论如何,你可以公开一些静态方法,比如:
public static long AddRequest()
{
return Interlocked.Increment (ref _totalOutstandingRequests);
}
public static long RemoveRequest()
{
return Interlocked.Decrement (ref _totalOutstandingRequests);
}
public static long GetRequests()
{
return _totalOutstandingRequests;
}
这个坏主意是因为它可以变成非静态超时(在你开发的时候)。
为什么这么问?仅仅是因为在某个时间点你会想要这个静态依赖的非静态依赖。无论是记录器、数据库、助手 class、服务、连接,无论什么都有不同的生命周期。
另一方面,对于非静态,您可以通过确保创建一次或使用依赖注入轻松管理单例静态 和其他可能的生命周期(是的,有多个生命周期,例如 per-connection、per-session、per-thread 等)。
所以解决方案:
public class MyClass
{
public long TotalOutstandingRequests;
private readonly ILogger _logger;
//some incrementing, decrementing code here
public MyClass(ILogger logger)
{
_logger = logger;
}
public void AddRequest()
{
Interlocked.Increment(ref TotalOutstandingRequests);
_logger.Debug("New request here!");
}
}
那么什么时候使用静态呢?简单:
- 当您确定它没有依赖性,将来不会有依赖性并被刻在石头上时(语言扩展,例如 LINQ、Regex、任何辅助方法、常量等)
- 您使用非托管代码(调用 windows 函数等)。
除了这两种情况,我从来没有遇到过没有静态代码就活不下去的代码。
PS
如果是家庭项目-你可以忘记我说的,按照你想要的方式去做=)
我正在使用 AKKA.net 构建一个系统(可能与这个问题无关)并且我有一个 class 负责计算演员的数量 运行 (对于谁不知道演员他们可以看作是简化的线程)。所以基本上我有一个静态 public 字段:
class MyClass{
public static long TotalOutstandingRequests;
}
我 increment/decrement 它在 actors/threads 里面(因为我有演员 start/run 其他演员)与:
Interlocked.Increment(ref MyClass.TotalOutstandingRequests);
Interlocked.Decrement(ref MyClass.TotalOutstandingRequests);
发生的事情是 IDE 和互联网说拥有 public 静态字段是个坏主意,所以我想知道是否有其他方法可以解决我的问题,或者不,如果完全可以,让事情保持原样。
如果你使用得当,这样也未尝不可。
无论如何,你可以公开一些静态方法,比如:
public static long AddRequest()
{
return Interlocked.Increment (ref _totalOutstandingRequests);
}
public static long RemoveRequest()
{
return Interlocked.Decrement (ref _totalOutstandingRequests);
}
public static long GetRequests()
{
return _totalOutstandingRequests;
}
这个坏主意是因为它可以变成非静态超时(在你开发的时候)。
为什么这么问?仅仅是因为在某个时间点你会想要这个静态依赖的非静态依赖。无论是记录器、数据库、助手 class、服务、连接,无论什么都有不同的生命周期。
另一方面,对于非静态,您可以通过确保创建一次或使用依赖注入轻松管理单例静态 和其他可能的生命周期(是的,有多个生命周期,例如 per-connection、per-session、per-thread 等)。
所以解决方案:
public class MyClass
{
public long TotalOutstandingRequests;
private readonly ILogger _logger;
//some incrementing, decrementing code here
public MyClass(ILogger logger)
{
_logger = logger;
}
public void AddRequest()
{
Interlocked.Increment(ref TotalOutstandingRequests);
_logger.Debug("New request here!");
}
}
那么什么时候使用静态呢?简单:
- 当您确定它没有依赖性,将来不会有依赖性并被刻在石头上时(语言扩展,例如 LINQ、Regex、任何辅助方法、常量等)
- 您使用非托管代码(调用 windows 函数等)。
除了这两种情况,我从来没有遇到过没有静态代码就活不下去的代码。
PS
如果是家庭项目-你可以忘记我说的,按照你想要的方式去做=)