Static kann an vielen Stellen Sinn machen, sollte aber mit Bedacht genutzt werden, da static prinzipiell etwas gegen die Prinzipien der Objektorientierung arbeitet (z.B. der Zuweisung von Funktionalität an ein Objekt).
Static kann aber beispielsweise Sinn machen, wenn du ein Singlepattern implementieren möchtest. Ein Singletonpattern könnte z.B. wie folgt aussehen:
public class Singleton
{
public static Singleton Instance { get; }
static Singleton()
{
Instance = new Singleton();
}
private Singleton()
{ }
public void InstanceMethod1() => Console.WriteLine("Ich bin eine Instanzmethode");
public void InstanceMethod2() => Console.WriteLine("Ich bin auch eine Instanzmethode");
}
Durch dieses Muster hast du immer eine nur genau eine Instanz der Singleton-Klasse (auf der Property "Instance"), da die Klasse nicht außerhalb von sich selbst instanziiert werden kann und sich selbst nur beim ersten Zugriff auf sie instanziiert (Eigenschaft des statischen Konstruktors: Er wird nur ein einziges Mal beim ersten Zugriff auf die Klasse durchlaufen). Diese eine Anwendungs-weite Singletoninstanz kannst du dann in der ganzen Anwendung wie folgt abrufen und dessen Instanzmethoden verwenden:
public void SingletonTest()
{
Singleton.Instance.InstanceMethod1();
}
Static benutze ich außerdem häufig für "Toolbox"-Klassen - also Klassen die allgemeine Funktionen bereitstellen um mir das Leben zu vereinfachen und einfach immer aufrufbar sein sollen ohne das ich explizit eine Instanz der Klasse erstellen muss. Außerdem macht z.B. auch in Anwendungsfällen Sinn, wo du zählen möchtest, wie oft ein Objekt bereits initialisiert wurde.
Ein besonderer Anwendungsfall sind Extensionmethoden - also Methoden mit denen du vorhandene Klassen dessen Quellcode dir nicht vorliegt erweitern möchtest. Z.B. so:
public static class ListExtensions
{
public static void PrintAllItems<T>(this List<T> items)
{
foreach (var item in items)
Console.WriteLine(item);
}
}
Dadurch schaffst du dir die Möglichkeit die Methode "PrintAllItems" auf allen Objekten vom Typ List<T> aufzurufen:
public void ExtensionTest()
{
var list = new List<string>();
list.PrintAllItems();
}
Es gibt bestimmt noch tausende Anwendungsfälle für static und auch viele bei denen man auf static verzichten sollte, jedoch sind das so die Fälle in welchen ich static oft verwende.