代码之家  ›  专栏  ›  技术社区  ›  Kane

静态意味着没有状态吗

  •  7
  • Kane  · 技术社区  · 7 年前

    我最近向我的一个同事提出了一个建议,在我们当前的项目(C#)中,“服务应该是无状态的,因此是静态的”。

    我的同事同意并指出,在我们的项目中,服务确实是(而且应该)是无状态的。然而,我的同事不同意static意味着没有状态,而无状态应该意味着static。

    13 回复  |  直到 16 年前
        1
  •  8
  •   Rex M    16 年前

    静态几乎意味着全球。仍然存在一个实例,并且该实例中仍然存在状态,但它是

        2
  •  5
  •   Andre Pena    16 年前

    标记为static的方法是否意味着 它不需要国家

    1) 不能。不能说静态方法意味着它不需要状态,因为静态方法可以访问静态/单例资源。

    方法是静态的

    2) 是的。不需要状态的方法,因此不需要 ,通常应设置为静态。

        3
  •  3
  •   Michael Petrotta user3140870    16 年前

    C#中的静态方法可以访问其包含类的静态变量,如果访问了,则不是无状态的。我见过一些不可重入的“无状态”静态方法触发有趣的竞争条件的痛苦实例。

    一个真正的无状态方法确实可以被设置为静态的,通常应该是静态的。

        4
  •  3
  •   Abel    16 年前

    我觉得这么说挺吓人的 无国籍的 与 静止的

        5
  •  3
  •   James Anderson    16 年前

    他将高级设计概念“无状态服务”与“使用静态类”的低级技术实现细节混合在一起。

    coberlang(甚至不支持静态变量)的语言(coberlang,etc.)只支持静态变量。

    我可以很容易地想象这样一种情况:无状态服务大量使用静态类实现,因为它们已经存在并且已经实现了正确的业务逻辑,尽管它通常被认为是很好的Java编程实践,除非您确实需要使用静态类。

    他还严重误解了“static”的含义——静态变量是在调用之间存储状态的一种方式——因此看起来更适合于“有状态”服务。

        6
  •  2
  •   Paul Keister    16 年前

    静止的 是一个语言关键字和 状态

    关于无状态方法,这里我们讨论的是不引用类实例的方法,即this指针。将这些方法标记为静态可以提高代码的清晰度,并与最佳实践保持一致。注意,在本例中,我们讨论的是一种特定的“无状态状态”,而不是对有状态上下文的使用做一般性的评论。

        7
  •  1
  •   Oren Mazor    16 年前

        8
  •  1
  •   Ðаn    16 年前

    你问题的简短回答是“不”, static 并不意味着“没有国家”。

    关于你的其他评论, 静止的 静止的 光靠自己是不够的。另一种帮助实现无状态的工具/技术是使用不可变的数据结构。这(目前)并不是C的强项之一,尤其是与F相比。

        9
  •  1
  •   Dan Rosenstark    16 年前

    除了重新定义“静态”的所有定义之外, 答案是“是的” 即使 修改类的实例的状态(特别是当它们被传递一个实例或一组实例时)。 在大多数情况下,静态方法的使用是没有变化的。最重要的示例是查找或创建实例(工厂方法)。

    也就是说,在现实生活中,真正的答案是“不” 这是因为您的服务代理需要在内部跟踪它的位置。因此,虽然您的方法在您看来是无状态的,但实际上不是。

    希望这不是太令人困惑:)

        10
  •  1
  •   Kirk Broadhurst    16 年前

    静态类不是无状态的。它仍然可以有变量,虽然是静态的,但有一个状态。

    没有任何类级变量的静态类是无状态的。它没有数据。

        11
  •  1
  •   Charles Bretana    16 年前

    CORINFO_CLASS_STRUCT ). 即使没有创建实例,程序集中任何地方的代码也可以使用语法访问这些静态类级字段 classname.StaticFieldName ,没有任何实例。

    更重要的是 CORINFO_类结构 从未卸载 在卸载程序集(或AppDomain)之前,可以这样说 更有状态 比类中定义的任何实例字段都要多,因为当实例被垃圾回收时,实例字段就会消失。

    更多信息请查看 链接到Don Boxes的好书, Essential .Net

        12
  •  0
  •   RCIX    16 年前

    class FooBarFactory
    {
        private static _id = 0;
        public FooBar MakeAFooBar()
        {
            FooBar foo = new FooBar();
            foo.ID = _id;
            _id++;
        }
    }
    class FooBar
    {
        public int ID {get;set;}
    }
    

    在这种情况下,您的静态方法有一个最小的状态,但它(可能)是必要的。

        13
  •  -1
  •   Cylon Cat    16 年前

    推荐文章