Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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#_Interface - Fatal编程技术网

C# 接口应该定义属性吗?

C# 接口应该定义属性吗?,c#,interface,C#,Interface,接口,如“仅包含方法、委托或事件的签名”所定义。但是,由于属性对于get和set方法来说只是语法上的糖分,因此它们也可以在接口中使用。我的问题是-在接口中定义属性是否合适,或者我们是否应该遵循MSDN描述的场景?我认为属性在接口中是完全可以接受的 正如您所说,它们实际上是一个get、set或get-and-set方法。框架中的许多接口定义属性,例如和。您链接到的文章还说明: 接口可以是 命名空间或类,并且可以包含 下列成员的签名: 方法 属性 索引器 事件 是的,接口应该在真正需要时定义属性

接口,如“仅包含方法、委托或事件的签名”所定义。但是,由于属性对于get和set方法来说只是语法上的糖分,因此它们也可以在接口中使用。我的问题是-在接口中定义属性是否合适,或者我们是否应该遵循MSDN描述的场景?

我认为属性在接口中是完全可以接受的


正如您所说,它们实际上是一个get、set或get-and-set方法。框架中的许多接口定义属性,例如和。

您链接到的文章还说明:

接口可以是 命名空间或类,并且可以包含 下列成员的签名:

  • 方法
  • 属性
  • 索引器
  • 事件

是的,接口应该在真正需要时定义属性。请假设是这样。有一个IUser接口定义了一个属性“Name”,那么您可以使用它,而不用担心对象是否没有实现该属性

public void main()
{
    IUser u = User.GetUser("id");
    string name = u.Name;
}

在接口中定义属性是完全合法的。关于为什么可以使用属性但不能使用字段,这里的答案给出了一个相当好的详细解释:

您需要记住,接口中定义的任何属性都将始终是公共的。也就是说,如果在接口中定义了getter和setter,那么getter和setter都必须是公共的。如果愿意,可以只在接口中定义getter,然后在实现类中定义私有setter。这绝对是一个需要仔细研究的领域


类似地,Java不允许在其接口中使用实例变量。但是,它允许声明变量,并且这些变量将被视为静态&只读。Java中的约定是,如果在实现类中需要getMyVariable()和setMyVariable()方法,则编写它们。C#基本上只允许更简洁的语法。

谢谢你,里德。在这种情况下,这些属性是否应为基本(非用户定义)类型?我问这个问题的原因是,例如,如果您将其定义为域类型,那么最终可能会得到一个循环引用。@Otávio Décio:请记住接口的用途。接口定义了一个契约。如果合同需要一处房产,那就可以了。您不应该以循环引用结束,因为属性不应该是直接实现接口的类型,而应该是基本类型、框架类型或本身构成“契约”一部分的类型。IWebProxy(上面链接)就是一个很好的例子——它有一个Credentials属性,它是ICredentials。这是合同的一部分,但本质上仍然是“用户定义”类型(对于该库)。只是为了确保-接口中定义的属性应该是非用户定义的具体类型或接口类型(用户定义或非用户定义)。@Otávio Décio:我对用户定义的具体类型没有问题,或者-但我认为在这种情况下需要保持谨慎。。。