什么时候应该写静态方法?

Chr*_*ith 15 c# oop

所以我理解静态方法或字段是什么,我只是想知道何时使用它们.也就是说,在编写代码时,设计适合使用静态方法和字段.

一种常见的模式是使用静态方法作为静态工厂,但这可以通过重载构造函数来轻松完成.正确?例如:

var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg");
Run Code Online (Sandbox Code Playgroud)

至于静态场,是否最好使用singelton-objects?

sho*_*osh 28

静态方法通常对不需要来自类实例(来自this)的任何数据的操作有用,并且可以仅使用其参数来执行其预期目的.
一个简单的例子Point::distance(Point a, Point b);就是计算两点之间距离而不需要实例的方法.

对于不会经常更改并且由类的所有实例使用的常量,静态字段非常有用.

  • 因此,仅当我们要访问“此类”类的数据成员时,才应创建非静态方法? (2认同)

Lou*_*nco 16

当您使用静态工厂时,它可以更好地了解意图 - 它还允许您拥有采用相同参数类型但具有不同含义的不同工厂.例如,假设Bitmap有LoadFromResource(字符串) - 不可能有两个构造函数都接受字符串.

编辑:来自stevemegson的评论

静态工厂也可以返回null,并且可以更容易地返回从缓存中获取的实例.我的许多类都有一个静态FromId(int)来从主键获取实例,如果有的话,返回一个现有的缓存实例.


Jac*_*esB 9

我会说,只要你有独立于实例状态的函数,就使用静态方法.不依赖于任何实例字段.

方法所依赖的非本地状态越少,理解起来就越容易,因此static对于代码的读者来说是一个有用的信号.


Cor*_*rch 7

我通过记住实例方法在单个对象上/内部工作而保持清晰,而静态方法为类做了一些事情.

在LoadFromFile()的情况下,您需要一个静态方法,因为如果加载失败,您需要空引用 - 该实例尚不存在.如果您将其实现为构造函数,则必须在失败时抛出异常.

静态的其他好用途:比较(obj a,obj b),删除(obj a)数据对象(一个对象不能删除自己,因为它的引用仍然存在),或者静态类用于过程代码,这是真的不能在一个物体中建模.


iam*_*mCR 6

当方法不属于特定对象时,使用静态方法。

例如,如果您查看.NET框架中的Math类,您会发现所有方法都是静态的。为什么?因为没有理由必须创建一个对象才能使用这些方法。Math当您想要的只是某物的绝对值时,为什么要创建该类的对象呢 ?不,没有理由这样做,因此该方法是静态的。

所以当你设计一个类时,问问自己:

这个方法属于一个对象,还是属于类本身?

如果方法修改了对象的状态,则该方法就属于该对象。如果该方法不修改特定对象,则它很可能是静态的。

另一个例子,假设您想知道创建了多少个类的对象(不要问我为什么......)。对于此任务,您可以创建一个静态方法GetNumberOfObjects()(显然您需要一个静态字段,以及构造函数中的一些代码)。你可能会问,为什么我要把它设为静态。好吧,回答上面的问题,你就会明白了。该方法不属于任何特定对象。此外,它不会修改任何对象。

我希望这是有道理的。