栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#是否具有扩展属性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#是否具有扩展属性?

目前,Roslyn编译器仍不支持该功能……

到目前为止,扩展属性的价值还不足以包含在C#标准的早期版本中。 C#7C#8.0
将此视为提案的冠军,但它尚未发布,主要是因为即使已经有实现,他们也希望从一开始就做到这一点。

但这会…

C#7工作列表中 有一个
扩展成员
项,因此在不久的将来可能会支持它。扩展属性的当前状态可以在Github上的相关项目下找到。

但是,还有一个更有希望的话题,那就是“扩展所有内容”,重点放在属性和静态类甚至字段上。

此外,您可以使用解决方法

如本文所述,您可以使用此

TypeDescriptor
功能在运行时将属性附加到对象实例。但是,它没有使用标准属性的语法。
它与语法糖有点不同,它增加了定义扩展属性的可能性,例如
string Data(this MyClass instance)
作为扩展方法的别名,
string GetData(this MyClass instance)
因为它可以将数据存储到类中。

我希望C#7将为所有功能(属性和字段)提供全功能的扩展,但是在那一点上,只有时间能证明一切。

并随时为社区的未来贡献力量。

更新:2016年8月

当dotnet团队发布了C#7.0的新功能以及Mads
Torgensen的评论时:

扩展属性:我们有一个(出色的!)实习生在整个夏天作为实验与其他类型的扩展成员一起实现。我们仍然对此感兴趣,但这是一个巨大的变化,我们需要对它的价值感到自信。

似乎扩展属性和其他成员仍然是将来发布的Roslyn(包括7.0版本)中不错的选择。

更新:2017年5月

扩展成员 已关闭,因为
扩展的所有内容
均已复制,也已关闭。实际上,主要的讨论是关于广义的类型可扩展性。该功能现在
作为建议在此处 进行跟踪
并且已从
7.0里程碑中 删除。

更新:2017年8月-C#8.0建议的功能

尽管它仍然只是一个 建议的 功能,但是我们现在对它的语法有了更清晰的了解。请记住,这也是扩展方法的新语法:

public interface IEmployee {    public decimal Salary { get; set; }}public class Employee{    public decimal Salary { get; set; }}public extension MyPersonExtension extends Person : IEmployee{    private static readonly ConditionalWeakTable<Person, Employee> _employees =         new ConditionalWeakTable<Person, Employee>();    public decimal Salary    {        get         { // `this` is the instance of Person return _employees.GetOrCreate(this).Salary;         }        set         { Employee employee = null; if (!_employees.TryGetValue(this, out employee) {     employee = _employees.GetOrCreate(this); } employee.Salary = value;        }    }}IEmployee person = new Person();var salary = person.Salary;

与部分类相似,但是在不同的程序集中作为单独的类/类型进行编译。请注意,您还可以通过这种方式添加静态成员和运算符。如Mads
Torgensen播客中所述,
该扩展将没有任何状态(因此它无法将私有实例成员添加到该类),这意味着您将无法添加链接到该实例的私有实例数据

。这样做的原因是它意味着要管理内部词典,并且可能很困难(内存管理等)。为此,您仍然可以使用前面介绍的

TypeDescriptor
/
ConditionalWeakTable
技术,并通过属性扩展将其隐藏在一个不错的属性下。

语法仍然可以更改,这暗示了这个问题。例如,

extends
可以替换为,
for
从而使某些人感觉更自然,而与Java的联系较少。

2018年12月更新-角色,扩展和静态接口成员

扩展 并不能将其 扩展
到C#8.0,因为在GitHub票证末尾解释了一些缺点。因此,进行了改进设计的探索。在这里,Mads
Torgensen解释了什么是 角色和扩展 以及它们之间的区别:

角色允许在给定类型的特定值上实现接口。扩展允许接口在代码的特定区域内在给定类型的所有值上实现。

可以在将先前的提案分为两个用例时看到。 扩展新语法 如下所示:

public extension ULongEnumerable of ulong{    public IEnumerator<byte> GetEnumerator()    {        for (int i = sizeof(ulong); i > 0; i--)        { yield return unchecked((byte)(this >> (i-1)*8));        }    }}

那么您将可以执行以下操作:

foreach (byte b in 0x_3A_9E_F1_C5_DA_F7_30_16ul){    WriteLine($"{e.Current:X}");}

对于 静态接口

public interface IMonoid<T> where T : IMonoid<T>{    static T operator +(T t1, T t2);    static T Zero { get; }}

在上添加 扩展属性

int
并将
int
视为
IMonoid<int>

public extension IntMonoid of int : IMonoid<int>{    public static int Zero => 0;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/465438.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号