允许实现多少个接口?

Liv*_* M. 24 .net c# interface interface-implementation

在C#中:

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

public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
Run Code Online (Sandbox Code Playgroud)

N有限制吗?

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

Eri*_*ert 42

C#语言对接口数量没有限制.但有两个实际限制.

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

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

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

  • @Joan:好问题.元数据标记是一个四字节整数,其中顶部字节标识令牌的种类.因此,例如"TypeDef"标记具有顶部字节0x02.这为令牌的其余部分留下了24位. (13认同)
  • 有一个较早的限制,一个类型不能超过65536个成员.当C++程序员在*all*他们的代码上翻转/ clr选项并将其非托管函数和全局变量塞入一个超类时,会定期遇到它.我认为这是元数据令牌,但它似乎不是在检查335之后. (5认同)
  • @Eric:你知道为什么限制是2 ^ 24吗?只是好奇为什么这个号码.它是否与元数据表本身中使用的类型相关,限制为2 ^ 24? (2认同)
  • @Joan:Eric是MS的C#语言团队的一员,所以即使没有记录元数据限制(例如在ECMA标准中),他也有内部信息. (2认同)

Tim*_*oyd 15

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

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

    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());
Run Code Online (Sandbox Code Playgroud)


Nob*_*ody 8

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

据我所知,除了计算机的内存之外没有任何限制.

  • +1因为你的回答让我有所作为.因为这是真的. (2认同)