Подтвердить что ты не робот

Статические и нестатические члены класса

Я новичок в программировании в целом. У меня есть быстрый вопрос - что лучше всего относится к статическим/нестационарным переменным.

У меня есть переменная, private int x, которая принадлежит классу y. Чтобы получить доступ к этой переменной, мне нужно обратиться к y. Если x был статичным, я могу получить доступ к этой переменной без ссылок на y.

Каким будет лучший способ, в ситуации, когда несколько методов в классе y будут ссылаться на это значение?

Надеюсь, это имеет смысл, и мой вопрос не слишком прост!

Большое спасибо

4b9b3361

Ответ 1

Вам нужно думать о статических переменных как принадлежащих классу, а не к экземплярам класса.

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

Если нет, используйте переменную экземпляра.

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

Ответ 2

Лучше всего избегать публичного статичного. В ООП класс должен скрывать своих членов. Static на самом деле не является членом экземпляра, а типа .

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

Вам нужно прочитать Статические классы и статические члены класса (руководство по программированию на С#).

Ответ 3

Ваш выбор зависит от вашей архитектуры.

Static делает часть типа, другие - частью экземпляра этого типа. Если вы хотите иметь какое-то общее состояние (скажем) между разными экземплярами одного и того же типа, используйте Static. Если вы хотите, чтобы каждый экземпляр имел собственное значение, независимо от других, используйте поля instance.

В обоих случаях, кстати, избегайте раскрытия, как public fields, но используйте свойства.

Ответ 4

Ну, я не могу окончательно сказать, что лучше, потому что они служат в разных целях.

Вы знакомы с ООП? В ООП статические объекты или члены класса, к которым можно получить доступ непосредственно из класса, в то время как нестатические члены могут быть доступны только из экземпляра, к которому он принадлежит.

С# следует аналогичному принципу для методов. Статические методы могут получить доступ непосредственно из класса, в то время как нестатические методы (или методы экземпляра, как я их называю) должны быть доступны из экземпляра. Вот почему instatiating нужно делать, например, методы, в то время как для статических методов это просто не нужно, а тем более непрактично (см. Ниже).

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

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

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

Чтобы не усложнять ситуацию, я остановлюсь здесь. Дайте мне знать, если вы что-то поняли.

Ответ 5

Я полностью согласен с г-ном Oded:

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

Если нет, используйте переменную экземпляра.

Да, добавление static к члену класса в основном означает, что вы можете получить к нему доступ без экземпляра и только вне любого экземпляра. И да, он станет глобальным ресурсом или даже глобальной переменной, если вы это сделаете.

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

Использование статических членов как глобальных vars против OOP

Это означает, что после установки статического члена вы не можете передавать его как объект. Чем больше вы используете static в качестве глобального var, тем труднее для модульное тестирование/mock classes

Для этого есть решение Singletons. Но они никогда не должны появляться без предупреждения!

С другой стороны, если вы уверены, вам действительно нужны глобальные вары, посмотрите на шаблон Toolbox. Это не очень известное расширение шаблона Singleton. На самом деле это так неизвестно, если вы используете Google для этого, вы не найдете его с этими ключевыми словами (шаблон панели инструментов).

Итак, планируйте заранее. Прочитайте больше. Узнайте о каждом варианте, чтобы вы могли решить лучше. Даже получить книгу. Объектно-ориентированное программирование - это больше о применении концепций, которые помогут в долгосрочной перспективе, а не просто для того, чтобы сделать работу сейчас.

Ответ 6

В общем случае, если вы хотите иметь переменную public, статическую или экземплярную, вы должны обернуть ее в свойство и выставить ее так. Это точно принцип, который вам понравится.

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

Легко говоря, а не на языке старейшин, статичность означает нечто, не принадлежащее ни одному экземпляру этого класса, но влияющее на них. Примером статического свойства в классе, который генерирует экземпляры, является, например, фактор, который должен быть глобальным для всех экземпляров класса, принимать участие в вычислении, которое выполняется внутри экземпляров. В этом случае, и, на мой взгляд, лучше, чтобы этот фактор был объявлен как статический, а в каждом его экземпляре. Особенно, если этот фактор меняет время жизни вашей программы, чтобы повлиять на следующий расчет.

Ответ 7

Вам нужно задать вопрос себе: зачем мне x статичным?

Если вы сделаете x static, это означает, что x является частью всех объектов класса A, но когда x не является статическим, это означает, что x является частью только одного объекта.

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

Я предлагаю вам ознакомиться с использованием singelton http://en.wikipedia.org/wiki/Singleton