如何从C#中的静态方法调用非静态方法?

时间:2009-09-01 01:48:10

标签: c#

我有以下代码,我想从data1()致电data2()。这可能在C#中吗?如果是这样,怎么样?

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

10 个答案:

答案 0 :(得分:104)

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

public class Foo
{
    public void Data1()
    {
    }

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

答案 1 :(得分:26)

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

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();
}

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

答案 2 :(得分:17)

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

例如:

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

答案 3 :(得分:10)

如果没有先创建父类的实例,则无法调用非静态方法。

因此,从静态方法开始,您必须实例化一个新对象......

Vehicle myCar = new Vehicle();

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

myCar.Drive();

答案 4 :(得分:6)

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

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

答案 5 :(得分:3)

为非常老的帖子发表回复道歉,但我相信我的回答可能有助于其他人。

在代表的帮助下,可以实现同样的目标。

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();
        }
    }
}

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

 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();
    }
}

答案 8 :(得分:-1)

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

原因:静态方法仅属于其类,并且属于nay对象或任何实例。

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

&#34;非静态字段,方法或属性需要对象引用&#34;。

解决方案:只需声明一个引用,如:

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

non-static method()
{

}


}

答案 9 :(得分:-1)

你可以像这样使用call方法: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();
    }
}
相关问题