今天写了段这么的代码,类似
void create(object A)
{
  A=new object;
}object A;
create(A);意思是create函数产生一个object类型变量,由A来引用。但是编译器说使用了未赋值的局部变量。很困惑,不能这样写么???

解决方案 »

  1.   

    class Program

      static void Main() 
      { 
        object A = null; 
        create(ref A); 
      }   static void create(ref object A) 
      { 
        A = new object(); 
      } 
      

  2.   

    1. “但是编译器说使用了未赋值的局部变量”这话很明白,虽然你可能觉得编译器没有必要这么热心,但是这正好说明c#编译器比过去一些编译器好用的原因——可以避免逻辑设计错误。
    2. A是一个引用类型的对象,不论你声明方法 create(object A) 还是 create(ref object A),都是传递这个A。如果你去看非.net平台的什么c、c++的关于传值、传引用,完全是不一样的概念。在.net中,写ref反而会使得程序运行更慢一些,这个特点就可以说明问题。当你不写ref,那么方法create内部对A的赋值就不会从堆栈上赋值回调用方法之前的A变量。可以修改2楼的程序,来打印一下对象的HashCode看看class Program

      static void Main() 
      { 
        object A = null; 
        Console.WriteLine(A.GetHashCode());
        create(A); 
        Console.WriteLine(A.GetHashCode());  //可以看到这里并不是create方法内部设置的那个新对象
      }   static void create(object A) 
      { 
        A = new object(); 
        Console.WriteLine(A.GetHashCode());
      } 
      

  3.   


    可以不加ref吗?? 传进去的不是引用吗?那改变的话,外面也会变吧~~~~
      

  4.   

    如果不加 ref,外面得到的 A 就不是里面创建的那个 A 了,这点3楼 sp1234 已经说得很清楚了。
      

  5.   

    都是传递这个A  -->  都是将这个A压入堆栈后边的说法才准确一点。实际上这跟传统的c中的传值操作是类似的。
      

  6.   


    这种误解在从那些讲c、c++的书上学编程的人很普遍。学.net时千万不要拿那些东西来套用。A不是一个指针那么简单的东西,内部的赋值语句也不是往一个指针所指的的内存地址去写一个对象。
      

  7.   

    .net CLR协议中所规定的引用,跟c、c++所说的指针,完全是两回事。记住这个,再记住你的这个例子,并且记住在.net中使用ref反而比不是用它更慢,就能记住.net的引用跟指针完全不一样了。在应用程序运行时,对象在内存中随时可能被搬动,它的引用总能找到它,而所谓指针地址就是胡乱定位了。
      

  8.   

    什么事HashCode?是不是类似于地址?
      

  9.   

    void create(object A)
    {
      A=new object();
    }object A=null;
    create(A); 
      

  10.   

    是否可以用 out关键字??就不用在外面写 object a=null是吗??
      

  11.   

    sp1234 兄弟的回答好好理解理解应该可以解决你的问题了。
    其实,就是理解【1】和【2】位置处的变量A,都叫同一个名字,是同一种类型,但不是同一个人。不知道是否明白。
    再解释一下,就是【1】 和 【2】处A都是 object 类型,并且都叫名 A,但他们的内容不一样。
    【1】处可以理解为空引用;
    【2】处确实一个事实在在的object对象。再打个比方就是:在网络中,还有一个名字也叫 alonesword 的人在上网,虽然我和他(她)都是人类,都拥有相同的名号ID,而我们的思想、经历等都不一样(也许另一个 alonesword 是个MM也说不定,哈哈)
    public static void RunSnippet()
    {
    object A【1】 = null; 
    create(A); 
    }

    static void create(object A) 

    A = new object(); 【2】

    ru