如何删除c#上的对象?

时间:2018-04-14 23:11:25

标签: c#

如果我们从类中删除一个对象是否可能?我有一个类如下:

父类:

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

删除对象应该在父类上。有可能吗?

2 个答案:

答案 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函数内设置nullDelete在函数之外没有影响(如果它编译的话)。

从自身中销毁对象也非常危险,因为您必须确保之后没有代码可以访问该对象(或调用者堆栈)。事实上,在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>),在这种情况下,如果您不再需要它,那么您显然会从集合中删除一个公司,然后当您使用该集合时,你无论如何都不会看到它。

或者对于复杂情况,您可以使用字典,集合或标记来记住是否应该处理给定对象。这可能很有用,例如在迭代集合时,通常在枚举其项目时不应修改。