2009-09-12 3 views
14

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

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

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

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

+2

-1 - это не имеет значения. См. Превосходный ответ Андре Гофмана. – TrueWill

+17

@truewill: не согласен 100%. Для вас это не важно, но это важно для DHornpout. Я понимаю, что хорошая практика чрезвычайно важна, но это не вопрос. Мы не должны предполагать сценарий адеектов, и мы не должны требовать оправданий. мы должны ответить на этот вопрос и, при необходимости, дополнить предложениями о хорошей практике. – andy

ответ

1

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

17

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

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

Просмотреть анти-шаблон "God object".

UPDATE:

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

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

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

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

  • время Компиляция: при изменении реализации одной FUNC Тион, остальные не должны быть повторной компиляции, так как они находятся в других классах

+0

Пожалуйста, оставьте комментарий при downvoting. –

+8

Это не ответ. Как это может помочь, если (например) DHornpout хочет написать компилятор C# или что-то еще? –

+9

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

1

Да ...

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

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

1

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

27

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

+4

Это может быть так, но не могли бы вы упомянуть источник этой информации? –

+10

В таблице определения метода есть место для 24 бит индексов. Простая математика. Прочитайте спецификацию :) – leppie

+0

Фактически, таблица MethodDef не имеет определенного предела. Однако в индексной части токена метаданных доступно только 24 бита, поэтому, возможно, вы можете создать сборку .NET с более чем 2^24 способами, вы можете ссылаться только на первые 2^24 плюс, я сомневаюсь, что CLR будет загрузите его. –

4

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

0

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

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

Знаете ли вы точный предел? –

14

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

+2

+1 для того, чтобы быть единственным фактическим правильным ответом. Я бы добавил десять ответов, если это было возможно, особенно учитывая, что все эти пустые ответы ушли слишком много. Только если вы знаете фактические ограничения того, что вы можете обойти/с ним. Спасибо за пример кода, который мне очень помогает, и спасибо за отличную книгу. –

Смежные вопросы