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

c#代码中的对象和引用数,c中的垃圾收集#

c#代码中的对象和引用数,c中的垃圾收集#,c#,garbage-collection,C#,Garbage Collection,下面是一个c#代码,我必须在整个代码之后找出对象(DOG)和引用的数量。最初我计算它是4个对象和8个参考。但是看了这个问题, ,(这表示垃圾收集器仅在系统内存不足和其他类似原因时运行)我怀疑对象的数量是否应为6?。下面的问题与程序获得的内存无关 所以我的问题是,如果我有过这样的问题,我的答案应该是什么(4,6或者我应该说这取决于记忆) //此时没有对象和引用?(狗对象不考虑字符串对象) 希望这个问题不愚蠢。它是6。要澄清答案,请按以下方式更改Dog类: public class Dog {

下面是一个c#代码,我必须在整个代码之后找出对象(DOG)和引用的数量。最初我计算它是4个对象和8个参考。但是看了这个问题, ,(这表示垃圾收集器仅在系统内存不足和其他类似原因时运行)我怀疑对象的数量是否应为6?。下面的问题与程序获得的内存无关

所以我的问题是,如果我有过这样的问题,我的答案应该是什么(4,6或者我应该说这取决于记忆)

//此时没有对象和引用?(狗对象不考虑字符串对象)


希望这个问题不愚蠢。

它是6。要澄清答案,请按以下方式更改Dog类:

public class Dog
{
    static int counter = 0;

    public string Breed { get; set; }

    public Dog()
    {
        Interlocked.Increment(ref counter);
    }

    ~Dog()
    {
        Interlocked.Decrement(ref counter);
    }
}

静态属性计数器将对内存中类Dog的实例进行计数。还有更多的解释

是6。要澄清答案,请按以下方式更改Dog类:

public class Dog
{
    static int counter = 0;

    public string Breed { get; set; }

    public Dog()
    {
        Interlocked.Increment(ref counter);
    }

    ~Dog()
    {
        Interlocked.Decrement(ref counter);
    }
}

静态属性计数器将对内存中类Dog的实例进行计数。还有更多的解释

对于几乎所有的目的,垃圾收集器的操作都超出了范围,您不必担心

计算此处创建的“Dog”对象的数量与计算“new Dog()”出现的次数一样简单;每一个都会创建一个新对象


作为注释,字符串也是对象;我敢肯定,如果你也要计算这些,但那将使总数达到10。

几乎在所有情况下,垃圾收集器的操作都超出了范围,你不必担心

计算此处创建的“Dog”对象的数量与计算“new Dog()”出现的次数一样简单;每一个都会创建一个新对象


作为注释,字符串也是对象;我敢肯定,如果你也要计算这些,那么总共是10个。

每次调用
new
都会创建一个新对象(因此也会创建一个新的引用)。GC不是确定性的,所以当您超出变量的范围时,您无法确定有多少对象仍然处于活动状态。因此,您的答案都不正确,这完全取决于GC认为什么是好的


如前所述,只要你在你的对象范围内,你当然可以计算它们。说到这里,您有6个对象(不包括4个字符串)。

每次调用
new
都会创建一个新对象(因此也会创建一个新的引用)。GC不是确定性的,所以当您超出变量的范围时,您无法确定有多少对象仍然处于活动状态。因此,您的答案都不正确,这完全取决于GC认为什么是好的


如前所述,只要你在你的对象范围内,你当然可以计算它们。说到这里,您有6个对象(不包括4个字符串)。

每个
new
关键字意味着您在堆上分配了一个新对象。所以我数了6个
Dog
类型的对象。其中4只狗有一个
字符串
对象。因此,10.

每个
new
关键字意味着在堆上分配一个新对象。所以我数了6个
Dog
类型的对象。其中4只狗有一个
字符串
对象。因此,10.

我认为对于这个问题,您必须忽略垃圾收集,因为它在运行时是不确定的。还要注意,字符串是对象,在您的示例代码
Dog.bride
中是对字符串的引用。@MatthewWatson……我只对Dog对象感兴趣。但是谢谢你指出。我认为你必须忽略垃圾收集这个问题,因为它在运行时是不确定的。还要注意,字符串是对象,在您的示例代码
Dog.bride
中是对字符串的引用。@MatthewWatson……我只对Dog对象感兴趣。但谢谢你指出。我想你忘了一个词:“不必担心”,还有
rover.bride=“灰狗”创建一个对象(字符串)。但是由于字符串的插入,它开始变得非常复杂——因为如果在其他地方创建了相同的常量字符串,那么可能不会创建新的字符串对象@Rik…但在使用“new…()”之后,引用变量指向其他狗对象,而之前的狗对象没有引用。@dividedbyzero是的,但该对象仍然存在,至少在垃圾收集器运行之前是这样。既然你不知道什么时候会发生这种情况,你还是应该数一数。@Rik……但在头一本书中,它说一旦一个对象没有引用它,它就会被垃圾收集。所以情况不是这样的,对吗?我想你忘了一个词:“不要担心”,还有
rover.bread=“灰狗”创建一个对象(字符串)。但是由于字符串的插入,它开始变得非常复杂——因为如果在其他地方创建了相同的常量字符串,那么可能不会创建新的字符串对象@Rik…但在使用“new…()”之后,引用变量指向其他狗对象,而之前的狗对象没有引用。@dividedbyzero是的,但该对象仍然存在,至少在垃圾收集器运行之前是这样。既然你不知道什么时候会发生这种情况,你还是应该数一数。@Rik…但在Head First一书中,它说一旦一个对象没有引用它,它就会被垃圾收集。所以情况不是这样的,对吗?这意味着你在同一个方法/类/块/。。。其中变量已定义。例如,如果你在一个方法中定义了这些对象,那么这个方法就是作用域,你的对象将和你在这个方法中的时间一样长。因此,你不能从这个方法之外访问它们。这意味着你在同一个方法/类/块/。。。其中变量已定义。如果您在一个方法中,例如