Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# - Fatal编程技术网

C# 以类作为值的字典。

C# 以类作为值的字典。,c#,C#,我有一个小类,我用它作为字典中的值。当我删除字典时,它还会破坏类实例吗 class Program { class Test { public string A_String; public string B_String; } static Dictionary<int, Test> _dict = new Dictionary<int, Test>(); static void Main(string[] args) {

我有一个小类,我用它作为字典中的值。当我删除字典时,它还会破坏类实例吗

class Program
{

  class Test
  {
    public string A_String;
    public string B_String;
  }

  static Dictionary<int, Test> _dict = new Dictionary<int, Test>();

  static void Main(string[] args)
  {
    for(int X = 0; X <=5; X++)
    {
      Test _test = new Test();
      _test.A_String = "A" + X.ToString();
      _test.B_String = "B" + X.ToString();

      _dict.Add(X, _test);

    }

    _dict.Remove(2);

  }
}
类程序
{
课堂测试
{
公共字符串A_字符串;
公共字符串B_字符串;
}
静态字典_dict=新字典();
静态void Main(字符串[]参数)
{

对于(int X=0;XNo)。只要它在范围内,您就可以访问
test
。 但是,由于在for循环的每个周期之后,测试的每个实例都超出了范围,所以如果从字典中删除它,就无法访问它

static void Main(string[] args)
{
   for(int X = 0; X <=5; X++)
   {
     Test _test = new Test();
     _test.A_String = "A" + X.ToString();
     _test.B_String = "B" + X.ToString();

     _dict.Add(X, _test);
     // each _test goes out of scope here
   }

   _dict.Remove(2);
   // Removed from dictionary, have no way to access it now.
static void Main(字符串[]args)
{

对于(int X=0;XNo)。只要它在范围内,您就可以访问
test
。 但是,由于在for循环的每个周期之后,测试的每个实例都超出了范围,所以如果从字典中删除它,就无法访问它

static void Main(string[] args)
{
   for(int X = 0; X <=5; X++)
   {
     Test _test = new Test();
     _test.A_String = "A" + X.ToString();
     _test.B_String = "B" + X.ToString();

     _dict.Add(X, _test);
     // each _test goes out of scope here
   }

   _dict.Remove(2);
   // Removed from dictionary, have no way to access it now.
static void Main(字符串[]args)
{

对于(int X=0;X当控制流从
Main
或定义和使用字典的任何其他方法退出时,.Net垃圾收集器知道这样的字典和字典中的所有项都不再使用。当GC下次运行时,它可能会清理它们。但是,您不必担心它们是否被清理p与否。只要它们是实例变量,一旦它们超出范围,它们肯定会被清除。

当控制流从
Main
或任何其他定义和使用字典的方法退出时,.Net垃圾收集器知道这样的字典和字典中的所有项不再使用。当GC运行下一个tim时它可能会清理它们。但是,您不必担心它们是否被清理。只要它们是实例变量,一旦它们超出范围,它们肯定会被清理

当我删除字典时,它还会破坏类实例吗

class Program
{

  class Test
  {
    public string A_String;
    public string B_String;
  }

  static Dictionary<int, Test> _dict = new Dictionary<int, Test>();

  static void Main(string[] args)
  {
    for(int X = 0; X <=5; X++)
    {
      Test _test = new Test();
      _test.A_String = "A" + X.ToString();
      _test.B_String = "B" + X.ToString();

      _dict.Add(X, _test);

    }

    _dict.Remove(2);

  }
}

垃圾回收器,它负责将对象从内存中处理,当对象的所有引用都消失时,该对象将被认为是集合的集合。在示例中,当从字典中删除第二个元素<代码>时,“测试”< /代码>不再被引用,因为您在其中定义并实例化了它。循环作用域。然后它应该成为集合的候选对象

从开始,垃圾收集器执行时:

当满足下列条件之一时,会发生垃圾回收 正确:

  • 系统的物理内存不足
  • 所使用的内存 托管堆上分配的对象超过了可接受的 阈值。此阈值会随着进程不断调整 跑步
  • 将调用GC.Collect方法。在几乎所有情况下,都不会调用 必须调用此方法,因为垃圾收集器正在运行 持续。此方法主要用于特殊情况和 测试
当我删除字典时,它还会破坏类实例吗

class Program
{

  class Test
  {
    public string A_String;
    public string B_String;
  }

  static Dictionary<int, Test> _dict = new Dictionary<int, Test>();

  static void Main(string[] args)
  {
    for(int X = 0; X <=5; X++)
    {
      Test _test = new Test();
      _test.A_String = "A" + X.ToString();
      _test.B_String = "B" + X.ToString();

      _dict.Add(X, _test);

    }

    _dict.Remove(2);

  }
}

垃圾回收器,它负责将对象从内存中处理,当对象的所有引用都消失时,该对象将被认为是集合的集合。在示例中,当从字典中删除第二个元素<代码>时,“测试”< /代码>不再被引用,因为您在其中定义并实例化了它。循环作用域。然后它应该成为集合的候选对象

从开始,垃圾收集器执行时:

当满足下列条件之一时,会发生垃圾回收 正确:

  • 系统的物理内存不足
  • 所使用的内存 托管堆上分配的对象超过了可接受的 阈值。此阈值会随着进程不断调整 跑步
  • 将调用GC.Collect方法。在几乎所有情况下,都不会调用 必须调用此方法,因为垃圾收集器正在运行 持续。此方法主要用于特殊情况和 测试

您的意思是在
new Test()
创建的实例是否在
\u dict.Remove()
处被“销毁”(垃圾收集?)?您的意思是在
new Test()
创建的实例是否在
\u dict.Remove()处被“销毁”(垃圾收集?)
?仅供参考:当您将
\u test
添加到字典中时,实际上是在添加对存储
\u test
的内存位置的引用。在调用
.add()
时,您有两个对该位置的引用(一个在
\u test
中,一个在索引
X
处的字典值中).for
循环的
每次迭代时,都会丢失一个引用(
\u test
),它会被“重新指向”到一个新的内存位置。当
for
循环结束时,对
Test
对象的唯一引用都在字典中。然后,当
删除这些对象时,所有引用都消失了,内存可以自由地用于其他事情。@RufusL,内存不是那么自由,因为引用是一个候选对象freed。我想这就是你的意思。不过,我想澄清一下,它不是std::sharedptr,在引用计数达到零后,它不会确定地消失,如果你在删除后进行GC堆转储,你可能会得到各种超出范围的内容。@NathanCooper是的,完全正确。我只是想添加一些描述参考:当您将
\u test
添加到字典中时,实际上是在向存储
\u test
的内存位置添加引用。在调用
.add()
时,您有两个对该位置的引用(一个在
\u test
,一个在索引
X
的字典值中)。在
for
循环的每次迭代中,您都会丢失一个引用(
\u test
),它会“重新指向”一个新的内存位置。当
for
循环结束时,您对
test
对象的唯一引用是