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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

См. anti-pattern Объект Бога.

UPDATE

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 7

Да...

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

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

Ответ 8

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

Ответ 9

У меня есть инструмент для создания автоматизированного кода, и в настоящее время я попал в предел между ~ 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.

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