в C# есть очень элегантный механизм расширений возможностей существующих обьектов, он так и называется -
расширения
https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...
https://metanit.com/sharp/tutorial/3.18.php
но реализуется он только статическими методами, и только в статических классах
следующий пример -
фабрики классов, так вот в C#, наиболее естественным образом, фабрики реализуются именно
статическими методами
всем этим приемам есть свое место и время, просто надо в этом разобраться
ps
Соответственно, я могу сделать метод и сам класс статическим(и иметь красивый код) или не делать(и каждый раз создавать экземпляр класса, чтобы вызвать метод) .
и у вас будет один экземпляр класса. далеко не всегда это уместно. большинство прикладных задач, требует множества экземпляров различных классов
тем не менее, бвают ситуации, которые решаются гораздо элегантнее, именно статикой. а без нее получаются жутко корявыми
Есть ли у статического варианта какие-то подводные камни, например, при вызове из нескольких потоков?
у методов может и нет, зависит о того к чему они обращаются? если вызываете другие потокобезопасные методы (библиотечных классов) + изучите и будете применять потокобезопасные алгоритмы - какие могут быть проблемы? (пример - расширения LINQ, который вообще почти полностью на расширениях то и построен (то есть в основном на статических методах))
но помните о остатических полях! - даже если класс не статический, он может иметь статические и методы и поля. статическое поле - так же один единственный экземпляр на всю программу, даже если сам класс не обьявлен статическим. а значит потокобезпасным он может быть, только если статическое поле используется readonly
вывод - статика классная штука!... однако применять ее действительно надо только тогда, когда ясно понимаете что делаете? и зачем делаете именно так?