Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的托管和非托管对象#_C#_.net - Fatal编程技术网

C# C中的托管和非托管对象#

C# C中的托管和非托管对象#,c#,.net,C#,.net,今天我检查了我的应用程序的内存使用情况,发现一些对我来说没有意义的东西。我希望一个对象有多个实例,但当我检查诊断工具时,它只有一个实例。然后我试着运行一些测试,故意创建多个实例并检查内存,结果还是一个 想象一下我们有一个这样的班级 public class Car { public string Name {get;set;} } 如果我在一个循环中创建这个Car对象的100个实例,我希望内存中有100个对象 for (int i = 0; i < 100; i++) { va

今天我检查了我的应用程序的内存使用情况,发现一些对我来说没有意义的东西。我希望一个对象有多个实例,但当我检查诊断工具时,它只有一个实例。然后我试着运行一些测试,故意创建多个实例并检查内存,结果还是一个

想象一下我们有一个这样的班级

public class Car
{ 
  public string Name {get;set;}
}
如果我在一个循环中创建这个Car对象的100个实例,我希望内存中有100个对象

for (int i = 0; i < 100; i++)
{
  var car = new Car();
}
for(int i=0;i<100;i++)
{
var car=新车();
}
但当我尝试这个并检查内存时,我只看到该对象的一个实例!我也尝试过使用HttpClient,但仍然是一样的。我想知道我是否遗漏了什么,在这种情况下CG的意义是什么!我在谷歌上搜索了很多次,但都找不到合适的答案,所以我想也许可以和你们分享一下

在这种情况下,CG的意义是什么

假设你指的是GC(垃圾收集器),关键是GC正在做它的工作!这些对象中的每一个几乎在您创建它时就超出范围*,因此GC会收集它。并不是说托管对象不存在,所以GC与之无关。这是因为GC已经在您可以查看的时候清理了它们。这就是“管理”的意思。。。GC负责为您进行清理,所以您不必担心用旧项目填充ram

如果确实要查看100个项目,请尝试以下代码:

Car[] cars = new Car[100]; // declare this outside the loop
for (int i = 0; i < 100; i++)
{
  cars[i] = new Car();
}
Car[]cars=新车[100];//在循环之外声明这个
对于(int i=0;i<100;i++)
{
汽车[我]=新车;
}


*情况可能更糟:JIT或编译器检测到这些对象将超出范围,甚至从未分配它们。

您缺少了一些东西:变量范围。您的
var-car
仅在一次循环迭代期间存在。之后,垃圾收集在每次循环时启动(简化),变量
car
超出范围,因此它不会保留实例。它正在被垃圾收集。这是工作的预期。问题是什么?您创建了100个实例,但它们立即超出了范围(并且没有根)。您的问题不包含任何非托管对象。因为每辆新车都会替换它的前辈。。。