今天开始接触C#,以前一直用的是C++,在看C#的命名空间的时候,有这么一句代码:Images.DocumentsHandling image =new Images.DocumentsHandling();Images 是自己定义的命名空间。
DocumentHandling是命名空间里里定义的一个类。申明一个类的对象的时候为什么还要 new 一下。这是C#中申明对象必须的?不是必须的话这么做有什么好处。
我在C++中用NEW,也就在用指针的时候。申请一块数组地址什么的地方用用。
DocumentHandling是命名空间里里定义的一个类。申明一个类的对象的时候为什么还要 new 一下。这是C#中申明对象必须的?不是必须的话这么做有什么好处。
我在C++中用NEW,也就在用指针的时候。申请一块数组地址什么的地方用用。
不加new的话,只是定义这个对象实例。在使用之前是必须生成一个新的对象实例的。比如完全可以:class newinstance;
。newinstance=new class();
加上new的话,那就是实例化这个对象了
支持6楼。C#: T t; 等价于 C++: T *t;
而且你使用它之前必须要new。
因为.net有自己的内存管理机制。
C++没有,
如果不使用new,则出作用域后系统会自动回收。c#是所有引用类型都分在堆中,所以你声明一个引用类型,它只会在栈上分配一个引用地址,
只有等到new的时候才给你在堆上分配对象使用的内存空间栈上的内存c++跟c#应该都一样,系统自动回收,
只有在堆上时不同,c#是有自己的“垃圾回收器”回收。
如果我从一个方法返回值直接赋值给刚定义没new的变量,这个变量的指针指向那个所返回的值?
那么是不是没有完全回收那个方法所占用的内存?
求解,谢谢。
因为C#对象都是引用类型,所以必须用new操作符创建对象,C++包含复制构造函数,所以可以用变量声明的办法构建对象,实际上C++还是建议使用引用或者指针访问对象
C#的 T a事实上就是声明一个对T类型实例的引用,如果不调用new,就成了空引用了。
相当于C++的 T* p ,也需要new 一个对象。
C#返回的不是对象的拷贝,而是对象的引用,这位不要误导新人……
类是引用类型,返回的肯定是引用。
只有值类型返回的才是拷贝。比如IList<T> fun(){
IList<T> ret=new List<T>();
ret.Add(new T());
return ret;
}
这段代码返回的 IList<T> 就是函数体内new出来的对象的一个引用,可以认为就是其本身。
内存一般由GC去自动回收,就比如上面的函数返回的值,当存在引用的时候,GC不会去回收,引用不存在了这个对象就有可能被GC回收掉了。C#中不需要过多考虑回收的问题,不用像C++那样记得delete一个new出来的指针。
C# 如果你声明一个引用类型对象,然后从一个方法中返回对象,
它会把引用指向那个返回的对象的。
此时那返回的对象并没有被回收,因为它还在被使用。只有这个对象完全没有被引用了才会被“垃圾回收器”回收。c#返回引用类型不是返回一个拷贝。。是返回一个引用,别误导人。对象拷贝是用clone,要实现ICloneable
接口