DID微软如何做到这一点? (关于他们的.NET HttpServerUtility类的OO问题)

时间:2010-01-06 20:50:56

标签: .net oop

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文档)实际上不起作用,而是抛出一个空引用异常 - 就像你一样期待。谢谢,杰森!

4 个答案:

答案 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

如果你想看看他们做了什么,请下载反射器并将其打开。

编辑:要清除答案,让人们开心。虽然私有的静态构造函数允许代码像在问题中一样编写,但您仍然需要一个实例才能使其正常运行。