Сколько методов может иметь класс C#

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

Я бегло просматриваю стандарт ECMA-334 и не нашел никакой информации о нем.

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

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


person DHornpout    schedule 12.09.2009    source источник
comment
-1 - Это не имеет значения. См. отличный ответ Андре Хоффманна.   -  person TrueWill    schedule 12.09.2009
comment
@truewill: не согласен на 100%. Это не имеет значения для вас, но это важно для DHornpout. Я понимаю, что хорошая практика чрезвычайно важна, но вопрос не в этом. Мы не должны предполагать сценарий спрашивающих и не должны требовать оправданий. мы должны ответить на вопрос и, если необходимо, дополнить предложениями по передовой практике.   -  person andy    schedule 15.09.2009


Ответы (9)


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

person leppie    schedule 12.09.2009
comment
Это может быть так, но не могли бы вы указать источник этой информации? - person Philippe Leybaert; 12.09.2009
comment
В таблице определения методов есть место только для 24-битных индексов. Простая математика. Прочтите спецификацию :) - person leppie; 12.09.2009
comment
На самом деле таблица MethodDef не имеет определенного ограничения. Однако в индексной части маркера метаданных доступно только 24 бита, поэтому, хотя вы, вероятно, могли бы создать сборку .NET с более чем 2 ^ 24 методами, вы могли бы ссылаться только на первые 2 ^ 24, плюс я сомневаюсь, что CLR загрузить его. - person Sam Harwell; 14.09.2009

Правильный ответ в текущей реализации 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). С достаточным количеством хранимых процедур вы можете достичь этого предела!

person Joe Albahari    schedule 18.08.2012
comment
+1 за единственный правильный ответ. Я бы добавил десять этому ответу, если это возможно, особенно с учетом всех тех других бессодержательных ответов, которые получили слишком много голосов. Только если вы знаете фактические ограничения чего-то, вы можете обойти/с этим справиться. Спасибо за пример кода, сэкономивший мне время, и спасибо за вашу прекрасную книгу. - person Sascha Hennig; 13.08.2014

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

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

См. антишаблон "Объект Бога".

ОБНОВЛЕНИЕ:

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

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

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

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

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

person André Hoffmann    schedule 12.09.2009
comment
Пожалуйста, оставьте комментарий при минусовом голосовании. - person André Hoffmann; 12.09.2009
comment
Это не ответ. Как это может помочь, если (например) DHornpout хочет написать компилятор C # или что-то в этом роде? - person x2.; 12.09.2009
comment
Чтобы решить, полезно это или нет, мы должны знать, что именно он делает. Поскольку мы этого не делаем, я предположил обычный случай, который не требует создания компилятора. - person André Hoffmann; 12.09.2009
comment
Я думаю, мне нужно быть более ясным в намерениях. Конечно, я не буду писать класс с большим количеством методов вручную. Причина, по которой я спрашиваю об этом, заключается в том, что мне нужно сгенерировать большое количество исполнительных единиц по коду. Я спорю между несколькими классами с одним методом или одним большим классом с несколькими методами. - person DHornpout; 13.09.2009
comment
Не могли бы вы отредактировать свой ответ, чтобы отразить 2 возможных дизайна классов, между которыми вы пытаетесь выбрать? - person André Hoffmann; 13.09.2009
comment
Спасибо за тщательное обновление. Да, с помощью различных тестов несколько классов лучше, чем один класс с несколькими методами. Конечно, это приводит к другому вопросу, сколько классов может содержать одна сборка, прежде чем это станет проблемой производительности. Я голосую за ваше продуманное и полезное предложение. - person DHornpout; 15.09.2009
comment
Можете ли вы дать нам несколько цифр? Сколько у вас будет занятий? Сколько экземпляров будет создано за один запуск? Может быть, вы даже можете сказать нам, что именно вы делаете? - person André Hoffmann; 15.09.2009
comment
@andre: -1 Андре, ты прав на 100%, но ты просто не отвечаешь на вопрос. Слишком много раз пользователи SO крутят ответы, чтобы проповедовать хороший дизайн. Хороший, хороший дизайн важен, но именно поэтому многие приходят на SO, чтобы получить ответы на непонятные вопросы, не оправдывая себя. Я думаю, это справедливо. - person andy; 15.09.2009
comment
@andy: я отвечаю на вопрос, по крайней мере, в обновлении. Чтобы полностью ответить на его вопрос, нам потребуется больше информации. Если вы прочитаете его комментарий, вы увидите, что он согласился использовать несколько классов вместо нескольких методов. Теперь ему просто нужно выяснить, какова производительность, когда у него много занятий. Чтобы ответить на этот вопрос, нам нужно знать, сколько классов у него может быть. Если бы ему не пришлось оправдываться, как бы он понял, что то, что он делает, противоречит здравому смыслу? Дискуссии — это не плохо. Не то чтобы мой ответ был: нет. Не могу. Сделай это. Ведь это всего лишь мнение. - person André Hoffmann; 15.09.2009
comment
@andre: достаточно честно, в этом случае действительно помогло указание на передовой опыт. Я думаю, что всегда есть прекрасный баланс, который нужно найти между вопросом о том, верен ли сам вопрос, и просто ответом на вопрос. С одной стороны, некоторые вопросы задаются дезинформацией, например, вопрос Д. Хорнпоута. Но, с другой стороны, зачастую бесполезно требовать от спрашивающего столько оправданий... хм.... Мне кажется, у нас немного мета... - person andy; 15.09.2009
comment
Обычный случай: любопытство. Или это действительно так немыслимо? - person John; 07.06.2017

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

person João Silva    schedule 12.09.2009

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

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

person Dmitry    schedule 29.03.2013

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

person Fredrik Mörk    schedule 12.09.2009

Да...

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

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

person Heiko Hatzfeld    schedule 12.09.2009

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

person Mehmet Aras    schedule 12.09.2009

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

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.

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

person Brad Aisa    schedule 04.05.2012