Xamarin Forms单例模式实现:全局变量共享方案求助
解决Xamarin.Forms全局单例变量的实现问题
嘿,我看你已经找对了方向——单例模式确实是实现Xamarin.Forms全局可调用变量的最优方案,不过你的代码还差几步才能跑起来,我帮你修正并优化一下:
先说说你现有代码的问题
Instance()方法没写完:new...后面缺少实例化语句,而且方法没有返回值,外部根本拿不到实例- 没有考虑线程安全:如果多个页面同时调用,可能会创建多个
Global实例,违背单例的初衷 - 用方法返回实例不如用属性更符合C#的编码习惯
修正后的完整单例实现
using System; namespace xamarin_forms { // sealed防止被继承,避免子类破坏单例结构 sealed class Global { // 要全局共享的变量,这里用string示例,你可以根据需求加其他类型 public string Test { get; set; } // 静态私有实例字段 private static Global _instance = null; // 线程锁,保证多线程环境下的实例唯一性 private static readonly object _lockObj = new object(); // 私有构造函数,禁止外部直接new private Global() { } // 用静态属性对外提供实例,比方法更直观 public static Global Instance { get { // 双重检查锁定,兼顾性能和线程安全 if (_instance == null) { lock (_lockObj) { if (_instance == null) { _instance = new Global(); } } } return _instance; } } } }
更简洁的懒加载写法(推荐)
如果你不需要手动控制实例初始化时机,还可以用C#的静态构造器特性,它会自动保证线程安全,代码更简洁:
using System; namespace xamarin_forms { sealed class Global { public string Test { get; set; } // 静态构造器,CLR会保证它只执行一次,且线程安全 static Global() { } // 直接静态初始化实例 private static readonly Global _instance = new Global(); private Global() { } public static Global Instance => _instance; } }
如何在任意页面调用
不管用哪种写法,在你的Xamarin.Forms页面里调用都很简单:
// 设置全局变量 Global.Instance.Test = "我是全局共享的内容"; // 获取全局变量 var globalValue = Global.Instance.Test;
这样你就能在任何页面里轻松访问和修改这个全局变量啦~
内容的提问来源于stack exchange,提问作者Marco Jr
相关产品推荐
相关产品推荐

