public static void main(String[] args) throws SQLException, Exception {
Connection con = ConnectionDefinition.getOracleConnection();
CallableStatement cl = con.prepareCall("declare " +
" a TVarcharArray;" +
" begin " +
" a := TVarcharArray('A','B','C');" +
" ? := a;" +
" end;\n" +
"");
cl.registerOutParameter(1, Types.ARRAY,"TVARCHARARRAY");
cl.execute();
String[] objArr = (String[]) (cl.getArray(1)).getArray();
for(String tmp: objArr){
System.err.println(tmp);
}
con.close();
}
我正在使用此代码捕获计算机的屏幕。
但今天我发现有一个名为Bitmap.Dispose()的方法。
调用Dispose()之间的区别是什么?代码运行至关重要吗?
答案 0 :(得分:9)
如果某个类型实现了IDisposable
接口,那么一定要调用Dispose
方法(显式或using
块)。
如果我不打电话处理(),会怎样?
如果你不这样做,析构函数(终结者)负责释放资源;但是,它有一些缺点:
答案 1 :(得分:2)
必须致电Dispose
。如果你不这样做,就会有一些非管理资源,比如GDI对象,不会被清理干净。这意味着你将会发生内存泄漏。
是的,请拨打Dispose
(或者更好,使用using (...) { ... }
)。
答案 2 :(得分:0)
基本上你的代码应该是这样的
public void screenShot(string path)
{
using (var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height,
PixelFormat.Format32bppArgb))
{
var gfxScreenshot = Graphics.FromImage(bmpScreenshot);
gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
Screen.PrimaryScreen.Bounds.Y,
0,
0,
Screen.PrimaryScreen.Bounds.Size,
CopyPixelOperation.SourceCopy);
bmpScreenshot.Save(path, ImageFormat.Png);
}
}
这可确保正确释放位图对象使用的非托管资源。如果没有正确处理,只需一个位图就不会遇到麻烦,但一旦开始批量处理,它就变得至关重要。不正确处理将导致内存不足问题,我发现内存填充速度非常快,编码不当。
答案 3 :(得分:0)
“Dispose”方法来自“IDisposable”界面并执行以下操作:
执行与释放,释放或重置非托管资源相关的应用程序定义任务。
基本上,您可以说使用的资源不会立即释放。即使不再需要它们也不行。 但只有当垃圾收集器释放它们时。
有关更多信息,请查看MSDN: IDisposable Interface
关于此主题的其他有用链接: