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

C# 允许实现多少个接口?

C# 允许实现多少个接口?,c#,.net,interface,interface-implementation,C#,.net,Interface,Interface Implementation,在C#中: 一个类可以同时实现多少接口 public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N { } N有限制吗 别担心,我不想实现或维护这样的对象。我只是想知道是否有限制。如果你问这个问题是为了实际实现很多接口,我会说你有一个严重的设计问题 据我所知,除了计算机的内存之外,没有其他限制。有一个限制 由于JIT将单个字节用作相关接口的类型表的索引器,因此限制为255 考虑一下对编译器/运行时来说,MyCla

在C#中:

一个类可以同时实现多少接口

public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
N有限制吗


别担心,我不想实现或维护这样的对象。我只是想知道是否有限制。

如果你问这个问题是为了实际实现很多接口,我会说你有一个严重的设计问题

据我所知,除了计算机的内存之外,没有其他限制。

有一个限制


由于JIT将单个字节用作相关接口的类型表的索引器,因此限制为255

考虑一下对编译器/运行时来说,
MyClass:IInteferface_1,IInterface_2,界面
。没有设计时间限制,因为编译器只是确保您的类对其应该实现的每个接口都有适当的(方法)签名。至于运行时间限制,我认为内存没有多大影响,因为通过它实现的接口(在设计时验证)对类的任何引用都只会确保类具有该接口的适当方法签名。如果对象没有实现接口,那么对象将缺少方法签名。

我刚刚检查了Microsoft C的当前版本♯ 语言规范第4.0版,在§1.6.4、§1.9、§10.1.4、§10.1.4.2和§13中未提及限制。§B.2.7中的语法也没有语法限制

很明显,我没有阅读全部500页,但我不知道在该文档的其他地方可能会提到限制

注意:这仅适用于Microsoft C♯, 并且仅适用于4.0版。我没有检查Microsoft C的早期版本♯, 我也没有检查ECMA/ISO C♯. 而且,它只适用于C♯, CLI中可能存在限制

最后但并非最不重要的一点是,Microsoft Visual C和♯ 和Novell Mono C♯, 以及Microsoft和Mono的CLI实现(即CLR和Mono VM)中的特定实现限制


然而,问题是关于C♯, 不是关于C语言的任何特定实现♯ 而且与CLI无关,因此我非常自信地宣称一个类可以实现的接口数量是无限的。

可以实现的接口数量受到编译器可以处理的内容的限制。接口过多会导致C#编译器中出现stackoverflow异常(错误)。这会让我相信没有固定的限制,但在某些条件下,编译器会简单地轰炸,即数量取决于编译器处理类时可用的堆栈空间

限制也可能取决于编译器版本。以下代码可用于生成用于探测限制的测试用例

    int iterations = (int)Math.Pow(2, 8) + 1;

    Func<int, string> getInterfaceName = i => "I" + i;

    StringBuilder sb = new StringBuilder();

    sb.AppendLine("using NUnit.Framework;");
    sb.AppendLine("[TestFixture]");

    sb.AppendLine("public class Test");
    sb.AppendLine("{");

    sb.AppendLine("[Test]");
    sb.AppendLine("public void bling()");
    sb.AppendLine("{");
    sb.AppendLine("Class1 class1 = new Class1();");

    for (int i = 0; i < iterations; i++)
    {
        sb.AppendLine(getInterfaceName(i) + " int" + i + " = class1;");
        sb.AppendLine("int" + i + ".Bling();");
    }

    sb.AppendLine("}");

    for (int i = 0; i < iterations; i++)
    {
        sb.AppendLine("public interface " + getInterfaceName(i) + " { void Bling(); }");
    }

    sb.Append("public class Class1 : " + getInterfaceName(0));

    for (int i = 1; i < iterations; i++)
    {
        sb.Append(", " + getInterfaceName(i));
    }

    sb.Append("{ public void Bling(){} }");

    sb.AppendLine("}");

    File.WriteAllText(@"C:\tmp.cs", sb.ToString());
intiterations=(int)Math.Pow(2,8)+1;
Func getInterfaceName=i=>“i”+i;
StringBuilder sb=新的StringBuilder();
sb.AppendLine(“使用NUnit.Framework;”);
sb.附录(“[TestFixture]”);
sb.附录(“公共类测试”);
某人附加物(“{”);
sb.附录(“[测试]”);
sb.AppendLine(“public void bling()”);
某人附加物(“{”);
sb.AppendLine(“Class1 Class1=新的Class1();”);
对于(int i=0;i
C语言对接口的数量没有限制。但有两个实际限制

首先,正如chibacity所指出的,编译器在处理大量接口或极深层次的接口时,最终会耗尽堆或堆栈空间

即使我们解决了这些问题,仍然会有第二个问题。接口实现在InterfaceImpl表中的元数据中编码。元数据表的成员通常不超过2^24个,因此程序集中所有类型实现的接口总数必须少于约1600万个


显然,在实践中你永远不会遇到这些限制。别担心。

+1因为你的回答让我窃笑。因为这是真的。据我所知,没有限制,但不确定。利维,我做了一个快速搜索,但很难找到一个明确的答案,因为这不是一个常见的问题。所以不,我不能确定没有绝对的限制。也许你可以做一些测试,找到一个科学的答案(+1),有人能证实吗?你能参考一些文章吗?-1我做了一个小实验,能够编译一个实现10*1000接口的类,所以256限制是不正确的。这不是编译器的限制,但是JIT的限制——试着在一个应用程序中运行它,该应用程序的代码通过255个以上的路径利用了类polymorphicalyinterfaces@Dean另一个快速测试。成功构建了一个实现257个接口的类,并通过每个接口访问该类。没问题。@Eric:你知道为什么限制是2^24吗?只是好奇为什么会有这个数字。它是否与元数据表本身中使用的类型(限制为2^24)有关?@Joan:Eric是MS C#语言团队的一员,因此即使元数据限制没有记录(例如在ECMA标准中),他也有内部信息。@Joan:问得好。元数据标记是一个四字节的整数,其中顶部字节标识th