c# - 静态方法与否,哪一个最好?

时间:2015-06-20 01:57:12

标签: c# oop methods static

我知道有一些帖子,但我没有找到我正在寻找的答案,而且很简单。

我知道调用方法是否静态(instanciation(OOP))。

示例,使用static:

using System;

namespace Projet_Test
{
    class surfacesCalcul
    {
        public static int calc_air(int a, int b){
            int result = a * b;

            return result;
        }
    }

    /*
     * ##########################
     * ##########################
     */

    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine(surfacesCalcul.calc_air(4,5));
        }
    }
}

你调用类(surfacesCalcul).Method,你可以访问方法。

-

正常,使用OOP:

using System;

namespace Projet_Test
{
    class surfacesCalcul
    {
        public int calc_air(int a, int b){
            int result = a * b;

            return result;
        }
    }

    /*
     * ##########################
     * ##########################
     */

    class MainClass
    {
        public static void Main (string[] args)
        {
            surfacesCalcul calculMeThis = new surfacesCalcul();

            Console.WriteLine(calculMeThis.calc_air(4,5));
        }
    }
}

您创建一个实例化,然后您可以访问该类中的方法。

-

[我的问题] 哪一个是最好的,我只是想知道为什么使用静态方法而不是实例或反向。是真的有原因还是两者都很好。是否有最好的时间使用另一个?

1 个答案:

答案 0 :(得分:3)

我会争辩双方,你可以选择。

考虑使用静态函数的第一个示例:

namespace Projet_Test
{
    class surfacesCalcul
    {
        public static int calc_air(int a, int b){
            int result = a * b;

            return result;
        }
    }

    /*
     * ##########################
     * ##########################
     */

    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine(surfacesCalcul.calc_air(4,5));
        }
    }
}

如果您从不关心覆盖或任何类型的继承,那么这很好。

现在考虑这个例子:

class surfacesCalcul
{
    public virtual int calc_air(int a, int b){
        int result = a * b;

        return result;
    }
}
class surfacesCalcul2 : surfacesCalcul {
   public override int calc_air(int a, int b)
   {
      var g = base.calc_air(a, b);
      return g*2;

   }
}

/*
 * ##########################
 * ##########################
 */

class MainClass
{
    public static void Main (string[] args)
    {
        var calculMeThis = new surfacesCalcul2();

        Console.WriteLine(calculMeThis.calc_air(4,5));
    }
}

你没有改变"正确性"该程序根本只允许多态性来做它的事情。

这个例子真的很重要,真的很重要。我更喜欢带有类的路径,因为静态方法不能有实例变量,你不能进行任何类型的依赖注入,这使得单元测试变得更加容易。对象实例化还允许不同的实例包含不同的状态信息,其中静态不能包含任何特定于实例的数据。