2010-07-13 2 views
7

То, как я это понимаю, имеет переменную-член, объявленную как статический в класс no-static приводит к тому, что переменная-член является уникальной, не имеет числа экземпляров этого класса.Какова точка объявления статического метода в нестатическом классе?

Теперь, что происходит со статическим методом, объявленным в нестационарном классе? И (Самое главное), что точка объявления статического метода в нестационарном классе?

Спасибо за помощь

+3

Я бы не использовал слово «уникальный» здесь. Это _shared_ между всеми экземплярами. –

+0

@ Хенк Холтерман: Спасибо, что исправил меня. – Richard77

ответ

4

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

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

+1

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

21

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

DateTime.Parse и Int32.Parse являются примерами.

+10

И есть руководство, которое «если оно может быть статичным, чем статическим». –

+2

Связано с комментарием Хенка Холтермана: http://stackoverflow.com/questions/790281 –

2

Например, у вас есть класс, например Bank_Account, в котором вы хотите рассчитать количество объектов, созданных для этого класса.
Итак, у вас есть одно статическое поле, скажем count. Затем, когда вы инициализируете любой объект класса Bank_Account, вам необходимо увеличить поле, в котором хранится количество объектов, созданных для этого класса, метод, увеличивающий эту статическую переменную, является статическим, так как он одинаковый для всех объектов, созданных для этого класса.

+0

Почему этот ответ ниспровергается ??? :-(Он также говорит, что говорит 'ck's' ответ, но это пример такого метода! – Himadri

+1

Я тоже не понимаю нисходящее изображение: мне кажется, что это жизненно важный момент. Если у вас есть данные, которые касаются все экземпляры или любой экземпляр, а не один конкретный экземпляр, тогда он должен быть статичным. Например, только вчера я создал класс, где мне нужно назначить каждому экземпляру уникальный идентификатор. Создание статического счетчика было простым и логичным способом сделайте это. – Jay

1

Как ck сказал, что это могут быть методы, которые имеют какое-то отношение к типу. Важно помнить, что это будет функция утилиты, которая не сможет получить доступ к каким-либо переменным-членам в типе/классе, так как может быть вызвана непосредственно без какого-либо экземпляра класса. Если вы попытаетесь определить статический метод, который обращается к переменной-члену (или не статическому методу), вы фактически получите ошибку компилятора.

5

Полезно для создания фабричных методов, которые не являются элементами какого-либо объекта, но для его инициализации требуется доступ к внутренним элементам объекта.

5

Вам нужны статические методы в нестатических классах f.e. для образца фабрики (если класс является завод по себе, как отметил Жако Преториус):

MyClass newInstance = MyClass.Create(); 

Или, если вы хотите создать вспомогательные методы. F.E. Вы можете написать FTP-Class, который полностью работает, с Connect(), SendCommand(), ReceiveAnswer(), Disconnect() и т.д., но вы хотите, чтобы позволить пользователю легко загрузить один файл, без необходимости выполнения всей процедуры:

MyFTPClass.UploadFile("username", "password", "pathToFile"); 
+1

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

3

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

См. Singleton

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