zoukankan      html  css  js  c++  java
  • C#中显示类型转换(string)和 ToString() 到底该用哪个

      今天在写项目任务的时候,遇到了这样的问题:在访问网站各个页面的过程中,需要用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强制转换,则会抛出异常。这样我们才能发现这个异常。

      总之,我们应该了解它们之间的区别,具体在用时才能选最适合的一个。

  • 相关阅读:
    P4342 [IOI1998]Polygon
    P1194 买礼物
    P1363 幻想迷宫
    Installing Wine 1.5: configure: error: Cannot build a 32-bit program, you need to install 32-bit development libraries(转载)
    Linux系统调用之open(), close() (转载)
    undefined reference to 'pthread_create'问题解决(转载)
    linux中的C里面使用pthread_mutex_t锁(转载)
    #if、#ifdef、#if defined之间的区别(转载)
    linux下解压tgz文件(转载)
    linux修改用户主目录的方法 (转载)
  • 原文地址:https://www.cnblogs.com/gzd10/p/5846023.html
Copyright © 2011-2022 走看看