繁体   English   中英

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

[英]Auto properties with different accessors in an Interface

这3个自动属性之间有什么区别吗?

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

还有为什么我们可以在接口中而不是在类中编写此代码?

public int p { get; }

出于相同的原因,您可以在接口中编写此代码:

interface IFace {
    void Test();
}

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

当您执行public int P1 { get; set; } public int P1 { get; set; } public int P1 { get; set; }转换成一个auto属性。 但是,您不能执行public int P1 { get; } public int P1 { get; } ,因为您希望这意味着什么? 它应该总是返回0吗? 无法进行设置。 因此,如果要使用只读属性,则必须自己定义getter,如下所示:

int _p1;

public int P1 {
    get { return _p1; }
}

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

public int P1 { get; private set; }

这些属性之间存在差异。 首先,您应该从声明中删除public修饰符。 其次,通过将getset放置在块中,您可以定义派生类中的什么样的属性。 例如, public int p1 { get; set; } public int p1 { get; set; } public int p1 { get; set; }在派生类public int p2 { get; } public int p2 { get; }仅getter,而public int p3 { set; } public int p3 { set; }仅需要执行setter。

您不能在接口内部使用访问修饰符,因为接口是其他开发人员的指南,这些指南会在开发实现类时迫使它们朝某个方向发展。

有关更多信息,请参见这篇文章。

注意界面不包含任何实施数据。 在接口中添加属性时,它仅表示实现此接口的类需要具有具有get,set或这两种方法的属性,具体取决于您编写的内容。 因此,任何实现您接口的类都必须使用get和set方法来实现(或具有自动生成的)p1属性,使用get方法的p2和使用set方法的p3。 Interface不在乎这些是自动生成的还是您自己的自定义实现,它们只需要在实现类中即可。

因此,您可以编写

int p { get; }

在接口中,它所做的一切都表明,实现此接口的任何类都必须具有带有getter的属性p,而不是在乎其实际实现-您可以编写一个执行一些计算,返回一些常量等操作的getter。编写相同内容的类意味着您想要一个具有自动生成的后备字段的属性,但由于它没有设置器,因此您实际上无法更改其值,因此它将始终具有默认值0。

并且如前所述,您不能在接口中编写访问修饰符,因为所有接口成员都是隐式公共的。

暂无
暂无

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

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