自动属性的默认接口方法和默认值

Joh*_*iou 12 c# c#-8.0 default-interface-member

鉴于 auto 属性编译为 a get_method、 aset_method和私有变量,并且自 C# 8 引入默认接口方法以来

接口中的属性可以有默认实现吗?

特别是仅获取属性?

The*_*aot 8

不。


该提案称:

接口可能不包含实例状态。虽然现在允许静态字段,但接口中不允许实例字段。接口中不支持实例自动属性,因为它们会隐式声明隐藏字段。

来源

另请参阅 Mads Torgersen 的 Channel 9 采访A Preview of C# 8,其中他们讨论了默认接口实现等内容。


默认接口方法不包含在与 Visual Studio 2019 Preview 1 一起发布的 C# 8.0(测试版)中。在撰写本文时,默认接口方法原型仍在开发中。参考Champion“默认接口方法”


Pan*_*vos 8

否和是。接口不能有状态,但您可以使用 定义属性{get;set;}

汽车属性不是一种特殊类型的属性。它们是一项便利功能,可生成在支持字段中存储属性值所需的代码。

您可以为 getter 和 setter 的属性指定默认实现。您可以在Sharplab.io中尝试以下代码

public interface IDimensions
{
    int Height {get;set;}
    int Width {get;set;}
    int Depth {get;set;}

    int Weight { get=>0; set{} }
    int Density { get=> Weight==0?0:Height*Width*Depth/Weight ; }
}

public class Box:IDimensions
{
    public int Height{get;set;}
    public int Width{get;set;}
    public int Depth {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

版本控制

这演示了版本控制场景。实现了仅包含,Box的版本。IDimensionsHeightWidth

Weight后来添加了一个返回 0 并忽略写入的默认实现。Density添加了一个默认实现,该实现返回盒子的体积/密度,如果没有有效的重量,则返回 0。Box即使淡入淡出也不必改变。即使编译器生成的代码也没有显示对该Box类的任何更改。

类可以用自己的实现替换默认实现。没有什么可以阻止将来Box添加。int Weight {get;set;}

默认实现只能通过接口获得:

IDimensions box=new Box();
Console.WriteLine(box.Density);
Run Code Online (Sandbox Code Playgroud)

性状

默认实现处理的另一个场景是特征。

假设我想将IDensity特征添加到任何类型的项目中。在大多数情况下,我只需要物品的体积和重量来计算其密度:

public interface IDensity
{
    int Density 
    { 
        get 
        {
            var weight=getWeight();
            if (weight==0) return 0;
            return getVolume()/weight;
        }
    }

    abstract int getWeight();
    abstract int getVolume();
}
Run Code Online (Sandbox Code Playgroud)

此特征将返回一个简单的密度计算,并强制其应用的类型实现 int getWeight()int getHeight()方法:

public class Crate:IDensity
{
    //Dummy numbers
    public int getWeight()=>55;
    public int getVolume()=>100;
}

public class C {
    public void M() {
        IDensity box=new Cake();
        Console.WriteLine(box.Density);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个容器可以用自己的实现覆盖该实现。也许容器的形状很复杂:

public class WeddingCake:IDensity
{
    public int getWeight()=>5;
    public int getVolume()=>getWeight()/Density;
    public int Density=>2;
}
Run Code Online (Sandbox Code Playgroud)

此示例的 Sharplab.io 链接位于此处