我有一个接受字符串参数(文件路径)的方法,我想让它适用于所有表单。
我知道,当我使用
时public static methodname(string path) { //code }
只要我调用它就可以在所有表单上工作,当我没有静态时,我必须实例化它...事情是..为什么这个区别?实例化真正意味着什么?我已经阅读了一些关于它的主题,但我不太明白,你是否可以花时间向业余初学者解释一下?
答案 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。