【问题标题】:Can an interface have static variables in C#接口可以在 C# 中具有静态变量吗
【发布时间】:2013-10-30 01:00:09
【问题描述】:

这可能是一个愚蠢的问题,如果有人可以帮助我理解它,我将不胜感激。

  1. C# 中的接口可以有静态变量吗?

  2. 如果接口本身需要静态才能在里面声明静态变量?

  3. 当我们在一个类中实现时,接口内的静态变量(或者说属性)如何实现?

我们将不胜感激一些例子和清晰的解释。

【问题讨论】:

  • 一个接口只是一个契约而不是一个实现。
  • 启动您的 IDE 并尝试一下和/或阅读Interfaces (C# Programming Guide)
  • 可以在抽象类中声明
  • 变量只存在于方法中。在类中,您可能有各种成员,例如字段或属性,但您永远不会有变量。它有助于学习使用正确的词语来描述正确的特征。
  • 从 c# 8 开始,接口的静态成员是允许的。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

标签: c# .net oop c#-4.0 interface


【解决方案1】:

接口是一种契约,即任何实现类必须提供的公共实例方法和属性的描述。

接口不能指定任何静态方法或属性。它们不能指定内部的、受保护的或私有的方法或属性。他们也不能指定字段。

【讨论】:

    【解决方案2】:

    1- 不,因为interface 不是一个类

    2- 考虑一个Abstract

    3- interface 中的 Static Property 在 C# 中没有定义也没有意义

    【讨论】:

      【解决方案3】:

      不,C# 中的接口根本不能声明字段。在 C# 中根本不能声明静态接口,也不能在接口中声明静态成员。

      根据 C# 规范的第 11.2 节:

      接口声明可以声明零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,接口也不能包含任何类型的静态成员。

      所有接口成员都隐含地具有公共访问权限。接口成员声明包含任何修饰符是编译时错误。特别是,接口成员不能使用修饰符 abstract、public、protected、internal、private、virtual、override 或 static 声明。

      【讨论】:

      • 有 - 您可以使用非泛型接口作为泛型接口的标记,方法是让泛型实现非泛型。在这种情况下,标记接口不需要任何成员,可能还有其他用途,但标记接口在反射场景中很有用
      • @Alireza Yes.
      • 这是流行的 MVVM 框架 Caliburn Micro 中的一个示例:caliburnmicro.codeplex.com/SourceControl/latest#src/… - 该接口允许反射查找实现泛型 IHandle<T> 接口的类型,而无需知道要搜索哪个泛型类型。查看EventAggregator 中嵌套的Handler 类构造函数以了解它的实际作用 (caliburnmicro.codeplex.com/SourceControl/latest#src/…)
      • 谢谢乔恩和其他人。乔恩,我是新来的,恐怕我看到了一篇关于静态接口的文章。它里面也有静态属性:0 请看thinkbeforecoding.com/post/2009/10/21/CSharp-Static-interfaces 无论如何,这对我来说是一个面试问题,我说我不确定,因为我需要编码和检查,面试结束了哈哈。我还是不知道为什么这篇文章有静态界面,我不明白它的解释,因为它与你上面所说的不同,如果我误解了什么,请见谅。
      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 2011-08-15
      • 2018-11-14
      相关资源
      最近更新 更多