【问题标题】:About Static and Non-Static Methods关于静态和非静态方法
【发布时间】:2017-03-02 04:36:12
【问题描述】:

我知道静态意味着变量或方法属于类本身,我们可以将它与 ClassName.StaticMethodName 一起使用。所以问题是:我们可以在另一个非静态方法中使用非静态方法,但我们不能在静态方法中使用非静态方法。我只是不明白为什么我们可以在另一个非静态方法中使用非静态方法?我们不需要一个对象来使用非静态方法吗?对于静态方法,我们需要使用类名,这就足够了。但是,为什么我们不需要对象来使用方法呢?例如:

//这段代码不会产生任何错误。还有什么我不知道的?也许 C# 在 methodB() 之前添加一个隐藏对象?

ClassA()
{
  public void methodA()
  {
    methodB();
  }
  public void methodB()
  {
  }
}

【问题讨论】:

  • 代码不会产生错误,但如果没有对象实例,您将无法调用这些函数
  • methodB 在内部被称为 this.methodB 即它们共享同一个类实例
  • 在methodA内部调用methodB时,你已经创建了ClassA的一个实例,即对象本身。

标签: c# methods static non-static


【解决方案1】:

我只是不明白为什么我们可以在里面使用非静态方法 另一个非静态方法?

要调用非静态方法,您需要一个可以调用该方法的对象实例。在此示例中,如果没有 ClassA 的实例化实例,则无法调用 MethodA。

因此,我们知道,如果我们在 MethodA 内部,则必须有一个正在执行此函数的现有实例。由于这个原因,调用 MethodB 是有效的,因为它是在 MethodA 当前运行的同一个对象上调用的。

【讨论】:

    【解决方案2】:

    Static 基本上意味着您不必创建对象的新实例即可使用其方法。

    public static class ClassA
    {
         public static void Run()
         {
    
         }
    }
    

    这可以被称为ClassA.Run();

    public class ClassB
    {
         public void Run()
         {
    
         }
    }
    

    要执行Run,您需要这样做:

    ClassB b = new ClassB(); //Create a new Instance of type ClassB
    b.Run();                
    

    因此,当您在ClassB 中获得另一个在Run() 内部调用的方法时,this.AnyOtherMethod();(而this 是多余的)将使用从调用Run() 的相同实例。

    【讨论】:

      【解决方案3】:

      以你有一个类的静态和非静态方法为例:

      公开课A { 私人int a; 公共A(整数值) { this.a = 值; } 公共静态 int MethodA() { 返回方法B(); } 公共 int MethodB() { 返回一个; } }

      想象我们能够编译它,并且我们尝试使用这个类而不构造它(创建一个类的实例)。我们不会在运行时知道 'a' 的值。因此我们不能在静态方法中使用实例方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多