【问题标题】:How do I call a non-static method from a static method in C#?如何从 C# 中的静态方法调用非静态方法?
【发布时间】:2009-09-01 01:48:09
【问题描述】:

我有以下代码,我想从data2() 调用data1()。这在 C# 中可能吗?如果有,怎么做?

private void data1()
{
}
private static void data2()
{
   data1(); //generates error
}

【问题讨论】:

  • 尽管有以下所有答案:你真的不能那样做。

标签: c#


【解决方案1】:

您需要创建该类的一个实例并在其上调用方法。

public class Foo
{
    public void Data1()
    {
    }

    public static void Data2()
    {
         Foo foo = new Foo();
         foo.Data1();
    }
}

【讨论】:

  • 如果这个方法在一个asp页面中怎么办?我目前正在为此苦苦挣扎。一个不手动创建一个asp页面的实例。那么我将如何从静态方法调用带有 asp 页面的方法呢? (网络方法)
  • @ReidGarwin 将行为放在页面中的某些内容中并尝试从其他地方调用它似乎真的是错误的。也许应该将它重构回另一个类,并在需要时将 Page 实例作为依赖项。虽然,老实说,整个模式都在尖叫有问题,即使可能,我也会避免它。
  • 这是一个欺骗性的解决方案:它不会真正起作用,只要 Data1 依赖于实例数据。如果不是,为什么不制作 Data1static?
【解决方案2】:

也许您正在寻找的是单例模式?

public class Singleton
{
    private Singleton() {}

    public void DoWork()
    { 
        // do something
    }

    // You can call this static method which calls the singleton instance method.
    public static void DoSomeWork()
    { 
        Instance.DoWork();
    }

    public static Singleton Instance
    {
        get { return instance; } 
    }

    private static Singleton instance = new Singleton();
}

您仍然需要创建该类的一个实例,但您要确保只有一个一个实例。

【讨论】:

  • +1 当我读到他的问题时,我想到了完全相同的事情
  • 单例本质上是全局数据——它们使您的代码难以测试(类与单例耦合)并且(如果可变)难以调试。尽可能避免使用它们(通常也是静态方法)。如果需要,请考虑使用 DI/IoC 容器库。
【解决方案3】:

您必须在静态方法中创建该类的实例,然后调用它。

例如这样:

public class MyClass
{
   private void data1()
   {
   }
   private static void data2()
   {
     MyClass c = new MyClass();
     c.data1();
   }
}

【讨论】:

    【解决方案4】:

    如果不先创建其父类的实例,就不能调用非静态方法。

    所以从静态方法中,你必须实例化一个新对象...

    Vehicle myCar = new Vehicle();
    

    ...然后调用非静态方法。

    myCar.Drive();
    

    【讨论】:

      【解决方案5】:

      您只需要提供对象引用。请在职位上提供您的班级名称。

      private static void data2()
      {
          <classname> c1 = new <classname>();
          c1. data1();
      }
      

      【讨论】:

        【解决方案6】:

        很抱歉为非常旧的帖子发布答案,但我相信我的回答可能对其他人有所帮助。

        在委托的帮助下,同样的事情也可以实现。

        public class MyClass
        {
            private static Action NonStaticDelegate;
        
            public void NonStaticMethod()
            {
                Console.WriteLine("Non-Static!");
            }
        
            public static void CaptureDelegate()
            {
                MyClass temp = new MyClass();
                MyClass.NonStaticDelegate = new Action(temp.NonStaticMethod);
            }
        
            public static void RunNonStaticMethod()
            {
                if (MyClass.NonStaticDelegate != null)
                {
                    // This will run the non-static method.
                    //  Note that you still needed to create an instance beforehand
                    MyClass.NonStaticDelegate();
                }
            }
        }
        

        【讨论】:

          【解决方案7】:

          你可以像这样使用调用方法:Foo.Data2()

          public class Foo
          {
              private static Foo _Instance;
          
              private Foo()
              {
              }
          
              public static Foo GetInstance()
              {
                  if (_Instance == null)
                      _Instance = new Foo();
                  return _Instance;
              }
          
              protected void Data1()
              {
              }
          
              public static void Data2()
              {
                  GetInstance().Data1();
              }
          }
          

          【讨论】:

            【解决方案8】:
             new Foo();
             Foo.StaticMethod();
            
            class Foo
            {
                private static Foo foo;
            
                public Foo()
                {
                    foo = this;
                }
            
                private void PrintHello()
                {
                    Console.WriteLine("Hello");
                }
            
                public static void StaticMethod()
                {
                    foo.PrintHello();
                }
            }
            

            【讨论】:

            【解决方案9】:

            静态方法不允许直接调用非静态方法。

            原因:静态方法只属于它的类,不属于任何对象或任何实例。

            因此,每当您尝试从同一类中的静态方法访问任何非静态方法时:您将收到:

            “非静态字段、方法或属性需要对象引用”。

            解决方案:只需声明如下引用:

            public class <classname>
            {
            static method()
            {
               new <classname>.non-static();
            }
            
            non-static method()
            {
            
            }
            
            
            }
            

            【讨论】:

              【解决方案10】:

              假设data1()data2() 都在同一个类中,那么另一种选择是将data1() 设为静态。

              private static void data1()
              {
              }
              private static void data2()
              {
                 data1();
              }
              

              【讨论】:

              • 这不是这个问题的答案或任何解决方案。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多