1

我正在调用一种方法来删除包含特定值的对象。它看起来像这样:

static public void RemovePiece(string BoardId)
{
    LumberPiece board = LocateBoard(BoardId);
    board = null;
}

LumberPiece 是一个如下所示的类:

private class LumberPiece
{
    public string boardID;
    ...
}

LocateBoard 是一个返回正确识别的 LumberPiece 对象的函数:

static private LumberPiece LocateBoard(string BoardId)
{
    if (SawyerArea.lumber.boardID == BoardId)
        return SawyerArea.lumber;
    else if (SpliceArea1.lumber.boardID == BoardId)
        return SpliceArea1.lumber;
    else if (SpliceArea2.lumber.boardID == BoardId)
        return SpliceArea2.lumber;
    else
        throw new Exception("Your LumberID was not found in any activity area. Has it already been removed? or are you handling the integer-String Conversion Correctly");
}

区域变量是此类的实例:

private class ActivityArea
{
    public Sensor sensor;
    public ClampSet clampSet;
    public Servo servo;
    public LumberPiece lumber;

    public bool IsCurrentlyFilled()
    {
        if (lumber != null)
            return true;
        else
            return false;
    }

    public ActivityArea(Sensor s, ClampSet cs, Servo srv)
    {
        sensor = s;
        clampSet = cs;
        servo = srv;
    }

如何删除正确识别的 LumberPiece 对象?

4

2 回答 2

8

在 .NET 等垃圾收集框架中,您不会“删除”对象。你就别管它了。一旦你没有引用它(通过任何途径),垃圾收集器将在适当的时候处理它。

这可能涉及从列表中删除引用等 - 这通常很简单:

list.Remove(theObject);

但是,由于我们无法看到您将电路板存储在何处,因此我们无法告诉您如何删除对它的引用。

其实这里要做的工作和非GC平台没什么区别;您仍然需要从这些列表中删除指针,以避免稍后在访问现在删除的指针时出现可怕的错误。

于 2013-07-15T20:23:57.643 回答
3

您需要找到ActivityArea包含要删除的 Lumber 对象的 。

因此,例如,您可以使用此方法而不是 LocateBoard:

static public ActivityArea LocateAreaByBoard(string BoardId)
        {
            if (SawyerArea.lumber.boardID == BoardId)
                return SawyerArea;
            else if (SpliceArea1.lumber.boardID == BoardId)
                return SpliceArea1;
            else if (SpliceArea2.lumber.boardID == BoardId)
                return SpliceArea2;
            else
                throw new Exception("Your LumberID was not found in any activity area. Has it already been removed? or are you handling the integer-String Conversion Correctly");
        }

然后您可以将删除代码更改为如下所示:

ActivityArea area = LocateAreaByBoard(BoardId);
area.lumber = null;

它会给你想要的删除效果

于 2013-07-15T21:03:52.973 回答