C#类可以有多少种方法

DHo*_*out 16 .net c# methods class-design

C#类可以拥有的属性数量是否有限制?

我快速浏览标准ECMA-334并没有找到任何相关信息.

在进入为什么一个有很多方法的课程设计不好之前,我想更明确一下这个意图.当然,我不会手动编写一个包含大量方法的类.我问这个的原因是我需要通过代码生成大量的执行单元.我讨论的是具有单个方法的多个类或具有多个方法的一个大类.

所以对于这个问题,如果有限制我会感兴趣,属性数量,方法的限制是多少.

lep*_*pie 27

每种方法每集合1670万(不是类).

  • 方法定义表仅包含24位索引.简单的数学.阅读规范:) (10认同)
  • 可能是这样,但你能提一下这些信息的来源吗? (4认同)

And*_*ann 16

我不知道C#类可以有多少方法,但我知道当你想到它时,你肯定做错了什么.

如果有一个限制(我怀疑)它是如此之高,你不会超过它.除了你有一个非常糟糕的课程设计.

看到反模式"上帝的对象".

更新:

即使我仍然不知道你想要实现什么,我仍然认为你应该用很少的方法创建很多类,原因如下:

  • 性能:如果要将所有属性放入一个类中,则在创建实例时必须为每个属性分配内存,即使您只需要类中5%的属性

  • 模块化:如果你创建了很多类,你可以让它们都实现一个接口/抽象类,从而定义一个类似的结构,这将有助于使你的应用程序更加模块化

  • 结构:当只有它们位于同一个类中时,看看哪些方法使用哪些属性非常简单 - 否则事情可能会变得非常混乱

  • 编译时间:在更改一个函数的实现时,不需要重新编译其他函数,因为它们在其他类中

  • @andre:-1 Andre,你100%正确,但你根本就没有回答这个问题.很多时候SO用户都会提出答案,以宣传优秀的设计.良好,良好的设计很重要,但这就是为什么许多人来到SO,为了得到晦涩难懂的问题,而不必为自己辩护.我觉得这很公平. (10认同)
  • 要确定这是否有用,我们必须知道他到底在做什么.由于我们没有,我假设常规情况,不涉及构建编译器. (9认同)
  • 这不是答案.如果(例如)DHornpout想要编写c#编译器或其他东西,它怎么能帮上忙? (8认同)
  • 我想我需要更明确的意图.当然,我不会手动编写一个包含大量方法的类.我问这个的原因是我需要通过代码生成大量的执行单元.我讨论的是具有单个方法的多个类或具有多个方法的一个大类. (2认同)

Joe*_*ari 16

在当前的CLR实现中,正确的答案是ushort.MaxValue - 15.这可以测试如下:

AppDomain appDomain = AppDomain.CurrentDomain;

AssemblyName aname = new AssemblyName ("MyDynamicAssembly");

AssemblyBuilder assemBuilder =
  appDomain.DefineDynamicAssembly (aname, AssemblyBuilderAccess.Run);

ModuleBuilder modBuilder = assemBuilder.DefineDynamicModule ("DynModule");

TypeBuilder tb = modBuilder.DefineType ("Widget", TypeAttributes.Public);

for (int i = 0; i < ushort.MaxValue - 15; i++)
{
    MethodBuilder methBuilder = tb.DefineMethod ("SayHello" + i, MethodAttributes.Public, null, null);
    ILGenerator gen = methBuilder.GetILGenerator();
    gen.EmitWriteLine ("Hello world");
    gen.Emit (OpCodes.Ret);
}
Type t = tb.CreateType();
object o = Activator.CreateInstance (t);
Run Code Online (Sandbox Code Playgroud)

如果您使用Reflection.Emit创建一个类型化的DataContext来支持数据库(如LINQPad那样),则问题是相关的.有足够的存储过程,您可以达到此限制!

  • +1是单一的实际正确答案.如果可能的话,我会加上十个这个答案,特别是考虑到所有其他空洞的答案确实得到了太多的赞成.只有当你知道某些东西的实际局限性时,你才能解决它.感谢您的示例代码节省了我很多时间,感谢您出色的书籍. (2认同)

Fre*_*örk 1

比你想在单一课程中投入的内容还要多。