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万.
显然,你在实践中永远不会遇到这些限制.别担心.
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)
归档时间: |
|
查看次数: |
19861 次 |
最近记录: |