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

4
可能是重复问题:
如何从静态方法中调用非静态方法 c# 我们可以通过创建实例来从静态方法中调用非静态方法。代码:
public class Foo
{
    public void Data1()
    {
    }

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

不过,我听说非静态方法可以通过委托从静态方法中调用。这是真的吗?如果是,那么怎么做呢?请用示例代码指导我。谢谢。


3
从:https://dev59.com/6nM_5IYBdhLWcg3wfTE0 重复吗? 如何从静态方法调用非静态方法?在实例化对象之前,您无法直接从静态方法中访问非静态方法。 但是,您可以通过创建类的实例并使用该实例来调用非静态方法来解决此问题。例如:public class MyClass {public void myNonStaticMethod() { System.out.println("This is a non-static method."); } public static void myStaticMethod() { MyClass myClassInstance = new MyClass(); myClassInstance.myNonStaticMethod(); }} 在上面的示例中,我们定义了一个名为MyClass的类,并在其中定义了两个方法:myNonStaticMethodmyStaticMethod。 在静态方法myStaticMethod中,我们创建了一个MyClass的实例,并使用它来调用非静态方法myNonStaticMethod - Julius F
7个回答

10

这是通过委托调用非静态方法的一种方法。请注意,这是一个两步过程,因为要调用非静态方法,你绝对需要一个类实例。我还要指出的是,几乎肯定有更好的方法来做你想做的事情,因为尽管不想使用对象实例也需要从静态方法调用非静态方法,这使得非静态方法听起来应该是静态的。

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

3
要调用非静态方法,您需要一个对象的实例 - 没有其他办法。

为什么我们能够通过类实例调用非静态方法来访问静态方法??类实例并没有转换成静态,对吧?? - Zeeshan Ajmal

3

是的,您可以使用委托从任何地方调用非静态方法,但您需要该类的实例来创建委托,这样在调用方法时实例就可用了。


1
没有人提供代码来实现通过委托从静态方法调用非静态方法。请给我一个示例代码。谢谢。 - Mou

2

您始终需要一个实例才能调用实例方法。可以有一个委托指向实例上的方法 - 但是在调用中仍然使用了一个实例,只是间接地。


2
你可以做其他聪明的事情,但现实是,在某个地方你必须创建或访问非静态对象的实例。你可以将一个委托传递到方法中,该委托引用了方法的实例(更确切地说,是非静态对象的实例上的方法),但这必须在你的代码之外创建。

没有人提供代码使得通过委托可以从静态方法调用非静态方法。请给我一个示例代码。谢谢。 - Mou

2
在提供的代码中,您不会在静态方法中调用非静态方法,但是您会调用另一个类的实例公共方法,这是不同的情况。
所以在您的情况下,我建议写成:
static void Data2(Foo foo)。
谢谢。

2
这种方式可以被称为从静态方法调用非静态方法。 要从静态方法调用非静态方法,您必须在包含非静态方法的类中创建一个新引用。 因此,您的Data1方法在Foo类中,您必须创建一个新引用(Foo foo = new Foo()),以允许离开静态方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接