用了好长时间3.5了,今天突然发现变量赋值和2.0有区别以前一个变量是否赋值,编译器是不知道的,而现在他却能报错:使用了未赋值的变量这是否就可以判断一个变量是否赋值了呢看下面的代码string c;
response.write(c);2.0是报未将对象引用设置到对象实例
而在3.5中,是报:使用了未赋值的变量,并且值类型和引用类型都报这个错,这不就是说,可以知道变量是否赋值了吗?在2.0中,一直苦于不能简单的知道一个变量是否赋值,尤其是值类型(需要借助第三方变量),而在3.5中,是不是就可以了呢求教如何判断一个变量是否赋值!!!

解决方案 »

  1.   

    try
    然后捕捉异常..判断该异常是否是"使用了未赋值的变量"的异常.
      

  2.   


    这样甚好,但是try是很消耗资源的没有其它办法吗
      

  3.   

    NET 基于代码安全性的考虑,自动检测
    string s= string.Empty;
      

  4.   

    我用的英文版的3.5,
    错误信息为:Use of unassigned local variable XXX
    建议楼主使用英文版的VS,有时候翻译是会出一点点差错的!
      

  5.   

    这个根本就不是问题
    打开IDE的提示就行,就象你上面说的,如果使用了未赋值的变量会有提示的
    然后你改一下代码就行了最好的习惯是尽量定义时就进行初始化。
      

  6.   

    那不是运行时(运行时只要比较null),那是编译时。而编译时其实很简单,看到声明变量时记录到一块黑板上,在扫描语句时看到赋值时从黑板上擦去对应的变量(掠过语句块,并不扫描语句块内部的语句),最后剩下的就是你要的。
      

  7.   


    老大还是理解我的意思的,但看来是没法知道变量是否赋值了,在js,php中就有这样的函数,如isSet
      

  8.   

    看来.net还是没有提供相应的方案了
      

  9.   

    看你的意思是要 判断 在调用的时候是不是为空 并不是说是否赋初始值
    直接 if(xx==null)
      

  10.   


    php中,isset就是判断是否是null。不要望文生义,其实并不是去判断是否赋值过,而只是判断是不是null。
      

  11.   

    你再定义一个同类型的、没有赋值的临时变量,然后if(a==b){"没有赋值!"}比较一下。
      

  12.   

    C#编译器有个特点,就是尽可能地将问题发现在编译时刻,这也是一种优点,这样可以大大减少程序在运行时发生的错误。
    你说如何判断一个变量是否赋值,其实对于引用类型,只要判断其是否为null就可以了。如果是引用类型,由于其在被定义时就会赋上初始值,所以你也没办法去作个判断。
      

  13.   

    为了提高与动态语言(比如python)的互操作性,.NET 4.0开始支持动态变量,也就是传说中的dynamic变量。那么对于用dynamic声明的变量,你可以在上面使用任何名称的成员,编译器都不会报错,但这样做就绕过了C#编译器的编译时排错,你的代码的安全性也降低了。这就是为什么很多文章都提倡单体测试的原因。
      

  14.   

    值类型如是3.5的话,可以使用可空类型
    这样定义int ? i=null;
    如果是2.0的话
    需要自己规定了
      

  15.   

    我个人理解,是否赋值应该是是否使用了赋值号
    对于C#来讲就是是否使用=
    至于赋的值是null还是具体有效值,那都是赋了值的
    只有定义后未进行过赋值的才叫未赋值
    VS2005、2008的IDE都是这样判断的
    哪怕你赋了个null,它都认为赋过值了
      

  16.   

            string s = null;
            Response.Write(s ?? "没值");
            int? i = null;
            Response.Write(i ?? "没值");
            int i = 0;
            Response.Write(i == default(int) ? "- -!" : i);