首先引用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. python 字符串,bytes和hex字符串之间的相互转换

    import binascii datastr='13'#string 类型转换为bytedataByte=str.encode(datastr)#byte串 转换为16进制 byte串 ,比如 b' ...

  2. 洛谷 P2982 [USACO10FEB]慢下来Slowing down

    题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows conveniently numbered 1..N mov ...

  3. 转换jmeter测试结果jtl

    #bin/sh filelist=`ls jtl` # 将jtl目录的所有文件列表读取并存入变量 for file in $filelist #遍历处理各个文件 do #文件名形如 test2ad.j ...

  4. pytorch实现squeezenet

    squeezenet是16年发布的一款轻量级网络模型,模型很小,只有4.8M,可用于移动设备,嵌入式设备. 关于squeezenet的原理可自行阅读论文或查找博客,这里主要解读下pytorch对squ ...

  5. win7 宽带连接 711错误

    新装Win7系统,建立宽带连接后提示711错误,网上转一圈,方法不少,对症下药,不是很管用 以下是我总结的方法 win7 旗舰版 administration 用户 设置以下几个服务为手动或自动,并启 ...

  6. 关闭 chrome 自动填充

    <input name="uname" type="text" required autocomplete="off" class=& ...

  7. [Android UI]View滑动方式总结

    一.前言 在上一篇文章,介绍了View的坐标等基础知识,有了基础知识后,对下面内容的理解也将会容易很多.那么本文介绍的是View滑动的几种方式,这对于View来说,也是需要重要掌握的内容,因为用户无时 ...

  8. 签名:实现参数字典排序,然后拼接为url参数形式

    在很多地方请求参数需要做处理例如: 步骤 1.参数字典排序. 2.拼接字符. /// <summary> /// 生成签名 /// </summary> /// <par ...

  9. sf01_什么是数据结构

    数据结构解决什么问题 如何在计算机中存储数据和信息,采用什么样的方法和技巧加工处理这些数据,都是数据结构需要努力解决的问题. 解决问题的步骤 使用计算机解决问题的步骤:分析具体问题得到数学模型,设计解 ...

  10. Hbase 表操作

    1. list 操作 2. 创建table column family, 3. 插入数据: put 'user' 3. 检索数据: scan table