首先引用MSDN里的原文

Interface members are automatically public, and they can't include any access modifiers. Members also can't be static

                  --https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/index

即:接口成员会自动成为公共成员,不能包含任何访问修饰符。 成员也不能是静态成员。

那么我们先不讨论编译器内部发生了什么,先从语法上来理解:为何Interface(接口)内的成员不能使用static修饰符。

我们知道,对一个实现接口的类,可以用显式方式实现接口定义的成员,也可以用隐式方式来实现。

那么假设可以定义带有一个静态成员 StaticString() 的接口 IStatic,并定义一个类 StaticClass 显式实现这个接口。

public Interface IStatic{
static String StaticString();
} public class StaticClass:IStatic
{
static IStatic.StaticString();
}

那么我们要如何使用这个静态成员呢?既然是显式实现,那么就要以接口的形式调用此成员。而要实现此接口,就要建立一个实例。

IStatic staticClass=new StaticClass();
String someString=IStatic.StaticString();

发现了吗?虽然我们声明了staticClass为一个StaticClass实例,但是我们调用成员时还是要通过IStatic接口。实际上,IStatic.StaticString()并没有指定任何一个实例,那么使用接口成员就无从谈起了。

若我们隐式实现IStatic接口:

public Interface IStatic{
static String StaticString();
} public class StaticClass:IStatic
{
public static String StaticString();
}

那我们就要这样使用StaticString成员:

IStatic staticClass=new StaticClass();
String someString=StaticClass.StaticString();

同样,虽然StaticClass实现了IStatic接口,但是在使用静态成员时我们仅以StaticClass来进行调用,与IStatic接口没有任何的关系。

因此,无论是显式实现还是隐式实现接口的静态成员,实际使用上都是没有意义的,也就不难理解为何在C#里面为何接口成员(包括接口本身)为何不能使用static修饰词了。


以下是笔者的闲谈:

在不同的书本上已经不止一次看到对于接口修饰词的说明了,包括C# in depth等,但是由于书中一般只会进行一两句话的描述,因此在笔者脑海里一直没有形成知识体系。而由于工作的性质,我也很少或者没有用到C#里关于面向对象的性质。最近在写一个WebAPI接口的工具类中突然要写数个接口,突然回想起这个性质。

其实本质很简单,但是要形成脑海里的知识体系,个人认为还是将它用最浅显的方法演示一次更为有效。

[C#]为什么Interface里的成员不能使用static修饰?的更多相关文章

  1. static修饰的成员与非static修饰类的成员的区别

    ① 格式 : 1> static修饰的,称为静态成员,非static修饰的,称为非静态成员. ② 内存位置: 1>static修饰的,在方法区的静态区中,非static修饰的,在堆中的对象 ...

  2. C++ 【静态成员】static修饰的成员

    首先,我们先通过字面意思来理解... 成员:成员变量.成员函数. static  修饰成员变量,还有修饰成员函数. static  声明为静态的,称为静态成员.不管这个类创建了多少个对象,静态成员只有 ...

  3. 假如java类里的成员变量是自身的对象

    假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了. 不过我想的肯定是错的,因为很多类的成员变量是自身对象,并且绝对无错,举个例子: Class A{ pr ...

  4. “全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

    原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...

  6. java类里的成员变量是自身的对象问题

    今晚看单例模式饿汉时想到一个问题:假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了.于是上网搜索了下,哈哈,果然有人早就思考过这个问题了,站在巨人的肩膀上 ...

  7. AbStract 和Interface 方法是否能用Static修饰,为什么?

    Abstract 和Interface 方法是否能用Static修饰,为什么? interface中不能含有Static方法,属性,成员变量. Abstract中可以有Static方法,属性,成员变量 ...

  8. JAVA_SE基础——34.static修饰成员变量

    需求:描述一下学校的学生.  特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...

  9. static 类成员变量 和 static const类成员变量

    1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...

随机推荐

  1. An error has occurred. See error log for more details. java.lang.NullPointerException

    今天重新新建一个eclipse的空间,就报了这么一个错误,百度找了很多,发现不对头,都不行.后来点开错误一看,原来是web.xml里面没有文件头造成的. 解决办法:只需要在web.xml文件里添加文件 ...

  2. javascript 获取当前 URL 参数的两种方法

    window.location.host; //返回url 的主机部分,例如:www.xxx.com window.location.hostname; //返回www.xxx.com window. ...

  3. SharePoint 2013 设置 显示详细错误信息 修改位置总结

    以80端口为例—— 1.修改:C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config文件配置 CallStack="false&quo ...

  4. Gym - 101572G Galactic Collegiate Programming Contest 小根堆(set)

    题目传送门 题目大意: n个人,m次提交,每次提交都代表某支队伍做出一题,并且给出罚时,让你输出每次提交后,编号为1的队伍的排名. 思路: 首先处理ac和罚时,由于罚时最大1000,最多有1e5次,要 ...

  5. Photoshop入门教程(五):滤镜

    学习心得:滤镜通常用于摄影行业,是安装在相机镜头前用于过滤自然光的附加镜头,从而获得一些特殊的效果.同理,Photoshop的滤镜也是为了产生特殊的效果.Photoshop滤镜分为两类:一种是内部滤镜 ...

  6. Autel MaxiSys MS908CV Diagnostic System for Commercial Vehicles

    As a new member of Autel’s MaxiSys family, the MaxiSys CV is built on the powerful MaxiSys 908 platf ...

  7. 信息领域热词分析系统--python切词

    利用python将标题切割成词语 import jieba #读取文件 f=open(r"F:\大数据\大作业\爬取到的数据\data1_xinxi.txt",'r') s=f.r ...

  8. firewall 端口转发

    centos 7 使用背景:某次新购阿里云服务器安装nginx后配置80转8080的内部转发 systemctl status firewalld ---查看守护进程状态systemctl start ...

  9. python面向对象, 单例模式

    目录 单利模式 实现单利模式的方法 使用模块 使用__new__ 为了使类只能出现一个实例,我们可以使用 new 来控制实例的创建过程,代码如下: 使用装饰器 使用 metaclass 补充:元类(m ...

  10. Dockerfile的书写规则和指令的使用方法

    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命 ...