Wie hat Microsoft das gemacht? (eine OO-Frage zu ihrer .NET HttpServerUtility-Klasse)

8

HttpServerUtility enthält eine öffentliche Funktion namens UrlEncode. Es ist keine gemeinsame Funktion. HttpServerUtility hat keine öffentlichen Konstruktoren.

Dies schlägt fehl:

%Vor%

Das funktioniert, und Microsoft sagt es so:

%Vor%

Wie haben sie das erreicht? Sie können eine Instanz davon nicht mit einem Konstruktor instanziieren, aber Sie können nicht auf UrlEncode zugreifen, indem Sie nur auf HttpServerUtility.UrlEncode verweisen.

EDIT: Obwohl ich es sehr genossen habe, dass jeder in eine große OO-Debatte geraten ist, glaube ich, dass das Problem eine fehlerhafte MSDN-Dokumentation ist. Die Zeile "Dim instance As HttpServerUtility" sollte "Dim instance As HttpServerUtility = Context.Server" lesen Der Code, den ich einfügte (der aus der MSDN-Dokumentation stammt), funktioniert nicht tatsächlich und löst stattdessen eine Nullreferenzausnahme aus d erwarten. Danke, Jason!

    
emkayultra 06.01.2010, 20:50
quelle

4 Antworten

17

Bist du sicher, dass das funktioniert?

%Vor%

Dies gibt dir zur Laufzeit ein NullReferenceException (und der Compiler gibt dir eine Warnung, dass instance nicht zugewiesen ist). Im Ernst, Microsoft hat hier nichts gemacht. Der obige Code ist katastrophal falsch und wird zur Laufzeit absterben.

Und das kannst du nicht machen

%Vor%

weil UrlEncode nicht als Shared Methode in HttpServerUtility definiert ist.

Sie benötigen eine Nicht-Null-Instanz von HttpServerUtility . Der richtige Weg, um HttpServerUtility zu verwenden, ist wie folgt:

%Vor%

Eine andere Möglichkeit ist, HttpUtility zu verwenden, für die es eine Shared Methode HttpUtility.UrlEncode :

gibt %Vor%     
jason 06.01.2010, 21:03
quelle
4

Zunächst einmal funktioniert keines der von Ihnen angegebenen Codebeispiele.

Das erste Beispiel funktioniert nicht, da UrlEncode eine Instanzmethode ist, daher können Sie es nicht vom Typ htpServerUtility.UrlEncode (encodeMe) aufrufen.

Das zweite Beispiel funktioniert nicht, weil die Variable nicht zugewiesen wurde.

Das hat nichts mit statischen Konstruktoren zu tun, und die Antworten, die darauf hinweisen, sind irreführend.

Der HttpServerUtility-Typ wird nur intern von der System.Web-Assembly initialisiert. Sie können keine eigenen Instanzen davon erstellen. Sie können auf eine Instanz davon in einer Webanwendung zugreifen, indem Sie HttpContext.Server verwenden (wodurch eine Instanz einer HttpServerUtility zurückgegeben wird).

    
Adam Ralph 06.01.2010 21:13
quelle
2

Verwenden Sie HttpUtility.UrlEncode () anstelle von HttpServerUtility.UrlEncode () . Die Version von HttpServerUtility ist eine Instanzmethode und keine gemeinsame / statische Methode. Dies hat nichts mit einem statischen Konstruktor zu tun (ein statischer Konstruktor würde das erste Mal aufgerufen werden, wenn eine statische Methode von der Klasse aufgerufen wird)

    
Matthew Whited 06.01.2010 21:06
quelle
-4

Es hat einen statischen privaten Konstruktor, der es erlaubt, verwendet zu werden. Schauen Sie sich den folgenden Link an: Statische Konstruktoren

Wenn Sie sehen möchten, was sie heruntergeladen haben Reflektor herunterladen und öffnen Sie es.

EDIT: Um die Antwort zu spülen, um Leute glücklich zu machen. Während der statische Konstruktor, der privat ist, den Code so schreiben lässt, wie er in der Frage ist, brauchen Sie immer noch eine Instanz, damit er richtig funktioniert.

    
Joshua Cauble 06.01.2010 20:56
quelle

Tags und Links