如果我们从类中删除一个对象是否可能?我有一个类如下:
父类:
public class ModelBase<T>
{
.....
public void Delete()
{
this = null // <-- it's not works
}
.....
}
儿童班:
public class Company : ModelBase<Company>
{
public string Name;
public Company(string name)
{
Name = name;
}
}
在UI图层上声明:
var company = new Company("Company X");
Console.WriteLine(company.Name);
company.Delete();
Console.WriteLine(company.Name); // <-- this should be empty or null
删除对象应该在父类上。有可能吗?
答案 0 :(得分:3)
不,在C#中,垃圾收集执行&#34;删除&#34;为了你最终。
如果您想要手动处理类中的某些内容,您可以使用一次性模式(https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/dispose-pattern)。
您最接近手动删除对象的做法是强制垃圾收集器使用GC.Collect(https://msdn.microsoft.com/en-us/library/xe0c2357(v=vs.110).aspx)进行收集。
答案 1 :(得分:0)
显然在this
函数内设置null
到Delete
在函数之外没有影响(如果它编译的话)。
从自身中销毁对象也非常危险,因为您必须确保之后没有代码可以访问该对象(或调用者堆栈)。事实上,在C#中,这个想法没有意义,因为它是垃圾收集,这意味着如果你在一个成员函数中,那么你至少有一个对象的引用,在这种情况下它那时候永远不会被垃圾收集。
还假设对象公司已被销毁(并且company
设置为null),在调用.Name
时会出现空指针异常。
假设公司对象不是一次性的(不实现IDisposable
),那么您的代码应如下所示:
var company = new Company("Company X");
Console.WriteLine(company.Name);
company = null;
Console.WriteLine(company?.Name); // <-- this should be empty or null
好吧,我们假设真正的代码比那些更复杂,否则你可以简单地用下一行代替:
Console.WriteLine();
但是,如果您的公司对象实现IDisposable
,那么通常您应该使用using
关键字,如果将对象设置为null则无效。
using (var company = new Company("Company X"))
{
Console.WriteLine(company.Name);
}
Console.WriteLine();
您的Delete
功能确实是个坏主意,并清楚地表明对C#缺乏了解。
如果您想知道某个对象是否已被销毁,您可以使用WeekReference
。例如,它可以用于缓存。有关详细信息,请参阅参考文档:https://msdn.microsoft.com/en-us/library/system.weakreference(v=vs.110).aspx。
您的整个代码毫无意义。如果你只有一个变量,那么一个体面的程序员知道对象何时活着是微不足道的。如果您有多个对象,那么您应该使用一个集合(例如List<Company>
),在这种情况下,如果您不再需要它,那么您显然会从集合中删除一个公司,然后当您使用该集合时,你无论如何都不会看到它。
或者对于复杂情况,您可以使用字典,集合或标记来记住是否应该处理给定对象。这可能很有用,例如在迭代集合时,通常在枚举其项目时不应修改。