开发者经常重新发明而不是重用的.NET工具类
English Link:
http://haacked.com/archive/2007/06/13/the-most-useful-.net-utility-classes-developers-tend-to-reinvent.aspx
中文翻译:jupter@yeah.net 2008-4-13
1. System.IO.Path
你是不是经常看见这样的代码?而它只是创建了一个文件路径。
public string GetFullPath(string fileName)
{
string folder = ConfigurationManager.AppSettings["somefolder"];
return folder + fileName;
}
像这样的代码令人发疯,因为它很容易出错。例如,当你设置文件夹路径时,你不得不确信它的结尾有一个斜杆(slash)。有太多需要记住的事情使得这段代码非常脆弱。
当然,你可以编写代码以确保这个文件夹以斜杆结束,但是我更喜欢让其它人编写这样的代码。例如,微软。
.NET框架无疑非常庞大,因此忘记了一些有用的工具类可以理解。
public string GetFullPath(string filename)
{
string folder = ConfigurationManager.AppSettings["somefolder"];
return System.IO.Path.Combine(folder, filename);
}
Path类当然很有名,但是开发者似乎没有让它发挥全部功能。例如,你是不是经常看到这样的代码?
//make sure folder path ends with slash
string folder = GetFolderPath() + @"/";
当然对于按照Windows的机器来说,这没有问题,但是世界在变化,或许某一天你困难想让你的代码运行在Linux或者Mac上!相反,你应该这样编码,它更安全。
string folder = GetFolderPath() + Path.DirectorySeparatorChar;
2. System.Web.VirtualPathUtility
不知道这个类是可以原谅的,因为它是在.NET2.0中引入的。但是现在你应该记住它。它的一个最大的用途是将波浪线路径转换为绝对路径。
注意:波浪线(~)字符在ASP.NET虚拟URLs环境下称为root operator。这个字符对你非常重要。
例如,如果你想在一个名字为“MyApp”的虚拟应用程序中运行一个应用,下面的语句:
string path = VirtualPathUtility.ToAbsolutePath("~/Controls/Test.ascx");
将路径设置为/MyApp/Controls/Test.ascx。不需要编写你自己的ResolveUrl方法。
其它一些有用的方法(还有很多)…
AppendTrailingSlash | Appends a / to the end of the path if none exists already. |
Combine | Analagous to Path.Combine, but for URLs. |
MakeRelative | Useful for getting the relative path from one directory to another (was it dot dot slash dot dot slash? Or just dot dot slash?) |
3. System.Web.HttpUtility
这个类有一个有用的方法编码和解码URL/HTML。一个小的示例…
HtmlEncode | Converts a string to an HTML encoded string. |
HtmlDecode | Decodes an HTML encoded string. |
UrlEncode | Converts a string to a URL encoded string. |
UrlDecode | Decodes a URL encoded string. |
这个类有一个很特别的方法HtmlAttributeEncode。这个方法是HtmlEncode方法的lazy cousin。它只做最少的工作以安全的为将HTML编码为一个字符串。例如,下面这个字符串:
<p>&</p>
HtmlEncode输出:<p>&</p>
然而HtmlAttributeEncode输出<p>&</p>
也就是说,它仅仅编码左尖括号,而不编码右尖括号。
4. System.Environment
这个类包含当前环境的各种信息。你可以获取MachineName,CommandLine,等。
然而,我希望开发者使用的一个属性是:
//Instead of this
string s = "Blah/r/n";
//do this
string s = "Blah" + Environment.NewLine;
再一次,某天,当你的代码需要运行在一个不同的操作系统上时,这可能会导致失败。从现在开始养成好的习惯吧。
5. What Classes Am I Missing?
No matter how hard I can try, there is no way that I could make a complete list. In .NET 3.0, I’d probably add the new TimeZoneInfo
class. What classes do you find extremely useful that are not so well known? Or worse, what classes have functionality that you see developers reinventing the wheel recreating, rather than using the existing class?