Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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中的s性质#_C# - Fatal编程技术网

C# 删除返回的对象';C中的s性质#

C# 删除返回的对象';C中的s性质#,c#,C#,我正在调用一个方法来删除包含特定值的对象。看起来是这样的: static public void RemovePiece(string BoardId) { LumberPiece board = LocateBoard(BoardId); board = null; } private class LumberPiece { public string boardID; ... } ActivityArea area = LocateAreaByBoard(

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

static public void RemovePiece(string BoardId)
{
    LumberPiece board = LocateBoard(BoardId);
    board = null;
}
private class LumberPiece
{
    public string boardID;
    ...
}
ActivityArea area = LocateAreaByBoard(BoardId);
area.lumber = null;
LumberPiece是一个如下所示的类:

static public void RemovePiece(string BoardId)
{
    LumberPiece board = LocateBoard(BoardId);
    board = null;
}
private class LumberPiece
{
    public string boardID;
    ...
}
ActivityArea area = LocateAreaByBoard(BoardId);
area.lumber = null;
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;
    }

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

在.NET之类的垃圾收集框架中,您不会“删除”该对象。你别再关心它了。一旦您没有对它的引用(通过任何路由),垃圾收集器将在适当的时候处理它

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

list.Remove(theObject);
但是,由于我们看不到您将线路板存储在何处,因此无法告诉您如何删除对它的引用


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

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

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

list.Remove(theObject);
但是,由于我们看不到您将线路板存储在何处,因此无法告诉您如何删除对它的引用


实际上,您在这里需要做的工作与非GC平台没有什么不同;您仍然需要从这些列表中删除指针,以避免以后访问现在已删除的指针时出现可怕的错误。

您需要找到包含要删除的木材对象的
ActivityArea

例如,您可以使用此方法代替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");
        }
然后您可以将删除代码更改为如下所示:

static public void RemovePiece(string BoardId)
{
    LumberPiece board = LocateBoard(BoardId);
    board = null;
}
private class LumberPiece
{
    public string boardID;
    ...
}
ActivityArea area = LocateAreaByBoard(BoardId);
area.lumber = null;

它将为您提供所需的删除效果

您需要找到包含要删除的木材对象的
活动区域

例如,您可以使用此方法代替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");
        }
然后您可以将删除代码更改为如下所示:

static public void RemovePiece(string BoardId)
{
    LumberPiece board = LocateBoard(BoardId);
    board = null;
}
private class LumberPiece
{
    public string boardID;
    ...
}
ActivityArea area = LocateAreaByBoard(BoardId);
area.lumber = null;

它将为您提供所需的删除效果

对象变量始终是指向C#中对象的指针。但它们不是指针,而是引用。您不需要这样做。垃圾收集器会这样做。从什么中删除它,准确地说?在C#等托管语言中,通常会删除对对象的引用,例如从列表中删除对象,并让垃圾回收处理该对象实际被销毁的详细信息。@Yogendra将局部变量设置为null不会执行OP可能希望执行的操作,就从某些位置删除实际的board对象而言,看起来您实际上需要一个
LocateAreaByBoard
函数(返回包含指定board的区域),当你找到它时,你可以将它的
字段设置为空。对象变量总是指向C#中的对象的指针。但它们不是指针,而是引用。你不需要这样做。垃圾收集器会这样做。从什么中删除它,准确地说?在C#等托管语言中,通常会删除对对象的引用,例如从列表中删除对象,并让垃圾回收处理该对象实际被销毁的详细信息。@Yogendra将局部变量设置为null不会执行OP可能希望执行的操作,如果要从某个位置删除实际的board对象,看起来您实际上需要一个
LocateAreaByBoard
函数(该函数返回包含指定board的区域),然后当您找到它时,您可以将其
lumber
字段设置为null。确切地说,他需要返回源代码。他可能希望这样做,以便LocateBoard()在删除木材时不会返回木材。要做到这一点,我们需要知道LocateBoard()正在查找的位置—列表、数据库、文件等。它需要从源代码中删除。或者如果他想保存它的历史,至少标记为“已删除”。确切地说,他需要返回源代码。他可能希望这样做,以便LocateBoard()在删除木材时不会返回木材。要做到这一点,我们需要知道LocateBoard()正在查找的位置—列表、数据库、文件等。它需要从源代码中删除。或者如果他想保存它的历史,至少标记为“已删除”。