想请问下,new 实例化对象的时候,是放在程序外部好还是内部好?哪种更节省内存开销

时间:2023-01-02 12:04:08
想请问下,new 实例化对象的时候,是放在程序外部好还是内部好?哪种更节省内存开销,对优化系统系能哪种更好?

比如下面是new在程序外部:

MyClass1 m = new MyClass1();

public string OutStr()
{
  return m.Str1();
}


下面是new在程序内部:

public string OutStr()
{
  MyClass1 m = new MyClass1();
  return m.Str1();
}


请问各位朋友,哪种更节省内存开销,对优化系统系能哪种更好?谢谢。

17 个解决方案

#1


前者是类成员具有类作用域,生命周期和类实例一致,后者是函数内部局部变量具有函数作用域,生命周期和调用时间段一致。
从作用域上看,如果多个类成员函数都要使用的数据,作为类成员比较好,但是使用同一份数据,一个函数修改了数据其他函数也受影响。
从生命周期上看,局部变量在每次函数调用时都重新创建,每次的局部变量都是全新的,如果调用频繁就需要频繁创建销毁

我的一点浅见,还是有待大牛来布道

#2


面向对象的角度:new在程序外部
类是具有相同属性,或者方法的集合。类中方法的调用一般都会使用相同的外部类方法


节省内存的角度:new在程序内部
1、面向对象“封装特性”,使得类被调用时 一般只会使用1个方法
2、方法调用完毕,实例化的类会被自动回收

#3


当然第二种好啦。只要外部没有用到,new一定要放在最里层。
最里层程序结束后,系统会自动回收。
这也是好的编程习惯!

#4


一个普遍原则是使变量的作用域范围尽量小
一个例外是不应该用在循环中

#5


第一个的资源是程序运行完后系统自动回收
第二个的资源是函数运行完后回收

类具体再什么地方实例化看具体情况而定
应该new一下需要一定的时间的,如果函数运用很频繁的话建议把类在全局实例化

#6


受益匪浅,不知道还有没有意见或看法的同志?

#7


要看你OutStr() 这个方法的使用频率

#8


引用 6 楼 yxf522 的回复:
受益匪浅,不知道还有没有意见或看法的同志?


是不是频率高类的引用就放外部,频率低类的引用就放内部?

#9


第一种:
MyClass1 m = new MyClass1();

public string OutStr()
{
  return m.Str1();
}

第一种是在你当前这个类(指this的这个类,不是MyClass1)的构造函数执行前就先创建的(即new),第二种是在调用当前类的实例方法OutStr()的时候创建的。仔细区别这种不同。

#10


大家在来议议啊

#11


我很好奇如何“在 程序外部new 实例化对象”...

#12


引用 11 楼 vrhero 的回复:
我很好奇如何“在程序外部new 实例化对象”...


不要钻字眼嘛,大哥。没表达好,有贴代码,看代码就明白了。

#13


你懂不懂什么叫程序?各种对象的生存期你又了解多少?先把这些搞清楚再去考虑你这个根本不成立的问题...

#14


引用 13 楼 vrhero 的回复:
你懂不懂什么叫程序?各种对象的生存期你又了解多少?先把这些搞清楚再去考虑你这个根本不成立的问题...


就是不懂才来问的。我要懂我来问它干啥。没见过你这样的,你懂程序又怎么样,正所谓有才无德。

#15


不过还是要谢谢这位 "vrhero"  达人的提醒,我会去好好看下你所说的。免得我以后我们这些后辈问题都不敢问了。

另外我要告诉你的就是,你这样的人就像癌细胞,是老辣,够厉害,不过你会吞噬或阻止那些新生细胞的生长.

#16


new不能说绝对的放哪里?要看你程序的具体情况了

#17


MyClass1 m ;

public string OutStr()
{
  m = new MyClass1();

  return m.Str1();
}

#1


前者是类成员具有类作用域,生命周期和类实例一致,后者是函数内部局部变量具有函数作用域,生命周期和调用时间段一致。
从作用域上看,如果多个类成员函数都要使用的数据,作为类成员比较好,但是使用同一份数据,一个函数修改了数据其他函数也受影响。
从生命周期上看,局部变量在每次函数调用时都重新创建,每次的局部变量都是全新的,如果调用频繁就需要频繁创建销毁

我的一点浅见,还是有待大牛来布道

#2


面向对象的角度:new在程序外部
类是具有相同属性,或者方法的集合。类中方法的调用一般都会使用相同的外部类方法


节省内存的角度:new在程序内部
1、面向对象“封装特性”,使得类被调用时 一般只会使用1个方法
2、方法调用完毕,实例化的类会被自动回收

#3


当然第二种好啦。只要外部没有用到,new一定要放在最里层。
最里层程序结束后,系统会自动回收。
这也是好的编程习惯!

#4


一个普遍原则是使变量的作用域范围尽量小
一个例外是不应该用在循环中

#5


第一个的资源是程序运行完后系统自动回收
第二个的资源是函数运行完后回收

类具体再什么地方实例化看具体情况而定
应该new一下需要一定的时间的,如果函数运用很频繁的话建议把类在全局实例化

#6


受益匪浅,不知道还有没有意见或看法的同志?

#7


要看你OutStr() 这个方法的使用频率

#8


引用 6 楼 yxf522 的回复:
受益匪浅,不知道还有没有意见或看法的同志?


是不是频率高类的引用就放外部,频率低类的引用就放内部?

#9


第一种:
MyClass1 m = new MyClass1();

public string OutStr()
{
  return m.Str1();
}

第一种是在你当前这个类(指this的这个类,不是MyClass1)的构造函数执行前就先创建的(即new),第二种是在调用当前类的实例方法OutStr()的时候创建的。仔细区别这种不同。

#10


大家在来议议啊

#11


我很好奇如何“在 程序外部new 实例化对象”...

#12


引用 11 楼 vrhero 的回复:
我很好奇如何“在程序外部new 实例化对象”...


不要钻字眼嘛,大哥。没表达好,有贴代码,看代码就明白了。

#13


你懂不懂什么叫程序?各种对象的生存期你又了解多少?先把这些搞清楚再去考虑你这个根本不成立的问题...

#14


引用 13 楼 vrhero 的回复:
你懂不懂什么叫程序?各种对象的生存期你又了解多少?先把这些搞清楚再去考虑你这个根本不成立的问题...


就是不懂才来问的。我要懂我来问它干啥。没见过你这样的,你懂程序又怎么样,正所谓有才无德。

#15


不过还是要谢谢这位 "vrhero"  达人的提醒,我会去好好看下你所说的。免得我以后我们这些后辈问题都不敢问了。

另外我要告诉你的就是,你这样的人就像癌细胞,是老辣,够厉害,不过你会吞噬或阻止那些新生细胞的生长.

#16


new不能说绝对的放哪里?要看你程序的具体情况了

#17


MyClass1 m ;

public string OutStr()
{
  m = new MyClass1();

  return m.Str1();
}