处理实例字段的静态方法

时间:2009-03-07 15:34:35

标签: c#

我已经看到了编写静态方法(但我从未运行过代码),它使用来自另一个类的实例数据(基于实例)。

通常,实例数据使用实例方法,同样适用于静态字段/方法。在实例方法中处理静态数据的含义是什么?我假设它不受欢迎,但我找不到任何有关引擎盖下会发生什么的细节。另外,使用静态数据的实例方法呢?

由于

6 个答案:

答案 0 :(得分:1)

我没有看到在静态方法中处理来自另一个对象的实例数据时出现问题。

我假设您的意思是,例如,通过参数将对象的实例变量传递给静态方法,然后该方法处理该变量。

静态只是意味着你没有这个,但你可以得到 otherobject->

我认为不会仅仅因为使用静态方法而感到不满意。

答案 1 :(得分:1)

静态方法使用对象实例或使用静态数据的实例方法没有问题。

框架中充满了证明这一点的方法。例如,常用的String.Concat方法是一个带有一个或多个对象实例的静态方法。 (只要使用+运算符连接字符串,编译器就会生成Concat方法调用。)

Int32.MaxValue是一个静态属性,在实例方法中使用它显然没有问题。

答案 2 :(得分:0)

基本上,实例方法有一个隐藏的this参数,用于传递方法应该处理的实例。这就是静态方法在没有显式引用的情况下无法访问实例数据的原因(因为他们无法知道应该访问哪个对象实例)。

考虑到这一点,我没有看到静态方法和实例方法之间有任何特殊区别。它们都是方法,与差异有更多的相似之处。

静态数据和实例数据都容易出现线程问题,但是,在线程之间使用实例的可能性要小得多。因此,访问静态字段可能需要更多关注(关于同步问题)。

答案 3 :(得分:0)

应该没有问题。最近我有一个场景,我需要一个类的每个实例来拥有一个不同但可重现的随机种子。我在类中保留了一个私有静态int,并为每个实例化增加了它,并将其用作种子。

工作正常。

答案 4 :(得分:0)

我认为在实例方法中使用静态数据并不存在任何固有的错误,但我认为您需要真正限制所使用的数据类型。这种方法的优点/缺点是单个数据更改可以改变特定类型的所有对象的行为。这使得更改该类型的数据非常危险。我倾向于限制对以下场景的使用

  1. 不可变的价值 - 没有什么可以改变所以没有什么可担心的
  2. 全球对象 - 我强烈避免这样做,但我发现偶尔有一个全局对象的罪恶大于风险。这些对象经过仔细监控并经过严格测试。

答案 5 :(得分:0)

在实例方法中处理静态数据时,我能想到的唯一含义是多线程应用程序中的同步。在使用静态方法的实例数据时,我无法想到任何不利影响。但是,仅仅因为可以完成某事并不意味着应该完成。

以下是您提供的具体示例。

  

A类是基于实例的并且有一个   实例字段名为ProductPrice of   双。 B类是静态的,有一个   静态方法调用   PlayAroundWithPrice(双倍价格),和   编码器传递给ProductPrice   字段。

显然,在这个例子中,技术上没有任何东西非法,但这对我来说是违法的。首先,A类的ProductPrice字段显然是公开的,因为B类可以对其进行操作。出于封装的目的,我个人总是将字段设为私有并使用公共属性来访问它们。其次,由于ProductPrice是公共字段而不是公共属性,因此A类无法阻止将ProductPrice设置为无效值(例如,负值)。第三(如上所述),如果此示例发生在多线程程序中,则可能存在同步问题。第四,我猜这是真正的问题,为什么B类上的静态方法在A类字段上运行?为什么不把静态方法放在A类上?

我不知道我会把这变成一条严格的规则(也许只是一个经验法则),但我会限制使用静态方法,当你不想为使用该方法而构建对象的成本付出代价。

例如,在我工作的项目中,我有一个IPHeader类,它将从字节缓冲区中完全构造一个IPHeader实例。但是,在大多数情况下,我只需要IPHeader中的几个值。因此,为了避免与创建和垃圾收集IPHeader实例相关的成本,我添加了几个静态方法,它们将直接从字节缓冲区中提取值。

我希望我能正确理解你的问题。