Сколько методов может иметь класс C # - PullRequest
16 голосов
/ 12 сентября 2009

Есть ли ограничения по количеству свойств, методов, которые может иметь класс C #?

Я быстро пробежался по Стандарту ECMA-334 и не нашел никакой информации о нем.

Прежде чем перейти к тому, почему класс с множеством методов является плохим дизайном, я хочу более четко понять намерения. Конечно, я не буду писать класс с большим количеством методов вручную. Причина, по которой я спрашиваю это, заключается в том, что мне нужно генерировать большое количество исполнительных блоков по коду. Я спорю между несколькими классами с одним методом или одним большим классом с несколькими методами.

Так что для этого вопроса меня интересует только ли лимит и какой лимит для количества свойств, методов.

Ответы [ 9 ]

27 голосов
/ 12 сентября 2009

16,7 миллионов за сборку на метод (не класс).

16 голосов
/ 18 августа 2012

Правильный ответ в текущей реализации 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);

Вопрос актуален, если вы используете Reflection.Emit для создания типизированного DataContext для поддержки базы данных (как это делает LINQPad). При наличии достаточного количества хранимых процедур вы можете достичь этого предела!

16 голосов
/ 12 сентября 2009

Я не знаю, сколько методов может иметь класс C #, но я знаю, что когда вы думаете об этом, вы наверняка делаете что-то не так.

Если есть предел (в чем я сомневаюсь), он настолько высок, что вы его не превысите. За исключением того, что у вас действительно плохой дизайн класса.

См. Анти-паттерн "Объект Бога" .

UPDATE

Несмотря на то, что я до сих пор точно не знаю, чего вы хотите достичь, я все же считаю, что вам определенно следует создать множество классов с несколькими методами по следующим причинам:

  • Производительность : если вы помещаете все свойства в один класс, для каждого свойства должна быть выделена память при создании экземпляра, даже если вам нужно только 5% свойств в вашем классе. класс

  • Модульность : если вы создаете много классов, вы можете заставить их все реализовать интерфейс / абстрактный класс и тем самым определить аналогичную структуру, которая поможет сделать ваше приложение более модульным

  • Структура : довольно просто увидеть, какие методы используют какие свойства, если только они находятся в одном классе - в противном случае все может стать действительно беспорядочным

  • Время компиляции : при изменении реализации одной функции другие не нужно перекомпилировать, как в других классах

4 голосов
/ 12 сентября 2009

Метод Type.GetMethods возвращает массив, который должен быть проиндексирован целым числом, поэтому, я бы сказал, вы не можете иметь более int.MaxValue методов на класс.

2 голосов
/ 29 марта 2013

Посмотрите на это: https://softwareengineering.stackexchange.com/questions/193295/implications-of-a-large-partial-class/193304?noredirect=1#193304

Кто-то действительно испытал боль от создания класса с как можно большим количеством методов

1 голос
/ 12 сентября 2009

Больше, чем вы когда-либо захотите поместить в один класс.

0 голосов
/ 04 мая 2012

У меня есть инструмент для автоматической генерации кода, и в настоящее время я достиг предела между ~ 5K (который работал) и 10K, что не удалось

System.TypeLoadException: Type '<the type name>' from assembly '<the assembly name>, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' contains more methods than the current implementation allows.

Так что это противоречит утверждениям о том, что оно «безгранично».

0 голосов
/ 12 сентября 2009

Я так не думаю. Тем не менее, хорошие практики и рекомендации по разработке программного обеспечения, когда они соблюдаются и рассматриваются, должны, естественно, ограничивать количество свойств и методов, которые имеет класс, тем, что имеет смысл и является абсолютной необходимостью. К таким практикам относятся SOLID, KISS (будь проще), DRY (не повторяйся), композиция, рефакторинг, наследование и т. Д.

0 голосов
/ 12 сентября 2009

Да ...

Это называется здравым смыслом. Старайтесь не перегружать класс, это, скорее всего, нарушит принцип единой ответственности, и никто не сможет его понять.

В конце концов, класс существует «только для того, чтобы помочь разработчику, который не может поместить более 7 данных одновременно в свою кратковременную память» (да, я знаю, что это опасное утверждение)

...