posts - 206,  comments - 26,  views - 17万
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

线程栈 stuck:存值类型,和引用类型的引用  先进后出,链表形式,连续摆放 CLR(公共语言运行库(Common Language Runtime))启动进程,main函数为一个线程入口

进程堆heap:存引用类型 进程中的一块区域

IL:中间语言

对象的属性为值类型出现在堆里,方法里的值类型,由进程调用,出现在栈里

 

复制代码
    /// <summary>
    /// class  引用类型
    /// </summary>
    public class ReferenceTypeClass
    {
        private int _valueTypeField;//堆:因为对象都在堆里,对象里面的属性也在堆里
        public ReferenceTypeClass()
        {
            _valueTypeField = 0;
        }
        public void Method()
        {
            int valueTypeLocalVariable = 0;//栈:全新的局部变量,线程栈来调用方法,然后分配内存
            new Process();//new对象,分配在堆里
        }
    }
复制代码

 装箱拆箱(仅仅是说内存的拷贝动作):内存copy 也会浪费性能  通常都是因为object,

 装箱拆箱只能发生在父子类里面, 因为这样你才能转换呀

dynamic 是引用类型的语法糖

复制代码
                string student = "123";
                string student2 = student;

                Console.WriteLine(student); //123
                Console.WriteLine(student2);//123

                student2 = "APP";
              
                Console.WriteLine(student);//123
                Console.WriteLine(student2);//APP            
复制代码
     string student = "大山";
                string student2 = "APP";//共享
                student2 = "大山";
                Console.WriteLine(object.ReferenceEquals(student, student2));//true 竟然一样
                //就是同一个  享元模式 CLR内存分配字符串的时候,会查找相同值,有就重用了

 

 托管资源:.Net  New的类,出了作用域就访问不到了,自动释放了,存放在进程堆中的资源; 值类型变量,存放在进程栈中,出了作用域就是放了,

非托管资源:访问数据库,操作Excel,Word什么的.

 

析构函数 ~Class() 见下图

复制代码
    public class Class : IDisposable
    {
        public int ClassId { get; set; }
        public string ClassName { get; set; }
        ~Class()
        {
            MyLog.Log($"执行{this.GetType().Name}Dispose");
        }
        public void Dispose()
        {
            MyLog.Log($"执行{this.GetType().Name}Dispose");
        }
    }
复制代码

 

 主要是用来释放非托管资源,等着GC去把非托管资源释放掉 系统自动执行
 GC.Collect();//主动GC(释放资源) GC回收的时候,CLR一定调用析构函数

Dispose() 也是释放非托管资源的,主动释放,方法本身是没有意义的,我们需要在方法里面实现对资源的释放
GC不会调用,而是用对象时,使用者主动调用这个方法(using),去释放非托管资源

总结:

1.循环New100个对象,出了作用域,就访问不到了,没有引用,.Net GC就释放了,但少New对象,创建对象需要内存开辟空间

2.实现Idispose() 接口的 使用Using 或调用dispose() 方法

3.操作Word或Excel 的时候 时候需要注意释放资源

前一段时间做了一个小程序,Word批量转PDF,运行的时候内存持续增加,加上释放资源就好了,见下图

复制代码
   /// <summary>
        /// word 操作类
        /// </summary>
        Microsoft.Office.Interop.Word.Application application =  new Microsoft.Office.Interop.Word.Application();
        /// <summary>
        ///word 转换成pdf
        /// </summary>
        /// <param name="sourcePath"></param>
        /// <param name="targetPath"></param>
        /// <returns></returns>
        public bool WordToPDF(string sourcePath, string targetPath)
        {

            bool result = false;

            Microsoft.Office.Interop.Word.Document _document = null;
            // application.
            try
            {
                application.Visible = false;
                _document = application.Documents.Open(sourcePath);
                _document.ExportAsFixedFormat(targetPath,
                    Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);
                result = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                result = false;
            }
            finally
            {
                var doc_close = (Microsoft.Office.Interop.Word._Document)_document;
                if (doc_close != null)
                {
                    doc_close.Close();
                }
                else
                {
                    result = false;
                }

                // _document.Close();
            }
            return result;
        }
复制代码

 

4.访问数据库的时候还没看

 

posted on   努力--坚持  阅读(879)  评论(2编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示