代码之家  ›  专栏  ›  技术社区  ›  Chris Smith

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

  •  14
  • Chris Smith  · 技术社区  · 17 年前

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

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

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

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

    8 回复  |  直到 17 年前
        1
  •  28
  •   shoosh    17 年前

    静态方法通常适用于不需要类实例中任何数据的操作(从 this )并且可以仅使用其论点来实现其预期目的。
    一个简单的例子就是一种方法 Point::distance(Point a, Point b);

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

        2
  •  16
  •   Lou Franco    17 年前

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

    编辑 :来自评论中的stevemegson

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

        3
  •  9
  •   JacquesB    17 年前

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

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

        4
  •  8
  •   Corbin March    17 年前

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

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

        5
  •  2
  •   David Grayson    17 年前

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

    添加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”。

        6
  •  2
  •   A Coder    7 年前

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

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

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

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

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

    另一个例子是,假设您想知道一个类有多少个对象 这是创建的(不要问我为什么…)。对于此任务,您可以创建一个 GetNumberOfObjects() (显然你需要一个静态场, 以及构造函数中的一些代码)。为什么我会让它静止,你可能 属于任何特定的对象。此外,它不会修改任何对象。

    我希望这是有道理的。

        7
  •  1
  •   DJClayworth    17 年前

    以下是您可能希望使用静态方法的一些示例:

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

    class AbstractClass {
        static createObject(int i) {
            if (i==1) {
               return new ConcreteClass1();
            } else if (i==2) {
               return new ConcreteClass2();
            }
         }
    }
    

    3) 当您控制或以其他方式跟踪类的实例化数量时。单例是最常用的例子。

    4) 当声明常量时。

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

        8
  •  0
  •   Vincent Ramdhanie    17 年前

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

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

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