【问题标题】:Very Simple Extension Methods Explanation in Layman's terms (C#) [duplicate]非常简单的扩展方法用外行术语解释(C#)[重复]
【发布时间】:2011-05-17 15:43:39
【问题描述】:

可能重复:
What are Extension Methods?

我知道以前有人问过这个问题,但有些人可以提供一个非技术性的解释,用外行的话尽可能简单。

关于其他答案的所有文档对我来说似乎有点遥远

【问题讨论】:

  • @Michael:我已经投票结束这个问题。请参阅上面评论中的链接,它解释了它的用法,我相信你会发现它很简单。
  • @Michael:如果您不这样做,请随时在答案上留下 cmets 以进行澄清!
  • @shahkalpesh:我同意。如果该链接没有充分解释扩展方法,那么扩展方法可能不是要走的路;)
  • 用外行的话是无法解释的。而且如果你是外行,你不需要知道扩展方法是什么,所以没有问题。
  • @Michael:想象一只狗。你不能改变狗的基因组成(嗯,你可以,但会很辛苦),但你可以给它一些溜冰鞋让它跑得更快。旱冰鞋是一种延伸方法——它们不会改变狗,只会让它变得更好。

标签: c# .net windows methods


【解决方案1】:

扩展方法是一种在类型上模拟新方法而不实际更改类型定义本身的方法。

我想一种外行的解释方式是,它为每种类型提供了它自己的个人随从。他们的人本身并没有改变,他们只是通过与他们一起出去玩的人获得了许多新的能力。

【讨论】:

  • +1 用于非技术类比,尽管我必须阅读更多次而不是扩展方法的文档;)
【解决方案2】:

我不认为它比Wikipedia article中的一句话简单得多:

“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”

【讨论】:

    【解决方案3】:

    嗯,编程本质上是“技术性的”,所以我会尽可能多地学习以理解文档。但是,扩展方法只是允许您将类似于实例方法的方法添加到现有类中,否则这些类将被关闭以进行修改。

    例如,如果我编写了一个包含 Foo 类型的库并且没有分发源代码,那么您将无法通过子类化它来添加任何功能,而这只有在我将类型设为“未密封”时才有可能.随着扩展方法的出现,您可以像调用任何其他方法一样将方法添加到可以调用的类中(实际上它们是作为静态方法实现的,将隐藏的第一个参数传递给Foo 的实例,因此您仍然无法访问该类的私有成员)。

    【讨论】:

      【解决方案4】:

      扩展方法允许您将功能(方法)添加到您无法访问其源代码的类。

      【讨论】:

        【解决方案5】:

        你可以定义一个简单的类:

        public class A
        {
            public void B()
            {
                Console.WriteLine("B called");
                this.C();
            }
            public void C()
            {
                Console.WriteLine("C called");
            }
        }
        

        但是如果你将 A 定义为:

        public class A
        {
            public void C()
            {
                Console.WriteLine("C called");
            }
        }
        

        你想给它添加函数 B 吗?你使用扩展方法来做到这一点:

        public class A
        {
            public void C()
            {
                Console.WriteLine("C called");
            }
        }
        // the extensions class, can be any name, must be public
        public class Extensions
        {
            public static void B(    this                   A                 me)
         // ^ must be public static  ^ indicates extension  ^ type to extend  ^ name of variable instead of this
            {
                Console.WriteLine("B called");
                // instead of this, you use the name of variable you used in the parameters
                me.C();
            }
        }
        

        现在您可以像第一个示例一样调用A.B()

        【讨论】:

          猜你喜欢
          • 2017-05-12
          • 1970-01-01
          • 2023-03-05
          • 2021-02-28
          • 1970-01-01
          • 2012-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多