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
对象的唯一引用是