C#类全局变量内存资源问题

2015-10-16 01:57:37
在类名下面声明定义的变量,如果是值类型,那么在该类的方法里对其进行修改重复赋值操作,在内存上会重复开辟资源吗?如果是引用类型,在方法里对其重复赋值操作,内存上又会如何呢?
...全文
306 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2015-10-16
  • 打赏
  • 举报
回复
楼主,关于你的需求,我觉得值类型,你就不用考虑了。 你需要考虑的是string这个类型。我个人建议,能使用stringBuilder的最好就不使用string了。 特别是你需要频繁操作这个string的时候,就更需要使用stringBuilder,而不是string
引用 6 楼 ahui457853526 的回复:
[quote=引用 5 楼 shingoscar 的回复:] [quote=引用 2 楼 ahui457853526 的回复:] 我是想知道实例成员和局部变量的区别,比如在一个类下面定义了俩个变量,一个int i =0;一个string a = "",然后在这个类下的方法里重复调用这俩个变量,修改他们的值,我想知道这时候内存的变化,因为i是值类型,a是引用类型,
在类里,对于值类型如果你修改其值,比如o.i = 2,只是修改了这个成员所占用的空间,内存不会增长。 对于引用类型的赋值,比如o.b = new object(),会创建一个新的对象,并修改o.b的引用,内存会变大。但另一方面,如果o.b原先指向的对象没有其他变量引用它,那这个对象在一段时间后会被gc回收。 string比较特殊,比如o.a = "123",内存不会变化,因为常量字符串的内存在程序启动时就会分配,此处只会改变o.a的引用。[/quote] 我现在有个情况,我有个项目是多线程程序,在主窗体下创建了一些实例成员,有值类型,也有引用类型,然后在线程函数里定时修改这些实例成员的值,程序启动运行2天后,内存从30M涨到了80M,缓慢的在增长,这正常吗?[/quote]
2015-10-16
  • 打赏
  • 举报
回复
引用 8 楼 shingoscar 的回复:
[quote=引用 6 楼 ahui457853526 的回复:] 我现在有个情况,我有个项目是多线程程序,在主窗体下创建了一些实例成员,有值类型,也有引用类型,然后在线程函数里定时修改这些实例成员的值,程序启动运行2天后,内存从30M涨到了80M,缓慢的在增长,这正常吗?
你应该继续观察内存增长的情况,虽然内存从30涨到80是翻倍的,但考虑到时间上有2天,并且80m并不算是很夸张的消耗,还是应该认定正常。[/quote] 好的,
Poopaye 2015-10-16
  • 打赏
  • 举报
回复
引用 6 楼 ahui457853526 的回复:
我现在有个情况,我有个项目是多线程程序,在主窗体下创建了一些实例成员,有值类型,也有引用类型,然后在线程函数里定时修改这些实例成员的值,程序启动运行2天后,内存从30M涨到了80M,缓慢的在增长,这正常吗?
你应该继续观察内存增长的情况,虽然内存从30涨到80是翻倍的,但考虑到时间上有2天,并且80m并不算是很夸张的消耗,还是应该认定正常。
angel6709 2015-10-16
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
都不会。 楼主是需要问的下面的例子吧? int a=1; int b=a; 这个时候 a,b各自空间独立。 stringbuild a=new stringbuild('123'); stringbuild b=a; 这个时候,a,b是引用的同一个地址。改变a或者b,都会使另一个一起改变。
+1
引用 3 楼 bdmh 的回复:
值类型没事的,如果是引用类型,在new之前,最好是否之前的,设为null
-1
2015-10-16
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
[quote=引用 2 楼 ahui457853526 的回复:] 我是想知道实例成员和局部变量的区别,比如在一个类下面定义了俩个变量,一个int i =0;一个string a = "",然后在这个类下的方法里重复调用这俩个变量,修改他们的值,我想知道这时候内存的变化,因为i是值类型,a是引用类型,
在类里,对于值类型如果你修改其值,比如o.i = 2,只是修改了这个成员所占用的空间,内存不会增长。 对于引用类型的赋值,比如o.b = new object(),会创建一个新的对象,并修改o.b的引用,内存会变大。但另一方面,如果o.b原先指向的对象没有其他变量引用它,那这个对象在一段时间后会被gc回收。 string比较特殊,比如o.a = "123",内存不会变化,因为常量字符串的内存在程序启动时就会分配,此处只会改变o.a的引用。[/quote] 我现在有个情况,我有个项目是多线程程序,在主窗体下创建了一些实例成员,有值类型,也有引用类型,然后在线程函数里定时修改这些实例成员的值,程序启动运行2天后,内存从30M涨到了80M,缓慢的在增长,这正常吗?
Poopaye 2015-10-16
  • 打赏
  • 举报
回复
引用 2 楼 ahui457853526 的回复:
我是想知道实例成员和局部变量的区别,比如在一个类下面定义了俩个变量,一个int i =0;一个string a = "",然后在这个类下的方法里重复调用这俩个变量,修改他们的值,我想知道这时候内存的变化,因为i是值类型,a是引用类型,
在类里,对于值类型如果你修改其值,比如o.i = 2,只是修改了这个成员所占用的空间,内存不会增长。 对于引用类型的赋值,比如o.b = new object(),会创建一个新的对象,并修改o.b的引用,内存会变大。但另一方面,如果o.b原先指向的对象没有其他变量引用它,那这个对象在一段时间后会被gc回收。 string比较特殊,比如o.a = "123",内存不会变化,因为常量字符串的内存在程序启动时就会分配,此处只会改变o.a的引用。
2015-10-16
  • 打赏
  • 举报
回复
这个意思是说每次修改引用类型的实例成员,都会开辟内存?设置为Null的意义貌似也不大了,GC回收不确定性
bdmh 2015-10-16
  • 打赏
  • 举报
回复
值类型没事的,如果是引用类型,在new之前,最好是否之前的,设为null
2015-10-16
  • 打赏
  • 举报
回复
我是想知道实例成员和局部变量的区别,比如在一个类下面定义了俩个变量,一个int i =0;一个string a = "",然后在这个类下的方法里重复调用这俩个变量,修改他们的值,我想知道这时候内存的变化,因为i是值类型,a是引用类型,
正怒月神 2015-10-16
  • 打赏
  • 举报
回复
都不会。 楼主是需要问的下面的例子吧? int a=1; int b=a; 这个时候 a,b各自空间独立。 stringbuild a=new stringbuild('123'); stringbuild b=a; 这个时候,a,b是引用的同一个地址。改变a或者b,都会使另一个一起改变。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