2009-11-02 13 views
5

ich gefragt haben, zu verwenden, wenn statische Funktionen zu verwenden und wann nicht in ASP.NETWann ist es am besten, statische Funktionen in ASP.NET

Was sind die Vor- und Nachteile im Umgang mit ihnen, in verschiedenen Aspekten wie Leistung, nach guten Praktiken usw. (und viele mehr, was immer Sie für relevant halten).

Wir freuen uns auf Ihre Antworten.

Danke,
Mahesh Velaga.

+4

Siehe http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it – cdonner

+0

ganz wenigen simillar Fragen zu demonstrieren: http : // stackoverflow.com/search? q = static + Methoden –

+0

@cdonner und @preet .. danke für die Links .. aber ich war auf der Suche nach einem umfassenden Beitrag von der Community über statische Methoden, da ich nicht viel klar über war t sie .. danke nochmal .. :) –

Antwort

4

Nachteile:

  • Threadingprobleme (statische Funktionen aufgerufen, keine Instanz erforderlich werden, so ist es leicht, sie aus verschiedenen Teilen des Codes aufgerufen werden und wenn sie lesen/schreiben auf einen freigegebenen Dieser Zustand ist möglicherweise in einer Umgebung mit mehreren Threads (z. B. ASP.NET) beschädigt
  • Test schwierig (da statische Funktionen keine Objektinstanz erfordern, ist die Konstruktorinjektion unmöglich, dh die einzige Möglichkeit, Abhängigkeiten zu injizieren, ist indem sie als Argumente an die Funktion selbst übergeben werden)

Vorteile:

  • Leistung (dies ist fraglich - in den meisten Fällen Leistungsgewinne im Vergleich zu anderen Teilen des Codes völlig vernachlässigbar sind)
+0

könntest du bitte näher drauf eingehen, oder Könnten Sie einige Hinweise in diese Richtung geben .. Danke –

+0

Wäre nicht ein weiterer Vorteil Semantik: Einige Verhaltensweisen sind nicht abhängig von einer umschließenden Instanz zu funktionieren, so ist es mehr "richtig", sie als solche zu markieren. – ehdv

+1

@ehdv das ist eine Erweiterung der Leistung - nur unnötige Instanzen zu beseitigen. –

1

Der einzige große Nachteil auf eine statische Methode ist, dass es fast vollständig nicht testbar. Benutzer der Methode müssen sich an die konkrete Methode binden und können nicht an eine Abstraktion binden, was das Fälschen oder Mocking schwierig, wenn nicht gar unmöglich macht.

Dies kann oder kann kein Problem sein, abhängig vom Code jedoch.

Die andere Sache, auf die Sie achten sollten, ist, dass statische Daten für alle Anforderungen an den Server universell sind.

+1

Es ist auch sehr verwirrend für die ersten ASP.NET-Entwickler. –

2

Es gibt definitiv Situationen, in denen Statik die richtige Lösung ist, wie bei jeder Anwendung. Jedes Mal, wenn Sie ein Objekt haben, das im Anwendungsbereich der Anwendung und nicht im Geltungsbereich der Anforderung enthalten sein sollte, sollte es statisch sein, und Sie sollten statische Methoden verwenden, um darauf zuzugreifen und sie zu bearbeiten.

Als Beispiel, hier ist ein Codeausschnitt, den ich kürzlich für eine ASP.NET-Anwendung geschrieben habe, die im Wesentlichen ein Serializer-Cache ist. Serialisierer sind teuer in der Erstellung, und wir können dieselbe für jeden Typ verwenden, solange unsere Anwendung läuft. Es muss also keine Zeit in jedem Anfragethread für sie verschwendet werden:

() Hinweis: dies wurde reduziert die statischen Aspekte)

public class XmlSerializerUtility 
{ 
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>(); 
    private static object sync = new object(); 

    public static T Deserialize<T>(string input) 
    { 
     XmlSerializer xs = GetSerializer(typeof(T)); 
     using (StringReader sr = new StringReader(input)) 
     { 
      return (T)xs.Deserialize(sr); 
     } 
    } 

    public static XmlDocument Serialize(object input) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlSerializer xs = GetSerializer(input.GetType()); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      xs.Serialize(stream, input); 
      stream.Position = 0; 
      doc.Load(stream); 
     } 
     return doc; 
    } 

    private static XmlSerializer GetSerializer(Type type) 
    { 
     lock (sync) 
     { 
      XmlSerializer xs = null; 
      if (!serializers.ContainsKey(type)) 
      { 
       xs = new XmlSerializer(type); 
       serializers.Add(type, xs); 
      } 
      else 
      { 
       xs = serializers[type]; 
      } 
      return xs; 
     } 
    } 
} 
+1

@Rex M, Ihr 'Dictionary ' ist sinnlos, XmlSerializer verwendet bereits fortgeschrittene Caching-Techniken und es wird nicht zweimal die gleiche Temp-Assembly für die gleichen Typen erstellt. Ein einfacher 'neuer XmlSerializer (Typ)' wird den Job gut machen. Ich habe einmal das Gleiche gemacht, nur um herauszufinden, dass die 'Lock'-Anweisung so langsam war wie das Neugenerieren des Serialisers :-) –

+0

@Darin Ich denke, dass du dich irren kannst. Die XmlSerializerFactory verwendet zwar Caching, unterstützt aber generische Typen nicht sehr gut. Der XmlSerializer (keine Factory) wird nicht zwischengespeichert. –

+0

@Rex M, gemäß der Dokumentation (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx), wenn Sie eines der folgenden ctors verwenden: 'XmlSerializer.XmlSerializer (Type) 'oder' XmlSerializer.XmlSerializer (Type, String) 'was Sie tun: Die XML-Serialisierungsinfrastruktur generiert dynamisch Assemblys, um bestimmte Typen zu serialisieren und zu deserialisieren. Die Infrastruktur findet und wiederverwendet diese Assemblys. –

Verwandte Themen