日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core/.NET 5.0 析构函数依然有效?

發(fā)布時(shí)間:2023/12/4 asp.net 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core/.NET 5.0 析构函数依然有效? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【導(dǎo)讀】最近看到小伙伴在.NET Core中用到了析構(gòu)函數(shù),不禁打一疑問,大部分情況下,即使在.NET Framework中都不會怎么用到析構(gòu)函數(shù),我想在.NET Core中是否還依然有效呢?

隨著時(shí)間推移,迭代版本更新,有些當(dāng)初我們腦海里認(rèn)定的東西可能在當(dāng)前并不再適用,這也就需要我們同步知識更新,如今我們所認(rèn)為可能并不再是往昔我們所認(rèn)為

.NET Core/.NET 5.0 析構(gòu)函數(shù)

下面首先來看在.NET Framework中一個(gè)很標(biāo)準(zhǔn)的資源釋放例子,這里我以4.7.2版本為例(其他版本一樣)。創(chuàng)建基于當(dāng)前應(yīng)用程序域的指定程序集的指定實(shí)例

public?class?CurrentDomainSandbox?:?IDisposable {private?AppDomain?_domain?=?AppDomain.CreateDomain("CurrentDomainSandbox",null,new?AppDomainSetup{ApplicationBase?=?AppDomain.CurrentDomain.BaseDirectory,ConfigurationFile?=?AppDomain.CurrentDomain.SetupInformation.ConfigurationFile});~CurrentDomainSandbox(){Dispose(false);}public?T?CreateInstance<T>(params?object[]?args)=>?(T)CreateInstance(typeof(T),?args);private?object?CreateInstance(Type?type,?params?object[]?args){HandleDisposed();return?_domain.CreateInstanceAndUnwrap(type.Assembly.FullName,type.FullName,ignoreCase:?false,bindingAttr:?0,binder:?null,args:?args,culture:?null,activationAttributes:?null);}public?void?Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected?virtual?void?Dispose(bool?disposing){if?(disposing?&&?(_domain?!=?null)){AppDomain.Unload(_domain);_domain?=?null;}}private?void?HandleDisposed(){if?(_domain?==?null){throw?new?ObjectDisposedException(null);}} }

通過如上定義創(chuàng)建指定名稱的應(yīng)用程序域沙箱盒子,這樣我們則可在此沙箱中創(chuàng)建對應(yīng)程序集和實(shí)例,如此則可以其他域完全隔離且獨(dú)立,然后在控制臺進(jìn)行如下調(diào)用

??var?sanBox?=?new?CurrentDomainSandbox();var?instance?=?sanBox.CreateInstance<Program>();

還未完畢,直接運(yùn)行將拋出如下異常

若用于遠(yuǎn)程傳輸,我們直接將主類繼承自MarshalByRefObject就好,否則將此類通過Serializable特性標(biāo)記,至于二者區(qū)別不詳細(xì)展開

通過上述比較標(biāo)準(zhǔn)的例子我們則可以創(chuàng)建和釋放未被使用的對應(yīng)實(shí)例,我們看到用到了析構(gòu)函數(shù),但是我們發(fā)現(xiàn)最終調(diào)用Dispose方法,并未做任何處理,其實(shí)不然,問題出在對析構(gòu)函數(shù)概念的理解

析構(gòu)函數(shù):在應(yīng)用程序終止之前,將調(diào)用尚未被垃圾回收的所有對象的析構(gòu)函數(shù)

析構(gòu)函數(shù)本質(zhì)是終結(jié)器,如果對象已被釋放,在合適時(shí)機(jī)將自動調(diào)用Finalize方法,除非我們手動通過GC來抑制調(diào)用終結(jié)器(GC.SuppressFinalize),但不建議手動調(diào)用Finalize方法

通過資源釋放標(biāo)準(zhǔn)例子,想必我們已經(jīng)知道了析構(gòu)函數(shù)的基本原理,接下來我們還是基于上述.NET Framework 4.7.2版本來演示析構(gòu)函數(shù)

public?class?ExampleDestructor {public?ExampleDestructor(){Console.WriteLine("初始化對象");}public?void?InvokeExampleMethod(){}~ExampleDestructor(){Console.WriteLine("終結(jié)對象");} }

既然析構(gòu)函數(shù)是在應(yīng)用程序終止前進(jìn)行調(diào)用,那么我們在調(diào)用上述示例中方法時(shí),如下調(diào)用:

var?exampleDestructor?=?new?ExampleDestructor();exampleDestructor.InvokeExampleMethod();

在.NET Framework中如我們所期望,在應(yīng)用程序卸載時(shí),此時(shí)會調(diào)用析構(gòu)函數(shù)并進(jìn)行相關(guān)打印

接下來到.NET Core,此時(shí)將斷點(diǎn)放在析構(gòu)函數(shù)中,將不會再調(diào)用,打印如下:

好了,以上只是我個(gè)人猜測,接下來我們直接看官方文檔進(jìn)行論證,官網(wǎng)對于析構(gòu)函數(shù)鏈接

析構(gòu)函數(shù)規(guī)范

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/destructors

在.NET Framework應(yīng)用程序中會盡一切合理努力在程序退出時(shí)調(diào)用析構(gòu)函數(shù)進(jìn)行清理(調(diào)用終結(jié)器方法),除非進(jìn)行手動抑制,但在.NET Core并不能完全保證此行為

通過調(diào)用Collect來強(qiáng)制進(jìn)行垃圾回收,但是在大多數(shù)情況下,應(yīng)避免此調(diào)用,因?yàn)檫@可能會導(dǎo)致性能問題。


為何出現(xiàn)如此差異呢?更詳細(xì)分析請參看鏈接:

.NET?Core析構(gòu)函數(shù)理解分析

https://github.com/dotnet/runtime/issues/16028

根據(jù)此鏈接表述,可以這樣理解:在.NET Core中不會在應(yīng)用程序終止時(shí)運(yùn)行終結(jié)器(針對可到達(dá)或不可到達(dá)的對象),根據(jù)建議,并不能保證所有可終結(jié)對象在關(guān)閉之前都將被終結(jié)。

由于上述鏈接原因存在,所以在ECMA的C#5.0規(guī)范削弱了這一要求,因此.Net Core并不會違反此版本規(guī)范

?????在應(yīng)用程序關(guān)閉前,.NET Framework會盡一切合理努力調(diào)用析構(gòu)函數(shù)即終結(jié)器進(jìn)行資源清理,但在.NET Core中并不能保證此行為,所以在ECMA 語言規(guī)范中削弱了這一要求

?????基于上述,在.NET Core中使用析構(gòu)函數(shù)并沒有實(shí)質(zhì)性意義

總結(jié)

以上是生活随笔為你收集整理的.NET Core/.NET 5.0 析构函数依然有效?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。