【问题标题】:What's the meaning of making a method static? -For dummies [closed]将方法设为静态是什么意思? -对于假人[关闭]
【发布时间】:2014-05-10 14:36:08
【问题描述】:

我有一个采用字符串参数(文件路径)的方法,我想让所有表单都可以访问它。

我知道当我使用时

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

只要我调用它,它就适用于所有形式,当我没有静态时,我必须实例化它.. 问题是.. 为什么会有这种差异?实例化的真正含义是什么?我已经阅读了一些关于它的主题,但我不太明白如何,您能花时间向业余初学者解释一下吗?

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于阅读一本好书或教程的。
  • 阅读this SO question。在 Java 中也是如此。
  • 问题是我发现的所有资源都显示了一种有意义的语言,因此对于初学者来说并不容易理解。还是谢谢
  • 奇怪的是,有几个用户标记我的问题,并告诉我去读一些书,而其他人则用其他领域专业人士可以理解的简单明了的语言回答,我认为这是建设性的要做的事。当我试图澄清一些基本元素时,这不是我第一次找到一些键盘战士。请原谅我,因为我可能犯了罪。

标签: c# static instantiation


【解决方案1】:

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

在类foo上调用非静态方法MyMethod()

var f = new foo();
f.MyMethod();

在类foo上调用静态方法MyMethod()

foo.MyMethod();

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

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

【讨论】:

    【解决方案2】:

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

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

    例如:

    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

    【讨论】:

    • 这是一个非常简洁的答案,只有一点我不明白,使用非静态类有什么好处?我可以用它改变什么样的行为?它似乎更复杂,所以我猜它有更大的潜力。因为在这些示例中,使用静态或非静态 @Amit Joki 没有限制
    • 另外,为什么我不能使用静态方法来公开组合框或文本框?这些项目有什么使它们成为非静态的?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      例如:

      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。

      【讨论】:

        猜你喜欢
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多