26 сентября 2008

C# vs R#: объявление метода статическим

.NET


Не так давно в статье C# vs R#: использование var вместо явного указания типа я пытался объяснить чем вызваны предложения R# повсеместно использовать var в коде вместо указания конкретного типа. В этот раз я хотел бы рассказать очередную историю про R# связанную с тем, почему методы класса порой стоит объявлять статическими. Для тех, кто заинтересовался объяснение под катом.

Как известно статические методы, свойства и прочие элементы классов предназначены в основном для обращения к ним без инстанцирования класса. Можно сделать целый статический класс, который будет возвращать скажем результаты математических функций (см. Math). Но существует еще одна причина, по которой имеет смысл делать методы статическими, даже если не планируется использовать их без инстанцирования класса.

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

Похожее предложение делает и инструмент Микрософта «Code Analysis», в msdn есть небольшая статья по этому поводу и вот что в ней написано:

«Members that do not access instance data or call instance methods can be marked as static (Shared in Visual Basic). After you mark the methods as static, the compiler will emit non-virtual call sites to these members. Emitting non-virtual call sites will prevent a check at runtime for each call that ensures that the current object pointer is non-null. This can result in a measurable performance gain for performance-sensitive code. In some cases, the failure to access the current object instance represents a correctness issue.»

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

Случаи, когда методы класса не оперируют его свойствами достаточно редки, но если они есть, то судя по всему имеет смысл делать их статическими.
Наверняка, есть повод для дискуссии и я бы с удовольствием послушал другие мнения.
Теги:RresharperCcsharpstatic methods
Хабы: .NET
+16
3,8k 6
Комментарии 35
Реклама
Лучшие публикации за сутки

Рекомендуем