今天在写项目任务的时候,遇到了这样的问题:在访问网站各个页面的过程中,需要用ajax检测用户当前的登录状态,如果没有登录则某些操作会受限。这时就需要从session中取得登录时保存的用户名。从session中获取当前登录用户名的方法如下:
public static string GetCurrentUserName(HttpContext context) { return context.Session[CURRENTUSERNAME].ToString(); }
平常我一直是这么用的,直接用ToString()方法进行类型转换,但是今天就出了问题,报错内容 “未将对象引用设置到对象的实例”(多么熟悉的错误啊)。我就想不通了,后来到网上查了很久才看到解决方法:
public static string GetCurrentUserName(HttpContext context) { return (string)context.Session[CURRENTUSERNAME]; }
没想到(string)显示转换和ToString()还有这么大的区别,都怪基础不扎实啊。然后在网上找到了一篇文章,对这个问题解释的非常详细:
[转]Object到String类型转换的四种方式
通常object到string有四种方式:(假设有object obj)obj.ToString,Convert.ToString,(string)obj,obj as string。
他们都能将object对象转换成string对象。我就讲讲他们的异同以及在实际中应该使用哪个。
前两个方法通常是由别的对象得到string对象,它们间的区别只表现在要转换的对象为null时,如果obj为null,调用obj.ToString方法会导致NullReferenceException异常,调用Convert.ToString不会抛出异常而返回一个null。
用强制转换(string)obj要求obj的运行时类型必须是string。如果不是,就会抛出异常。用as方法则会相对平稳,当obj的运行时类型不是string时会返回null而不抛出异常。
所以在通常在我们需要得到某个对象的string表达形式时,我们应该使用ToString和Convert.ToString,这时候你就得根据情形选一个,假如你能保证你的对象不为null,则两个差不多。如果有可能为null,你就应该用Convert.ToString,如果你希望它为null的时候抛出异常,那么当然可以选择.ToString。
如果我们是将一个string对象放在容器(如Session)中,而取出时是object对象,这时我们必须将之转换回string对象,那么我建议使用as或(string)obj强制转换。如果我们用.ToString,那么我们就必须在使用前先检查是否为null,而使用.ToString和Convert.ToString有可能隐藏错误,比如你可能用一个username标识一个user的名字,即string类型,但可能你会在另一处无意写下Session["username"]=(另一个对象),于是你在后面取这个值的时候便取到后面的这个值,由于你是用的.ToString,所以仍然会成功运行,只是值已不是你希望的值,于是错误在不知不觉中隐藏过去了。如果你是用的as,这时候你取到的就是null值,如果你是用的(string)obj强制转换,则会抛出异常。这样我们才能发现这个异常。
总之,我们应该了解它们之间的区别,具体在用时才能选最适合的一个。