【问题标题】:Can a delegate be used to call a method of a class without instantiating it?可以使用委托来调用类的方法而不实例化它吗?
【发布时间】:2014-03-25 14:55:17
【问题描述】:

一位面试官问我,他上了一门很重的课,里面有很多方法。 他现在只需要一种方法。

他问我 C# 中的 Delegates 是否可以帮助我在不实例化类的情况下调用该方法?

他说是的,代表们可以通过这种方式帮助我们。

我用谷歌搜索了它。我尝试在我的 VS 上运行它,但我想我需要初始化这个类。

看看这个sn-p -

public class HomeController : Controller
{

    public ActionResult test()
    {            
        NumberChanger nc1 = new NumberChanger( /*what to do here!
                                            can i call sum method of class abc*/);

        return View();
    }
}

public delegate int NumberChanger(int n, int m);

public class abc
{
    int a;
    int b;

    public int sum(int a, int b) {
        return a + b;
    }

}

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    如果你需要使用非静态方法,可能你应该使用 new NumberChanger(new abc().sum)
    试试看

    【讨论】:

    • 谢谢@mangusta,但是这里有新的,我们正在实例化这个类
    • 好吧,我想没有办法,如果方法不是委托方法类的成员:/
    【解决方案2】:

    您总是需要至少 1 个实例来调用实例方法。

    但如果你想避免创建大量重物,你可以使用这样的技巧:

    class TestClass
    {
        private static TestClass DummyInstance;
    
        public static Action GetShowAsDelegate()
        {
            DummyInstance = DummyInstance ?? new TestClass();
            return (DummyInstance.Show);
        }
    
        public void Show()
        {
            Console.WriteLine("It works!");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var show = TestClass.GetShowAsDelegate();
            show();
        }
    }
    

    您的类存储了它自己的一个私有静态实例,当调用者请求Show() 的委托版本时,该实例被实例化。然后它使用该实例,因此您不需要每次都在外部创建一个。第一次调用后,任何人都可以通过获取委托来运行Show 方法,而无需创建更多实例。

    【讨论】:

    • @Lakshay:没问题。我不相信有可能做得比这更好...... AFAIK,你总是需要至少 1 个实例才能调用实例方法。
    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多