Programing

C #의 정적 메서드에서 비 정적 메서드를 호출하려면 어떻게해야합니까?

crosscheck 2020. 12. 10. 18:52
반응형

C #의 정적 메서드에서 비 정적 메서드를 호출하려면 어떻게해야합니까?


다음 코드가 data1()있습니다 data2().. C #에서 가능합니까? 그렇다면 어떻게?

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

클래스의 인스턴스를 만들고 그에 대한 메서드를 호출해야합니다.

public class Foo
{
    public void Data1()
    {
    }

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

아마도 당신이 찾고있는 것은 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();
}

여전히 클래스의 인스턴스를 만들어야하지만 인스턴스 하나만 있는지 확인 합니다.


정적 메서드 내에서 해당 클래스의 인스턴스를 만든 다음 호출해야합니다.

예를 들면 다음과 같습니다.

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

부모 클래스의 인스턴스를 먼저 생성하지 않으면 비 정적 메서드를 호출 할 수 없습니다.

따라서 정적 메서드에서 새 개체를 인스턴스화해야합니다.

Vehicle myCar = new Vehicle();

... 비 정적 메서드를 호출합니다.

myCar.Drive();

객체 참조 만 제공하면됩니다. 직위에 클래스 이름을 입력하십시오.

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

아주 오래된 스레드에 대한 답변을 게시하는 데 사과했지만 내 답변이 다른 사람에게 도움이 될 것이라고 생각합니다.

대리인의 도움으로 같은 일을 할 수 있습니다.

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

data1()둘 다 data2()동일한 클래스에 있다고 가정하면 또 다른 대안은 data1()정적 으로 만드는 것 입니다.

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

정적 메서드는 비 정적 메서드 호출을 직접 허용하지 않습니다.

이유 : 정적 메서드는 해당 클래스에만 속하고 개체 또는 인스턴스에 속하지 않습니다.

따라서 동일한 클래스 내의 정적 메서드에서 비 정적 메서드에 액세스하려고 할 때마다 다음을 받게됩니다.

"비 정적 필드, 메서드 또는 속성에 대한 개체 참조가 필요합니다."

솔루션 : 다음과 같이 참조를 선언하십시오.

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

non-static method()
{

}


}

다음과 같이 호출 메소드를 사용할 수 있습니다. 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();
    }
}

참고 URL : https://stackoverflow.com/questions/1360183/how-do-i-call-a-non-static-method-from-a-static-method-in-c

반응형