繁体   English   中英

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

[英]Are there any plans for “extension properties” in a future version of C#?

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

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

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

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

这里已经有扩展属性的请求。

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

扩展属性是一个常见的要求,实际上我们在设计下一个版本的语言方面取得了很大进展,但由于各种困难最终不得不放弃它。 它仍然在我们的雷达上。

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

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

扩展object与从它派生不同。 如果您需要添加属性,从哲学的角度来看,您正在谈论需要将状态信息添加到 object。 这应该通过从 class 派生来完成。

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

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

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

我不确定那将如何工作。 扩展名必须为 static,因此属性本身必须为 static。 无论您使用什么来支持这些属性,也可以是 static。 但是期望您对这些的计划使用期望它们与this关键字指示的实例相关联,而不是与类型本身相关联。

“扩展属性”现在可通过 inheritance 获得。 添加这样的野兽会鼓励糟糕的 oop 做法,而且通常比它的价值更麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM