FBrowserCEF3Lib浏览器开发技术交流网址

 找回密码
 立即注册
查看: 518|回复: 1

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

[复制链接]

签到天数: 467 天

[LV.9]以坛为家II

79

主题

416

回帖

79万

积分

管理员

皇冠皇冠皇冠皇冠太阳太阳

积分
798316

优秀会员永久VIP会员活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老荣耀会员精华大师大富翁

发表于 2026-4-20 15:45:09 | 显示全部楼层 |阅读模式
C#源码分享
开发平台: C#
使用框架: FBrowserCEF3
代码类型: 源码
界面截图: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

示例一:
[C#] 查看源码 复制代码
        private void 载入地址ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (FBroSharpFrame frame = (FBroSharpFrame)BrowserList.data[0].GetMainFrame())
            {
                frame.LoadURL("https://www.qq.com");
            }  
        }


示例二:
[C#] 查看源码 复制代码
        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的方法

[C#] 查看源码 复制代码
        private void 载入地址ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FBroSharpFrame frame = (FBroSharpFrame)BrowserList.data[0].GetMainFrame();
            frame.LoadURL("https://www.qq.com");
            frame.Dispose();//释放资源
        }


二、深浅拷贝的区别,其实说简单点,浅拷贝就是引用,原变量如果释放了,赋值后的变量也会一起释放,而深拷贝就是完全复制,原变量即使释放了,复制后的变量还是会存在不会释放
[C#] 查看源码 复制代码
        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#的一点心得,分享出来,如有误,欢迎指正


评分

参与人数 1金钱 +10 贡献 +10 收起 理由
mosheng + 10 + 10 很给力!

查看全部评分

签到天数: 1 天

[LV.1]初来乍到

0

主题

5

回帖

31

积分

新手上路LV4

月亮星星

积分
31
发表于 2026-5-10 12:05:56 | 显示全部楼层
safsdgsdghsfdhfhfdhfdh
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们 在线手册 视频教程 赞助支持 CEF官网 易语言官网 火山开发官网
拒绝任何人以任何形式在本网站发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表本网站立场!

网址帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!

Archiver| 手机版| 小黑屋| 联系QQ:283987887 劰载中...

Powered by Discuz! X5.0 GMT+8, 2026-9-17 07:32 , Processed in 0.046490 second(s), 13 queries , Redis On.

 川公网安备51090302000262 蜀ICP备2023034329号
快速回复 返回顶部 返回列表