今天开始接触C#,以前一直用的是C++,在看C#的命名空间的时候,有这么一句代码:Images.DocumentsHandling image =new Images.DocumentsHandling();Images 是自己定义的命名空间。
DocumentHandling是命名空间里里定义的一个类。申明一个类的对象的时候为什么还要 new 一下。这是C#中申明对象必须的?不是必须的话这么做有什么好处。
我在C++中用NEW,也就在用指针的时候。申请一块数组地址什么的地方用用。

解决方案 »

  1.   

    那个是声明兼定义吧,不是必须的,如果你愿意,可以等真正用的时候再new一下。这么做的好处就是:声明了就立即定义,即保证一会用的时候不会产生空引用的异常!
      

  2.   

    不加new也行,但是这个new的作用是生成新的对象实例。
    不加new的话,只是定义这个对象实例。在使用之前是必须生成一个新的对象实例的。比如完全可以:class newinstance;
    。newinstance=new class();
      

  3.   

    new就是在内存里开辟一个单元,一个语法规定需要理由吗
      

  4.   

    楼上几位没用过C++吧?T a;C++跟C#里完全不一样,C#虽然也可以不new,但是没有分配内存,但是C++已经分配内存了所以说,要实现C++的效果,new是必须的可以这样认为:从形式上来说,C#基本不用指针,但是从内涵来说,C#全是指针操作。
      

  5.   

    如果不加new的话,那是声明了该对象
    加上new的话,那就是实例化这个对象了
      

  6.   


    支持6楼。C#:  T t;   等价于 C++:  T *t;
      

  7.   

    C# 里面不new的话,是不会给它分配内存的。
    而且你使用它之前必须要new。
    因为.net有自己的内存管理机制。
    C++没有,
      

  8.   

    C++是不是使用new 就要自己delete?
    如果不使用new,则出作用域后系统会自动回收。c#是所有引用类型都分在堆中,所以你声明一个引用类型,它只会在栈上分配一个引用地址,
    只有等到new的时候才给你在堆上分配对象使用的内存空间栈上的内存c++跟c#应该都一样,系统自动回收,
    只有在堆上时不同,c#是有自己的“垃圾回收器”回收。
      

  9.   


    如果我从一个方法返回值直接赋值给刚定义没new的变量,这个变量的指针指向那个所返回的值?
    那么是不是没有完全回收那个方法所占用的内存?
    求解,谢谢。
      

  10.   


    因为C#对象都是引用类型,所以必须用new操作符创建对象,C++包含复制构造函数,所以可以用变量声明的办法构建对象,实际上C++还是建议使用引用或者指针访问对象
      

  11.   

    实例化一个对象,必须使用NEW关键字
      

  12.   

    C#中,类属于引用类型
    C#的 T a事实上就是声明一个对T类型实例的引用,如果不调用new,就成了空引用了。
    相当于C++的 T* p ,也需要new 一个对象。
      

  13.   


    C#返回的不是对象的拷贝,而是对象的引用,这位不要误导新人……
    类是引用类型,返回的肯定是引用。
    只有值类型返回的才是拷贝。比如IList<T> fun(){
        IList<T> ret=new List<T>();
        ret.Add(new T());
        return ret;
    }
    这段代码返回的 IList<T> 就是函数体内new出来的对象的一个引用,可以认为就是其本身。
      

  14.   


    内存一般由GC去自动回收,就比如上面的函数返回的值,当存在引用的时候,GC不会去回收,引用不存在了这个对象就有可能被GC回收掉了。C#中不需要过多考虑回收的问题,不用像C++那样记得delete一个new出来的指针。
      

  15.   


    C# 如果你声明一个引用类型对象,然后从一个方法中返回对象,
    它会把引用指向那个返回的对象的。
    此时那返回的对象并没有被回收,因为它还在被使用。只有这个对象完全没有被引用了才会被“垃圾回收器”回收。c#返回引用类型不是返回一个拷贝。。是返回一个引用,别误导人。对象拷贝是用clone,要实现ICloneable
    接口