使方法静态的意义是什么? - 对于傻瓜

时间:2014-05-10 14:36:09

标签: c# static instantiation

我有一个接受字符串参数(文件路径)的方法,我想让它适用于所有表单。

我知道,当我使用

public static methodname(string path) { //code } 

只要我调用它就可以在所有表​​单上工作,当我没有静态时,我必须实例化它...事情是..为什么这个区别?实例化真正意味着什么?我已经阅读了一些关于它的主题,但我不太明白,你是否可以花时间向业余初学者解释一下?

4 个答案:

答案 0 :(得分:2)

这告诉编译器他的方法完全是自包含的,并且不依赖或利用任何对象状态基于实例的属性或字段。它定义的类。因此,您不需要实例化类型(类或结构)的实例以使用此方法。它就像一个全局函数或子程序,你可以简单地通过名称来调用(你必须使用类/结构名称和方法名称),而不做任何准备。

在类MyMethod()

上调用非静态方法foo
var f = new foo();
f.MyMethod();

在类MyMethod()

上调用静态方法foo
foo.MyMethod();

您可以在非静态类中定义静态方法(如果该方法不依赖于任何对象状态,则表示该对象没有任何状态......)。但是你不能把非静态方法放在静态类中(如果方法需要访问对象状态,那么它显然不能在没有状态的类中)。

现在您可以编写一个不需要对象状态的方法,而忽略将其声明为静态。然后它需要相同的使用语法,如非静态方法,即使它在功能上是静态的。这是编译器会接受的错误(尽管像Resharper这样的工具会警告你这一点)。

答案 1 :(得分:1)

这是经典编程。当您需要的所有数据都来自参数时,使用静态方法。同样在类上调用静态方法。当你创建一个静态方法时,它会使用实例变量来做某事。 Instantiontain允许用户初始化该类中的所有字段,然后用户可以在该对象上调用方法,该方法在后台使用实例变量来执行某些操作。

答案 2 :(得分:1)

如果要维护状态,可以使用非静态类或面向对象的类。

使用静态类时,没有任何状态。

例如:

class HelloWorld
{
    public string Name {get;set;}
    public void SayHello()
    {
       Console.WriteLine(Name + " hello!");
    }
    public void SayHi()
    {
       Console.WriteLine(Name + " hi!");
    }
}

你会像上面这样使用上面的内容:

HellowWorld obj = new HelloWorld();
obj.Name = "John";
obj.SayHi(); 
obj.SayHello();

如果那是静态类:

static class HelloWorld
{
    public static void SayHello(string Name)
    {
       Console.WriteLine(Name + " hello!");
    }
    public static void SayHi(string Name)
    {
       Console.WriteLine(Name + " hi!");
    }
}

您可以这样调用上面的内容:

HelloWorld.SayHello("John");
HelloWorld.SayHi("John");

如您所见,您正在重复自己。

所以这一切都取决于你希望班级表现的方式。如果你想要做并忘记,那么静态类就是你的朋友。如果你不想让它忘记,那就使用Objects

答案 3 :(得分:0)

正如你所说,非静态方法意味着它低于一个对象(所以你必须实例化一个才能使用该方法。另一方面,一个静态方法下面的类,所以当你调用它,它与一个物体无关。

例如:

class C{
    static int f(int i){return i+1;}
}

C.f(2); // returns 3

如果方法是静态的,你只能这样做,它属于一个类,而不是一个对象。如果f()不是静态的,则必须实例化一个对象才能使用它:

class C{
    int f(int i){return i+1;}
}

C.f(2); // invalid!
C c = new c(); c.f(2); // returns 3

另一方面,此代码无效:

class C{
    int a;
    static int f(){return a;}
}

C.f(); //无效:C的每个实例都有自己的属性a。