Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么接口中有属性_C#_.net - Fatal编程技术网

C# 为什么接口中有属性

C# 为什么接口中有属性,c#,.net,C#,.net,为什么接口中会有属性?我知道接口是一个合同,但为什么您需要接口中的属性呢? 非常感谢好吧,让我们假设接口代表一组对象 进一步假设我们想知道有多少个对象 多田我们使用属性int Count{get;} 从技术上讲,您永远不需要属性,因为您总是可以编写SetX()和GetX()方法。所以说你永远都不需要它是真的 但是,有些框架使用反射来查找属性,特别是那些进行序列化和反序列化的框架。在这些情况下,确实需要属性 实际上,属性通常比方法更具可读性,正确使用属性应传达额外的信息,如“读取此值不会很昂贵”和

为什么接口中会有属性?我知道接口是一个合同,但为什么您需要接口中的属性呢?
非常感谢

好吧,让我们假设接口代表一组对象

进一步假设我们想知道有多少个对象

多田我们使用属性
int Count{get;}

从技术上讲,您永远不需要属性,因为您总是可以编写
SetX()
GetX()
方法。所以说你永远都不需要它是真的

但是,有些框架使用反射来查找属性,特别是那些进行序列化和反序列化的框架。在这些情况下,确实需要属性


实际上,属性通常比方法更具可读性,正确使用属性应传达额外的信息,如“读取此值不会很昂贵”和“读取此值不会引起明显的副作用”。(这两种方法都应该适用于正确实现的属性getter。)

因为事物具有公共属性


每个类如何实现它们的属性取决于它们。有些可以使用自动属性,有些可以查询数据库。

这只是为了方便。属性被设计为getter和setter(如
getSomething
setSomething
等方法)的替代品

例如,我们可以重写以下java代码:

interface Foo
{
    Bar getBar();
    void setBar(Bar bar);
}
…在C#as中:


属性是
GetSomething()
/
SetSomething()
方法的快捷方式,这些方法在我们称为接口的“契约”中非常常见

不要将属性误认为是字段(公共成员变量)——属性通常表示某种行为,如果在接口中呈现这种行为,可以在实现类中放置简单的支持字段或更复杂的内容。

属性(
get
和/或
set
),事件(
add
remove
)和索引器(
get
和/或
set
)都由一个或两个访问器组成。访问器几乎就像一个方法,它只属于更专门的类型成员

引用MSDN:

接口包含一组相关功能的定义 类或结构可以实现的。[…]

[……]

接口可以包含方法、属性、事件、索引器或任何 这四种成员类型的组合。[…]


我想你应该开始阅读上面的参考资料。

因为你不需要知道(例如)列表中项目的数量,你可以用一些看起来更方便、更高效的方法来完成。例如:
IList
ICollection
。谢谢(大家)对于快速回复!属性不能用于序列化。为了正确捕获对象的状态,应查找其字段。序列化库不调用方法(setX)但请直接设置对象的私有成员以将其还原到以前的状态。如果它应该使用属性,所有类型的问题都会出现。@DanielMošmondor这不是真的。如果您编写一个测试类并将其标记为
[Serializable]
并放置
Console.WriteLine()
插入其属性的setter和getter,然后对其进行序列化和反序列化,您将看到正在调用setter和getter。其他序列化程序的工作方式不同,但有些使用属性。@DanielMošmondor我同意,我使用DataContract而不是旧的序列化程序,因为它更容易正确处理事情@newStackExchangeInstance不可以。我的错,很抱歉,我已经有一段时间没有在接口中实现任何字段了。@newStackExchangeInstance是的,您将get/set放在接口中。这意味着接口希望实现类同时实现getter和setter。@newStackExchangeInstance:在原始问题的行之间稍微阅读n、 OP暗示他/她熟悉包含方法的接口,例如Java。因此,比较一种只在接口中包含方法的语言和一种允许在接口中包含属性的语言似乎是合适的。
interface Foo
{
    Bar Bar { get; set; }
}