Как Microsoft сделала это? (вопрос о своем классе .NET HttpServerUtility) - PullRequest
8 голосов
/ 06 января 2010

HttpServerUtility содержит открытую функцию UrlEncode. Это не общая функция. HttpServerUtility не имеет общедоступных конструкторов.

Не удается:

Dim encodeMe As String = "a string to be encoded!"
HttpServerUtility.UrlEncode(encodeMe) 'Bombs out

Это работает, и как Microsoft говорит это сделать:

Dim instance As HttpServerUtility
Dim encodeMe As String = "a string to be encoded!"

instance.UrlEncode(encodeMe ) 'Works!

Как они этого добились? Вы не можете создать его экземпляр с помощью конструктора, но вы не можете получить доступ к UrlEncode, просто ссылаясь на HttpServerUtility.UrlEncode.

РЕДАКТИРОВАТЬ: Несмотря на то, что я полностью наслаждался всеми, кто участвовал в больших дебатах по ОО, я считаю, что проблема в неверной документации MSDN. Строка «Dim instance As HttpServerUtility» должна читаться как «Dim instance As HttpServerUtility = Context.Server». Код, который я включил (из документации MSDN), на самом деле не работает, а вместо этого выдает исключение нулевой ссылки - так же, как вы буду ожидать. Спасибо, Джейсон!

Ответы [ 4 ]

17 голосов
/ 07 января 2010

Вы уверены, что это работает?

Dim instance As HttpServerUtility
Dim encodeMe As String = "a string to be encoded!"
instance.UrlEncode(encodeMe) 'Works!

Это даст вам NullReferenceException во время выполнения (и компилятор выдаст вам предупреждение, что instance не назначается). Серьезно, Microsoft здесь ничего не сделала. Приведенный выше код катастрофически неверен и умрет во время выполнения.

И вы не можете сделать это

Dim encodeMe As String = "a string to be encoded!"
HttpServerUtility.UrlEncode(encodeMe) 'Bombs out

, поскольку UrlEncode не определен как метод Shared в HttpServerUtility.

Вам необходим ненулевой экземпляр HttpServerUtility. Правильный способ использования HttpServerUtility такой:

Dim instance As HttpServerUtility = HttpContext.Server
Dim s As String = "Hello, World!"
Dim result As String = instance.UrlEncode(s)

Другой вариант - просто использовать HttpUtility, для которого есть метод Shared HttpUtility.UrlEncode:

Dim s As String = "Hello, World!"
Dim result As String = HttpUtility.UrlEncode(s)
4 голосов
/ 07 января 2010

Прежде всего, ни один из приведенных вами примеров кода не будет работать.

Первый пример не будет работать, поскольку UrlEncode является методом экземпляра, поэтому вы не можете вызывать его для типа, то есть HttpServerUtility.UrlEncode (encodeMe).

Второй пример не будет работать, поскольку переменная не была назначена.

Это не имеет ничего общего со статическими конструкторами, а ответы, опубликованные с указанием, что они вводят в заблуждение.

Тип HttpServerUtility предназначен для инициализации только внутри сборки System.Web. Вы не можете создавать свои собственные экземпляры этого. Вы можете получить доступ к его экземпляру в веб-приложении с помощью HttpContext.Server (который возвращает экземпляр HttpServerUtility).

2 голосов
/ 07 января 2010

Используйте HttpUtility.UrlEncode () вместо HttpServerUtility.UrlEncode () . Версия в HttpServerUtility является методом экземпляра, а не разделяемым / статическим методом. Это не имеет ничего общего со статическим конструктором (статический конструктор будет вызываться при первом вызове статического метода из класса)

0 голосов
/ 06 января 2010

Имеет статический закрытый конструктор, который позволяет использовать его. Проверьте следующую ссылку: Статические конструкторы

Если вы хотите увидеть, что они сделали, загрузите отражатель и откройте его.

РЕДАКТИРОВАТЬ: Чтобы скрыть ответ, чтобы сделать людей счастливыми. В то время как статический конструктор, который является приватным, позволяет писать код так, как он есть в вопросе, вам все еще нужен экземпляр для его правильной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...