HttpServerUtility包含一个名为UrlEncode的公共函数。它不是共享功能。 HttpServerUtility没有任何公共构造函数。
这样做失败:
Dim encodeMe As String = "a string to be encoded!"
HttpServerUtility.UrlEncode(encodeMe) 'Bombs out
这是有效的,也是微软所说的:
Dim instance As HttpServerUtility
Dim encodeMe As String = "a string to be encoded!"
instance.UrlEncode(encodeMe ) 'Works!
他们是如何做到这一点的?您无法使用构造函数实例化它的实例,但只能通过引用HttpServerUtility.UrlEncode来访问UrlEncode。
编辑:虽然我非常喜欢每个人都参与大型OO辩论,但我认为问题是MSDN文档错误。 “Dim instance As HttpServerUtility”这一行应该是“Dim instance As HttpServerUtility = Context.Server”我包含的代码(来自MSDN文档)实际上不起作用,而是抛出一个空引用异常 - 就像你一样期待。谢谢,杰森!答案 0 :(得分:17)
你确定这有效吗?
Dim instance As HttpServerUtility
Dim encodeMe As String = "a string to be encoded!"
instance.UrlEncode(encodeMe) 'Works!
这将在运行时为您提供NullReferenceException
(并且编译器会向您发出警告,instance
未分配给它。说真的,微软在这里没有做任何事情。上面的代码是灾难性的错误,会在运行时死掉。
你不能这样做
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
的{{1}}:
HttpUtility.UrlEncode
答案 1 :(得分:4)
首先,您提供的代码示例都不起作用。
第一个例子不起作用,因为UrlEncode是一个实例方法,因此你不能在类型上调用它,即HttpServerUtility.UrlEncode(encodeMe)。
第二个例子不起作用,因为尚未分配变量。
这与静态构造函数无关,并且发布的答案如此具有误导性。
HttpServerUtility类型设计为仅在System.Web程序集内部初始化。您无法创建自己的实例。您可以使用HttpContext.Server(它返回HttpServerUtility的实例)在Web应用程序中访问它的实例。
答案 2 :(得分:2)
使用 HttpUtility.UrlEncode()代替 HttpServerUtility.UrlEncode()。 HttpServerUtility上的版本是实例方法,而不是共享/静态方法。这与静态构造函数无关(第一次调用类中的静态方法时会调用静态构造函数)
答案 3 :(得分:-4)
它有一个静态私有构造函数,允许使用它。查看以下链接: Static Constructors
如果你想看看他们做了什么,请下载反射器并将其打开。
编辑:要清除答案,让人们开心。虽然私有的静态构造函数允许代码像在问题中一样编写,但您仍然需要一个实例才能使其正常运行。