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

Похожее предложение делает и инструмент Микрософта «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 для всех объектов класса будет существовать только один экземпляр метода, что так же увеличит производительность.
Случаи, когда методы класса не оперируют его свойствами достаточно редки, но если они есть, то судя по всему имеет смысл делать их статическими.
Наверняка, есть повод для дискуссии и я бы с удовольствием послушал другие мнения.