【问题标题】:Are there any plans for "extension properties" in a future version of C#?在 C# 的未来版本中是否有任何“扩展属性”计划?
【发布时间】:2009-03-17 00:41:38
【问题描述】:

我之前也想过这个问题,在阅读this问题时又想到了这个问题。

在未来的 C# 版本中是否有“扩展属性”的计划?

在我看来,使用更多“编译器魔法”来实现它们可能非常简单。例如,在扩展方法名称上使用 get_set_ 前缀会将该方法转换为扩展属性:

    public class Foo
    {
        public string Text { get; set; }
    }
    public static class FooExtensions
    {
        public static string get_Name(this Foo foo)
        {
            return foo.Text;
        }
        public static void set_Name(this Foo foo, string value)
        {
            foo.Text = value; 
        }
    }

是否有任何技术限制可以防止这种情况发生?这会在幕后产生太多的东西吗?不够重要,不值得付出努力?

【问题讨论】:

    标签: c# properties extension-methods


    【解决方案1】:

    功能请求的官方网站是http://connect.microsoft.com/VisualStudio

    已有扩展属性here的请求。

    微软在 2008 年 7 月 29 日的回答包括以下内容:

    扩展属性是常见的 请求,我们实际上已经走了很远 与下一个版本的设计 语言,但最终不得不 因各种原因报废 困难。它仍然在我们的 雷达。

    【讨论】:

      【解决方案2】:

      一般来说,我认为这会鼓励不良做法。

      属性应该代表所讨论对象的某种状态,而方法应该代表工作单元。但是许多开发人员倾向于将计算密集型或运行时间相对较长的代码放在更适合作为方法的 getter 和 setter 中。

      扩展对象与派生对象相同。如果您需要添加属性,从哲学的角度来看,您正在谈论需要向对象添加状态信息。这应该通过从类派生来完成。

      【讨论】:

      • @J Daniel Smith 虽然将其设为属性似乎很方便,但它应该是 GetFullName() ,因为它有一些功能。有一个正式的区别是有原因的 - 它消除了花时间争论“某些工作”对于财产来说是否“太多”的需要。
      • 假设我有一个现有的密封类,它将其状态公开为方法(因为最初的程序员来自 java.sigh),我想使用扩展属性来清理它......这有什么问题?
      • 无论如何,任何基于“我们无法实现它,因为人们可能会用它做坏事”的论点都是跛脚的逃避恕我直言。我们在这里是专业的成年人,而不是需要拿走锋利工具的孩子!
      • @Orion 如果您想无限制地访问密封类,我们为什么不直接修改语言以忽略密封关键字?扩展和派生解决了两个不同的问题。我们不应该因为人们可能滥用它而避免它,我们应该避免它,因为它是一个坏主意。
      • 我不想无限制地访问密封类。扩展方法/属性/等无论如何都不会给我。我真正想要的是能够以更清晰的方式编写更具可读性的代码,扩展道具会给我
      【解决方案3】:

      虽然我不认为您提出的建议是一个好主意,但您可以使用 C# 4 中即将推出的 dynamic 类型获得几乎相同的东西。计划的一部分是允许新的属性和方法在运行时添加到现有对象和类型。一个区别是您不会对扩展属性进行编译时检查。

      【讨论】:

      • dynamic 和常规类型在完全相同的意义上是相同的。俄罗斯人对此有一个很好的淫秽笑话。
      【解决方案4】:

      对于这种把戏,可能有话要说。

      只需查看 WPF 中的附加属性。它们确实为陈述性行为依恋提供了巨大的力量。但我不确定在声明性上下文之外会是什么样子......

      【讨论】:

        【解决方案5】:

        我不确定这将如何工作。扩展必须是静态的,因此属性本身也必须是静态的。这意味着您用来支持这些属性的任何东西也都是静态的。但预计您对这些的计划使用期望它们与this 关键字指示的实例相关联,而不是类型本身。

        【讨论】:

        • 为什么这被否决了?您对扩展方法/属性的静态提出了一个很好的问题(因此+1)。当然,人们的意思是他们想要实现与继承提供的相同的行为但没有实际继承。 IE。保留类的名称,并在 util lib 中简单地保留一个 helpy-helpy 文件,该文件添加了一些有用的方法和/或属性。很高兴拥有...
        【解决方案6】:

        “扩展属性”现在可以通过继承获得。添加这样的野兽会鼓励糟糕的 oop 实践,而且通常麻烦大于其价值。

        【讨论】:

        • 这样做的问题是它滥用了继承,只有当我完全控制对象的创建时它才有效。例如,您不能从 system.string 继承。
        • 它不可用,C# 不支持多重继承,所以实际上很容易遇到由于这个限制而无法进行干净设计的情况,如果事实上,我已经运行过将现实生活融入到他的博客blog.cleancoder.com/uncle-bob/2015/01/08/… 中提到的“鲍勃叔叔”的确切示例中,扩展属性将是解决所提出问题的可行解决方案
        猜你喜欢
        • 2015-05-02
        • 2021-06-22
        • 2020-08-19
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        相关资源
        最近更新 更多