在C#中处置对象

时间:2017-05-29 09:30:59

标签: c# garbage-collection dispose

我有以下情况。我是子类化,想知道子类消失后超类会发生什么

以下是我的实施:

from sklearn.decomposition import PCA
from sklearn import preprocessing
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt

number_of_PCA = 20



# Reading csv file
training_file = 'Training.csv'
testing_file  = 'Test.csv'
dataframe_train = pd.read_csv(training_file)
dataframe_test  = pd.read_csv(testing_file)
#Training values
features_labels_train = dataframe_train.columns.values[:-2]
class_labels_train    = dataframe_train.iloc[:,-2]
feature_values_train  = dataframe_train.iloc[:,:-2]
train_onehot          = dataframe_train.iloc[:,-1]

#Test values
feature_labels_test = dataframe_test.columns.values[:-2]
class_labels_test    = dataframe_test.iloc[:,-2]
features_values_test = dataframe_test.iloc[:,:-2]
test_onehot          = dataframe_test.iloc[:,-1]


#values standardisation
stdsc = preprocessing.StandardScaler()
np_scaled_train = stdsc.fit_transform(feature_values_train)
np_scaled_test  = stdsc.transform(features_values_test)

pca = PCA(n_components=number_of_PCA)
X_train_pca = pca.fit_transform(np_scaled_train) # This is the result 
X_test_pca  = pca.transform(np_scaled_test)

......................................................

给我以下输出:

class Program
{
    static void Main(string[] args)
    {
        using (var a = new SuperHuman())
        {

        }

        Console.ReadLine();
    }
}

class Human : IDisposable
{
    public string LoType = "Normal";

    public Human()
    {
        Console.WriteLine("Human Created");   
    }

    public string GetHumanType()
    {
        return LoType;
    }

    public void Dispose()
    {            
        Console.WriteLine("{0} Human Class gONE", LoType);            
    }
}

class SuperHuman : Human
{                
    public SuperHuman()           
    {
        LoType = "Super";
        Console.WriteLine("{0} Human Created",LoType);   

    }

}

我想知道的是,如果父类也消失了 如果不是我如何与儿童班一起处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

为了清楚起见,一旦你处理它,实例就不会消失。它已经释放了所有非托管资源,之后可以免费提供,这样垃圾收集器就可以把它拿起来。

在您的示例代码中,只有一个实例(您不必为派生类及其基类创建两个实例)。您无法从内存中删除半个实例。它在那里或它消失了。

派生类&#39;在using块结束后,实例将被释放给垃圾回收器(不是因为using,而是留下了范围)。在适当的时候,垃圾收集器将释放内存。

答案 1 :(得分:0)

致问题

首先,似乎对类和对象之间的区别存在一些混淆。

使用new - 关键字,实例化SuperHuman的新实例。

using (var a = new SuperHuman())
{
    // inside this block, "a" contains a reference to a SuperHuman-Object, 
    // which is also a Human-Object and thus can be Disposed. 
    // (As it implements IDisposable and must have a Dispose-Method)
}

所以基本上你的课程根本没有发生任何事情using阻止在最后调用对象上的Dispose()-Method。所以无论你做什么里面这个方法都要完成。

IDisposable - 界面

我不打算在这里深入解释。

这是MSDN

的界面说明
  

提供释放非托管资源的机制。

这意味着,如果您定义实现Human IDisposable,则所有非托管资源(例如数据库连接)将在调用{{{ 1}} - 方法。所以负责在代码中释放这些资源。但是,Human仍然是托管资源。但这与Dispose()无关,因为托管资源正由Garbage Collection最终确定,当对象时,它会自动检测到不再使用了。

非托管资源究竟是什么

已经回答here

还免费管理资源?

即使界面不适合,您也可以通过将值设置为IDisposable来释放托管资源。其工作原理也已在另一个Thread中得到解答。