标签: finalize

Finalize()中的C#覆盖

protected override void Finalize()
        {
            try
            {
                this.FtcpSock.Close();
                this.FudpSock6800.Close();
                this.FudpSock6801.Close();
                this.FudpSock6802.Close();
                this.FudpSock6803.Close();
                this.FudpSock6804.Close();
                this.FudpSock6806.Close();
            }
            finally
            {
                this.Finalize();
            }
        }
Run Code Online (Sandbox Code Playgroud)

我收到此错误信息:

Error 1 Do not override object.Finalize. Instead, provide a destructor.

顺便说一句,这是由第三方公司遵守的原始代码.
如何解决这个问题呢?如何用覆盖结束?

c# overriding finalize

3
推荐指数
1
解决办法
1198
查看次数

close,析构函数和finalize:Java矛盾

我有以下代码,在我的班级中逐行读取文件时效果很好.

 try {  FileInputStream in = new FileInputStream(filename);
        BufferedReader reader=new BufferedReader(new InputStreamReader(in));
        String line;
        while((line=reader.readLine())!=null){
             // read the file
        }
    }
    catch (Exception e) {
        System.out.println(e);
    }
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试将命令添加为close,那么在文件读完之后,我就得到了错误:

    in.close();

Error:(131, 9) java: cannot find symbol
symbol:   variable in
location: class ReadFile
Run Code Online (Sandbox Code Playgroud)

我在使用后搜索了清洁对象,并在程序结束前需要关闭文件.并在Java上发现了几个帖子,但很多都非常矛盾.关键是,最后我感到非常困惑.

我错了,或者Java编程有点模糊和混乱?我的意思是,显然没有真正使用析构函数,使用finalize是非常值得怀疑的,并且使用close也被认为是不必要的.关于这些问题的一些帖子是矛盾和非决定性的.

那么,如何在这里继续?在我真的需要关闭文件的情况下,如何摆脱这个错误信息?关闭文件真的可有可无和不必要吗?如何为程序完成清理类实例?

java file-io class finalize code-cleanup

3
推荐指数
2
解决办法
288
查看次数

finalize()没有被调用

为什么finalize()不在这里被称为.代码编译并成功运行,但没有任何输出.

package temp;

public class Temp {

    int i;

    Temp(int j) {
        i = j;
    }

    public void finalize() {
        if (i == 10) {
            System.out.println("Finalize called.");
        }
    }

    public static void main(String[] args) {
        Temp obj = new Temp(10);
        System.gc();
    }

}
Run Code Online (Sandbox Code Playgroud)

java finalize

3
推荐指数
1
解决办法
425
查看次数

c#我的析构函数没有被调用?

