C# 我应该何时编写静态方法?

C# 我应该何时编写静态方法?,c#,oop,C#,Oop,所以我理解静态方法或字段是什么,我只是想知道何时使用它们。也就是说,在编写代码时,设计适合使用静态方法和字段 一种常见的模式是将静态方法用作静态工厂,但这也可以通过重载构造函数轻松实现。对的例如: var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg"); 至于静态场,创建singelton对象是否是它们的最佳用途 当您使用静态工厂时,它提供了一个更好的意图——它还允许您拥有不同的工厂,这些工厂采用相同的参数类型,但具有不同的含义。

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

一种常见的模式是将静态方法用作静态工厂,但这也可以通过重载构造函数轻松实现。对的例如:

var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg");

至于静态场,创建singelton对象是否是它们的最佳用途

当您使用静态工厂时,它提供了一个更好的意图——它还允许您拥有不同的工厂,这些工厂采用相同的参数类型,但具有不同的含义。例如,假设位图具有LoadFromResource(string)——则不可能有两个同时使用string的构造函数

编辑:来自评论中的stevemegson

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


静态方法通常适用于不需要类实例的任何数据(来自
this
)的操作,并且可以仅使用其参数来执行其预期目的。
一个简单的例子是方法
Point::distance(点A,点b)


静态字段尤其适用于不经常更改且被类的所有实例使用的常量。

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


方法依赖的非局部状态越少,就越容易理解,因此
static
对代码的读者来说是一个有用的信号。

我清楚地记住,实例方法在单个对象上/内部工作,而静态方法为类做一些事情

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


静态的其他良好用途:比较(obj a,obj b),删除(obj a)数据对象(对象不能删除自身,因为其引用仍然存在),或静态类,用于无法在对象中建模的过程代码。

当类的客户端没有要处理的类实例时,可以使用静态方法。例如,Singleton设计模式用于确保系统中只存在一个类的实例。它要求单例的构造函数是私有的,这样客户端就不能创建任何实例

因此,如果无法创建实例,如何访问该类的实例方法?通过调用返回类的单例实例的静态方法


这当然只是一种情况,但还有许多其他情况。

以下是一些可能需要使用静态方法的示例:

1) 当函数不使用任何成员变量时。您不必在这里使用静态方法,但如果使用,通常会有所帮助

2) 使用factory方法创建对象时。如果您事先不知道要创建的类型,则它们是特别必要的:例如

class AbstractClass {
    static createObject(int i) {
        if (i==1) {
           return new ConcreteClass1();
        } else if (i==2) {
           return new ConcreteClass2();
        }
     }
}
3) 当您控制或以其他方式跟踪类的实例化数量时。单例是最常用的例子

4) 当声明常量时

5) 对一个类的多个对象进行排序或比较等操作,并且这些操作不与任何特定实例相关联


6) 当必须在对象的第一次实例化之前进行特殊处理时。

只要有不依赖于该类特定对象的函数,就应该使用静态方法

添加static关键字没有害处:它不会破坏引用它的任何代码。例如,无论您是否具有“static”关键字,以下代码都是有效的:

class Foo
{
    public Foo(){}
    public static void bar(){}  // valid with or without 'static'
    public void nonStatic(){ bar(); }
}

...
Foo a = new Foo();
a.bar();

因此,您应该将“static”添加到任何可以添加的方法中。

当方法不属于特定对象时,请使用static方法

例如,如果您查看.NETFramework中的数学类,您将看到 所有方法都是静态的。为什么?因为没有理由必须创造 要使用这些方法的对象。为什么要创建
Math
class,当你想要的只是某样东西的绝对值时?不,在那里 没有理由这样做,因此,该方法是静态的

因此,当你设计一个类时,问问自己:

此方法属于对象还是类本身

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

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


我希望这是有意义的。

如果我理解正确的话,你说的是ALAWY在可能的情况下使用静态方法。但这感觉不对。在.NET基类库中有很多情况下,方法可以是静态的,但不是静态的。@wedge-同意,我今天在调试一些.NET源代码,这让我有些发抖,也让我对我编写的一些不可靠的代码感觉更好:)所以我们应该只在需要时创建非静态方法