从对象中传递对象会产生垃圾吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从对象中传递对象会产生垃圾吗?相关的知识,希望对你有一定的参考价值。

我想完全优化一个类,以便它在生命周期中不会产生垃圾(不包括实例化和破坏)但我也希望从方法中返回一个对象 - 这可能吗?

以下是这种情况的一个例子:

public class Example
{
    /// <summary>
    /// Width of each column - gets set by the constructor.
    /// </summary>
    private int columnWidth = 0;

    /// <summary>
    /// Height of each row - gets set by the constructor.
    /// </summary>
    private int rowHeight = 0;

    /// <summary>
    /// Internal working rectangle to avoid garbage collection.
    /// Created only once for each instance of encapsulating class.
    /// </summary>
    private Rectangle rectangle = new Rectangle(0, 0, 0, 0);

    /// <summary>
    /// Initializes a new instance of the <see ref="Example"> class.
    /// </summary>
    /// <param name="columnWidth">Column width.</param>
    /// <param name="rowHeight">Row height.</param>
    public Example(int columnWidth, int rowHeight)
    {
        this.columnWidth = columnWidth;
        this.rowHeight = rowHeight;
    }

    /// <summary>
    /// Constructs and returns a rectangle for this class.
    /// </summary>
    /// <param name="column">Column for the rectangle to represent.</param>
    /// <param name="row">Row for the rectangle to represent.</param>
    /// <returns>Constructed rectangle for column and row.</returns>
    public Rectangle GetRectangle(int column, int row)
    {
        this.rectangle.Width = this.columnWidth;
        this.rectangle.Height = this.rowHeight;
        this.rectangle.X = column * this.columnWidth;
        this.rectangle.Y = row * this.rowHeight;

        return this.rectangle;
    }
}

public class OtherClass
{
    // some other unimportant stuff going on...

    /// <summary>
    /// Internal rectangle.
    /// </summary>
    private Rectangle rec = new Rectangle(0, 0, 0, 0);

    /// <summary>
    /// Does some stuff.
    /// </summary>
    private void DoStuff()
    {
        var exampleClass = new Example(20, 20);

        // --- THIS IS THE PART I AM CONCERNED ABOUT ---
        // Does this assignment over-write the previous assignment (no garbage)?
        // - or -
        // Does this produce a new assignment and orphan the old one (creates garbage)?
        this.rec = exampleClass.GetRectangle(1, 3);
    }

    // some more other unimportant stuff going on...
}

我想,询问是否将对象分配给已存在的引用会产生垃圾会更准确。

- [编辑] -

只是上下文,如果你想知道:这个方法将用于从精灵表中获取精灵的源矩形。由于精灵表有动画条,这个调用将每秒无数次,所以任何孤立的对象都会很快加起来。

答案

如果要分配的对象是值类型,则将彻底替换该值。否则,如果它是一个引用类型,它将孤立前一个对象并将其标记为“无法访问”,以后可以通过GarbageCollector删除/收集它。

在我们的场景中,我相信,它是一个值类型(struct),因此它将被替换而不会产生垃圾。

此外,GarbageCollector没有固定的间隔来运行和收集,它根据以下链接中提到的条件运行:

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals#conditions_for_a_garbage_collection

C# Garbage collection?

您还会发现这些有用:

C# The 'new' keyword on existing objects

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/

以上是关于从对象中传递对象会产生垃圾吗?的主要内容,如果未能解决你的问题,请参考以下文章

一个尚未启动的新线程对象会被垃圾回收吗?

从 stackview 小部件传递可序列化对象会产生空指针异常

面向对象(匿名对象的概述与应用)

在一些片段之间填充对象变量的最佳方法

将 Google API 客户端对象从活动传递到滑动选项卡片段

将对象列表从片段传递到 recyclerView 适配器