class - 什么是无状态类?

标签 class c#-4.0 stateless

我想知道无状态类的缺点是什么(如果有的话)? 有没有人见过一个真实世界的应用程序,其中某些用例强制创建无状态类(请不要问候世界)? 我认为无状态类意味着没有任何字段的类。

最佳答案

这是一个真实世界的例子: Writing plugins for Microsoft Dynamics CRM .

在该文档中,您会看到一条说明:“插件的 Execute 方法应编写为无状态的”。 基本上,无状态类意味着不应该有全局变量(除了一些特殊情况,除非有人问,否则我不会讨论)。

CRM 强制插件开发人员这样做的原因是因为 CRM 试图通过缓存和重用插件类的实例来提高性能。 CRM 执行其插件的方式大致如下:

主线程:

YourCustomPlugin yourCustomPluginCached = new YourCustomPlugin();

然后: 线程 1:

yourCustomPluginCached.Execute(context1);

和线程 2:

yourCustomPluginCached.Execute(context2);

一些开发人员做错的是他们会创建一个全局变量来存储上下文,他们将其设置为 Execute() 方法中的第一行。这样他们就不必在所有方法之间传递它。但这实际上是一个巨大的错误。 因为如果他们这样做,并且在上面的场景中,如果 thread2 中的执行在 thread1 的执行完成之前开始。这意味着 thread1 中的 context1 将被 context2 覆盖。现在该插件将产生一些意想不到的结果。在 99% 的情况下,即使以这种方式开发不正确,也没有问题,或者没有明显的问题。但在 1% 的情况下,它会导致出现问题,并且开发人员很难找出问题所在,并且在测试/调试时可能永远不会发生。所以它可能会长期不固定。

关于class - 什么是无状态类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658690/

相关文章:

php - 如何通过访问修饰符过滤属性

c++ - 搜索类对象数组 C++

c++ - 如何创建多态对象

c# - 停止循环 C#?

linq - 使用 Linq 按数组内的数组分组

python3在初始化时访问生成器中的类属性

c# - 数组、数组列表还是列表列表?

.net - InstanceContextMode.Single 可用于 WCF basicHttpBinding 吗?

flutter - 为什么子 Bottom Sheet 状态的变化会触发父窗口小部件的重建?

javascript - react HOC : render hijacking with functional components