接口中具有不同访问者的自动属性

时间:2014-07-31 06:06:50

标签: c# .net

这三个汽车属性有什么区别吗?

interface MyInterface {
    public int p1 { get; set; }
    public int p2 { get; }
    public int p3 { set; }
}

为什么我们可以在界面中编写此代码而不在类中编写?

public int p { get; }

3 个答案:

答案 0 :(得分:3)

出于同样的原因,你可以在界面中写这个:

interface IFace {
    void Test();
}

此外,您的界面无效,因为public在界面中无效。关键是,不同的东西在接口和类中是合法的。

当你在课堂上public int P1 { get; set; }时,会变成一个自动属性。但是,你不能public int P1 { get; },因为你想要的意思是什么?应该总是返回0吗?没有办法设置它。因此,如果您想要一个只读属性,您必须自己定义getter:

int _p1;

public int P1 {
    get { return _p1; }
}

另外。实现或多或少相同的另一种方法是:

public int P1 { get; private set; }

答案 1 :(得分:1)

这些属性之间存在差异。首先,您应该从声明中删除public修饰符。其次,通过在块中放置getset,您可以定义派生类中的哪些属性应该如何。例如,public int p1 { get; set; }需要在派生类中使用getter和setter,public int p2 { get; }只需要getter,public int p3 { set; }只需要实现setter。

您不能在接口内部使用访问修饰符,因为接口是其他开发人员的指导原则,迫使他们在开发实现类时朝着某个方向前进。

查看this帖子了解更多相关信息。

答案 2 :(得分:1)

请记住,界面不包含任何实施数据。在接口中添加属性时,它只是说实现此接口的类需要具有get,set或两种方法的所述属性,具体取决于您编写的内容。因此,实现接口的任何类都必须使用get和set方法实现(或具有自动生成的)p1属性,使用get方法实现p2,使用set方法实现p3。接口并不关心这些是自动生成的还是您自己的自定义实现,它们只需要在实现类中。

因此,你可以写

int p { get; }

在一个接口中,因为它所做的就是告诉任何实现此接口的类必须具有带getter的属性p,同样,不关心它的实际实现 - 你可以编写一个getter来做一些计算,返回一些常量等等写在同一个类中的OTOH意味着你想要一个具有自动生成的后备字段的属性,除非它没有setter,你实际上不能改变它的值,所以它总是有它的默认值0

如上所述,您无法在界面中编写访问修饰符,因为所有界面成员都是隐式公开的。