Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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#_Garbage Collection_Readonly - Fatal编程技术网

C# 只读修饰符对垃圾收集器有影响吗?

C# 只读修饰符对垃圾收集器有影响吗?,c#,garbage-collection,readonly,C#,Garbage Collection,Readonly,只读修饰符是否可能影响垃圾收集器的工作? 对于值类型,对于引用类型?我不明白为什么它会影响GC的正常使用。这只是一个领域。GC只遵循引用类型字段(或结构字段中包含的引用) 您可能能够构建影响GC的人工场景(可能滥用readonly字段的防御副本),但在正常使用情况下不会发生 当然,在像Dispose这样的方法中,您不能将字段设置为null,如果您希望在某些对象包含对包含对象的引用的情况下为GC准备昂贵的自有对象,这可能会很有用 由于readonly 该程序表明,只要将字段从“不只读”更改为“只读

只读修饰符是否可能影响垃圾收集器的工作?
对于值类型,对于引用类型?

我不明白为什么它会影响GC的正常使用。这只是一个领域。GC只遵循引用类型字段(或结构字段中包含的引用)

您可能能够构建影响GC的人工场景(可能滥用readonly字段的防御副本),但在正常使用情况下不会发生

当然,在像
Dispose
这样的方法中,您不能将字段设置为null,如果您希望在某些对象包含对包含对象的引用的情况下为GC准备昂贵的自有对象,这可能会很有用

由于
readonly

该程序表明,只要将字段从“不只读”更改为“只读”,就可以防止使用其他相同代码收集对象。它滥用了在方法调用时复制只读字段以在可写结构中设置Obj字段null并将引用保留在只读结构中的做法。因为它可以防止引用变为null,所以可以防止对象被收集。
但这当然不会影响GC本身。而是滥用readonly的语义来创建一个不同的对象图,使用readonly而不是不使用readonly。所以贾里德的说法仍然是完全正确的

struct EvilStruct
{
    public readonly object Obj;

 public void SetToNull()
 {
   this=new EvilStruct();
 }

 public EvilStruct(object obj)
 {
   Obj=obj;
 }
}

readonly EvilStruct s1=new EvilStruct(new object());
EvilStruct s2=new EvilStruct(new object());

void Main()
{
    s1.SetToNull();
 s2.SetToNull();
 s1.Obj.Dump();//An instance of System.Object
 s2.Obj.Dump();//null
 //now s1.Obj can't be collected, but what was once in s2.Obj can
}

不,没有。GC的工作原理是为无法从任何根对象访问的对象回收内存。只读修改器对此过程没有影响。除了有几个只读字段的对象图之外,其他两个相同的对象图将以相同的方式收集

只读
是一种C#功能。GC是一种CLI功能。因此,它根本不能影响GC。

它的可能副本不会影响GC。Readonly修改字段本身,而不是它所指向的内容。当对象不再是根对象时,将在某个点收集该对象。找到了一个程序示例,其中只读阻止对象被收集。此程序充其量表明您没有费心编译它,因为
对象中没有
转储
方法。另外,您的
Main
函数不是静态的,如果是静态的,您就不能访问
s1
s2
@Matthew Ferreira:它在Linq Pad中编译。Dump是一种扩展方法。LINQPad可能将该代码包装在一个类中,然后实例化它并对其调用Main。