从静态函数调用非静态函数

本文关键字:静态函数 函数调用 静态 | 更新日期: 2023-09-27 18:30:04

我可以从c#:中执行此操作吗

public static void example()
{
    nonstatic();
}
public void nonstatic()
{ }

如果有任何解决这个问题的方法,请随时提供,并感谢

从静态函数调用非静态函数

static类的成员可以在该类的实例存在之前调用。类的实例成员只能在该类的实例存在后调用,并且只能从实例本身调用。

一个快速的解决方法就是创建一个你试图调用的类型的新对象:

new SomeClass().nonstatic();

但是你为什么要这么做?是为了让它运行吗?那么你就没有写出好的代码。你只是在让步。试着寻求更优雅的解决方案。。或:

或者,您可以问自己为什么您的方法是静态的。它需要吗?将其设为非静态或将另一种方法设为static会有什么害处?你可以通过一些仔细的类设计来避免这些情况。

编辑以确保完整性

可能值得通过该对象的实例调用该static方法,而不是直接从静态方法调用。这样,就不需要无意义地创建新对象。这是因为类的实例可以访问所有实例方法和所有静态方法。

您所需要做的就是创建一个类的实例并调用它上的方法。

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

尝试使用Singleton模式,然后在对象的实例上调用您的方法

using System;
public class Singleton
{
   private static Singleton instance;
   private Singleton() {}
   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

然后

Singleton.Instance.MyNonstaticMethod()

根据您的示例,您最好使用以下代码

public static void example()
{
    static();
}
public static void static()
{
}

现在,如果出于某种原因需要一个非静态成员,即某个状态,则可以实现两个成员。

public static void static(SomeState someState)
{
    // Do something thread safe with someState.
}
public void nonstatic()
{
    static(this.someState);
}

是的,你可以做到。

class Example
{
    public static void example()
    {
        new Example().nonstatic();
    }
    public void nonstatic()
    {
    }
    static void main(string[] args)
    {
        example();
    }
}