为什么URIKind
有为什么UriKind有选择A:选择B:选择A |乙
Absolute
,Relative
,RelativeOrAbsolute
。
为什么不总是使用RelativeOrAbsolute
来防止代码中的爆炸?
为什么URIKind
有为什么UriKind有选择A:选择B:选择A |乙
Absolute
,Relative
,RelativeOrAbsolute
。
为什么不总是使用RelativeOrAbsolute
来防止代码中的爆炸?
如果你看看UriKind的文档,你会看到:
定义种的URI的Uri.IsWellFormedUriString(字符串, UriKind)和几个Uri.Uri方法。
它使您能够区分绝对URI和相对URI。
现在考虑一个例子,您希望用户只输入绝对URI并验证它是否格式正确。然后,你会做什么:
string inputUri = "/index.html)";
bool ifValid = Uri.IsWellFormedUriString(inputUri, UriKind.Absolute);
如果只有RelativeOrAbsolute
然后上面会返回true。
因为下游代码可能会期待其中一个或另一个。例如,如果您的代码使用的绝对基本URI为http://example.com/foo/,并且您希望用户输入某个资源的路径,则需要相对URI。你不希望他们输入http://afu.com/myname/home,因为当你试图使用用户输入的值时,最终会导致1)错误的路径;或者2)尝试创建URI“http://example.com/foo/htta://afu.com/myname/home”时出错。
如果您期待绝对URI并且有人给您一个相对URI,则会发生同样的事情。如果你没有定义的基本URI,那么这个相对URI对你没有任何好处。
您会在用户输入时“防止代码中的爆炸”,但会让其他人(也许是您)在稍后进行清理时遇到更严重的问题。这三个值 - 绝对的,相对的,不确定的 - 让您决定什么是有效的,并允许您在输入错误数据后立即拒绝错误数据。
没错。它可以让你提前失败 - 在发生错误的地方失败,而不是在以后。这通常是一个很好的原则,因为a)你更可能会有异常而不是潜在的危险和沉默的不良行为,b)它会从堆栈跟踪或其他简单的任务中进行调试,因为你知道实际发生故障的位置。 –