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()正在查找的位置—列表、数据库、文件等。它需要从源代码中删除。或者如果他想保存它的历史,至少标记为“已删除”。