admin 发表于 2026-4-20 15:45:09

【FBroSharp】大部分人容易忽略的C#局部变量的安全写法以及深浅拷贝的区别

一、在局部变量使用using,会在局部变量离开作用域后立即释放,不用等待GC,且可避免异常异常时候的资源泄露,是C#常用写法之一,本框架也一样支持,简单示例如下:

示例一:
      private void 载入地址ToolStripMenuItem_Click(object sender, EventArgs e)
      {
            using (FBroSharpFrame frame = (FBroSharpFrame)BrowserList.data.GetMainFrame())
            {
                frame.LoadURL("https://www.qq.com");
            }
      }

示例二:
      private void 创建URL请求ToolStripMenuItem_Click(object sender, EventArgs e)
      {
            using (FBroSharpRequest sharp_request = new FBroSharpRequest())
            {
                sharp_request.SetURL("https://api.fbrowser.site:8443/");
                sharp_request.SetMethod("GET");

                //添加协议头,这里用list添加,只添加了一个UA
                List<FBroSharpStringMap> heard_list = new List<FBroSharpStringMap>
                {
                  new FBroSharpStringMap
                  {
                        key = "User-Agent",
                        value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.438.400 QQBrowser/13.0.6071.400"
                  }
                };

                sharp_request.SetHeaderMap_Array(heard_list, false);

                // FBroSharpRequestContext sharp_request_context;
                URLEvent sharp_event = new URLEvent();
                FBroSharpURLRequest.Create(sharp_request, default, sharp_event, 123456);
            }
      }

示例三(不推荐):除非存在全局静态变量,需要手动释放,局部建议用using的方法

      private void 载入地址ToolStripMenuItem_Click(object sender, EventArgs e)
      {
            FBroSharpFrame frame = (FBroSharpFrame)BrowserList.data.GetMainFrame();
            frame.LoadURL("https://www.qq.com");
            frame.Dispose();//释放资源
      }

二、深浅拷贝的区别,其实说简单点,浅拷贝就是引用,原变量如果释放了,赋值后的变量也会一起释放,而深拷贝就是完全复制,原变量即使释放了,复制后的变量还是会存在不会释放
      public override bool OnBeforeBrowse(IFBroSharpBrowser browser, IFBroSharpFrame frame, IFBroSharpRequest request, bool user_gesture, bool is_redirect)
      {
            // 浅拷贝,当前作用域离开后fram会被释放,因此即使BrowserList.frame是在全局静态中也会被释放
            BrowserList.frame = (FBroSharpFrame)frame;

            // 深拷贝,当前作用域离开后fram一样会被释放,但是BrowserList.frame不会,但这里不用BrowserList.frame后要手动释放
            BrowserList.frame = new FBroSharpFrame(frame);

            return false;
      }
注意:
1.BrowserList.frame是存在全局静态类中,非局部变量;
2.本框架事件传递的browser做了特殊处理,即使不用深拷贝在浏览器未关闭前都会一直存在,在所有引用释放的前提下关闭浏览器后会自动释放(如果自行保存了到全局数组或深拷贝了的情况下要自行删除,否则依然存在引用无法及时释放);

以上是本人使用C#的一点心得,分享出来,如有误,欢迎指正


h3009nie 发表于 2026-5-10 12:05:56

safsdgsdghsfdhfhfdhfdh
页: [1]
查看完整版本: 【FBroSharp】大部分人容易忽略的C#局部变量的安全写法以及深浅拷贝的区别