我有这个简单的代码,并试图调用析构函数,但我不能称之为:(

我知道GarbageCollector会在必要时运行,所以我使用了GC.WaitForPendingFinalizers(); 但它也没有用.

这是我的代码:

class Program
    {
        static void Main(string[] args)
        {
            Calculator calculator = new Calculator();
            Console.WriteLine("{0} / {1} = {2}", 120, 15, calculator.Divide(120, 15)

            GC.Collect();
            GC.WaitForPendingFinalizers();

            Console.WriteLine("Program finishing");                           
        }

  }

class Calculator
    {

        // Constructor
        public Calculator()
        {
            Console.WriteLine("Calculator being created");
        }

        // Public Divide method
        public int Divide(int first, int second)
        {
            return first / second;
        }

        // Destructor
        ~Calculator()
        {
            Console.WriteLine("Destructor is called");

        }

    }
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

正在创建的计算器

120/15 = 8

程序完成

我究竟做错了什么?为什么我看不到"析构函数被调用"?

c# destructor finalize

3
推荐指数
1
解决办法
1733
查看次数

Java 8有关finalize方法的断言正确吗?

我正在阅读Kathy Sierra + Bert Bates 撰写的《OCA Java SE 8程序员I考试指南》

关于finalize方法,我不太了解。它在第218页上指出:

调用finalize()实际上可以导致保存对象以免被删除。

稍后在第222页:

您可以从中使对象不符合GC条件finalize()

英语不是我的母语,但是我在两种情况下都了解该finalize()方法可以防止对象被垃圾回收?是这样吗 还是我误解了?

java finalize

3
推荐指数
1
解决办法
85
查看次数

在这种情况下,什么时候在我的类实例上调用finalize()?

我知道每当垃圾收集器收集一个类实例时都会调用finalize().但是,当通过队列将类的实例传递给另一个线程时,我有点困惑.

假设这是Thread1的骨架:

for(i=0; i<1000; i++) {
   Packet pkt = new Packet();  // instance of class
   pkt.id = i;
   thread2.queue.put(pkt);
}
Run Code Online (Sandbox Code Playgroud)

然后,线程2将从队列中删除数据包并执行冗长的操作.这第二个线程是否获得了数据包的"副本",还是通过某种形式的引用?重要的是,如果是通过复制,则可以在线程2完成数据包之前调用在线程1中创建的实例上的finalize().如果是引用,我保证只对包中的信息调用finalize()一次.

这个基本示例可能没有显示重要性,但是我在数据包中存储了一个C指针(来自JNI)以在完成对象时销毁一些内存.如果它是通过副本传递的,则内存可能会在第二个线程完成之前被销毁.如果它是通过引用传递的,那么它应该只在GC看到它不再被两个线程使用时被销毁(我想要的行为).如果后一种情况得不到保证,我不会使用finalize()并使用其他东西,但会更复杂.

java garbage-collection finalize pass-by-reference

2
推荐指数
1
解决办法
264
查看次数

最终确定C#中的方法指南和最佳实践

我最近遇到了一个与在Finalize方法重载中运行的代码有关的问题.

我大部分都知道与内存管理/性能有关的问题,但我感兴趣的是,是否有任何关于"哪些代码应该/不应该用于Finalize方法"的指南?

例如:

  1. 不要在Finalize方法中抛出异常.
  2. 代码应该快速执行.
  3. 不要举起活动(?)
  4. 等等...

我的案例中的行为是由于引发的事件导致了一些异常.

所以我的问题是 - 关于finalize方法,我必须遵循哪些指导原则(甚至可能强制使用某些工具)?

.net c# coding-style finalize

2
推荐指数
1
解决办法
1333
查看次数

在finalization中使用私有方法/ var

我有(静态)类GT_MyClass

GT_MyClass = class
private
  class var FImage : TJpegImage;

  class function GetImage: TJpegImage;
public
  property Image : TJpegImage  read GetImage;
end;
Run Code Online (Sandbox Code Playgroud)

在函数GetImage我创建FImage如果它还不存在.

class function GT_Myclass.GetImage: TJpegImage;
begin
    if not Assigned(FImage) then
    begin
      FImage := TJpegImage.Create;
    end;
    Result := FImage;
end;
Run Code Online (Sandbox Code Playgroud)

在最后我想要FreeAndNil(FImage)

finalization
  if Assigned(FImage) then
    FreeAndNil(FImage);
Run Code Online (Sandbox Code Playgroud)

但在最终版块中,我无法看到私有的var FImage ......

你能帮帮我吗?

谢谢!

BTW:我想要属性Image绝对是静态的

delphi static properties finalize delphi-xe6

2
推荐指数
1
解决办法
128
查看次数

可终结对象在回收之前至少需要2个垃圾回收周期?

我正在阅读这篇文章,我无法真正理解最终化对象(覆盖该finalize方法的对象)在回收之前至少需要2个GC周期.

在可回收可完成对象之前,它至少需要两次垃圾收集周期(在最好的情况下).

有人还可以详细解释一个可终结的对象如何可以采用多个GC循环进行回收?

我的逻辑论点是,当我们覆盖finalize方法时,运行时必须使用垃圾收集器注册此对象(以便GC可以调用finalize此对象,这使我认为GC将引用所有可终结的对象).为此,GC必须对可终结对象保持强有力的参考.如果是这种情况,那么该对象如何成为GC首先进行回收的候选对象?我通过这个理论达成了矛盾.

PS:我知道覆盖finalize不是推荐的方法,并且自Java 9以来不推荐使用此方法.

java garbage-collection finalize

2
推荐指数
1
解决办法
79
查看次数

为什么在Java 9中不推荐使用finalize()方法?

(此问题不同于您为什么要实现finalize()?此问题与从Java平台弃用有关,另一个问题与在应用程序中是否应使用此机制有关。)

为什么finalize()在Java 9中不推荐使用该方法?

是的,它可能以错误的方式使用(例如,从垃圾收集中保存对象(尽管仅一次)或尝试关闭其中的某些本机资源(比完全不关闭更好))以及许多其他方法可能会被错误地使用。

那么,finalize()真的有这么危险的或绝对无用,它是必要踢出来的Java?

java finalize java-9

2
推荐指数
1
解决办法
393
查看次数