Xamarin.Android中常量字符串是否分配Java字符串?能否避免额外分配?
Xamarin.Android 字符串赋值相关问题解答
问题1:运行时是否会分配Java字符串并存储"Hello"?
是的,会分配Java字符串。Xamarin.Android是.NET运行时与Android Java运行时的桥接层,C#字符串和Java的java.lang.String属于两个独立运行时的对象,无法直接复用。当执行label.Text = "Hello"时,绑定层会自动将C#字符串转换为对应的Java字符串对象,这个转换过程会在Java堆上分配新的java.lang.String实例。
问题2:若会分配,是否有办法避免额外分配?有没有类似C#字符串驻留的机制?
Xamarin.Android没有默认提供和C#字符串驻留池完全对应的自动Java字符串复用机制,但可以通过以下方式避免重复分配:
手动缓存Java字符串:
创建静态缓存容器存储已转换的Java字符串,后续赋值时优先从缓存取用。示例代码:private static readonly Dictionary<string, Java.Lang.String> _javaStringCache = new Dictionary<string, Java.Lang.String>(); public static Java.Lang.String GetCachedJavaString(string csharpString) { if (_javaStringCache.TryGetValue(csharpString, out var javaString)) return javaString; var newJavaString = new Java.Lang.String(csharpString); _javaStringCache[csharpString] = newJavaString; return newJavaString; } // 使用时直接赋值Java字符串,跳过转换 label.TextFormatted = GetCachedJavaString("Hello");使用Android资源字符串:
将常量字符串存入res/values/strings.xml:<string name="hello">Hello</string>通过
Resources.GetString(Resource.String.hello)获取时,Android系统会自动复用同一资源ID对应的Java字符串实例,避免重复分配。预创建静态Java字符串常量:
对固定常量提前在静态初始化时创建Java字符串,后续直接复用:private static readonly Java.Lang.String _helloJavaString = new Java.Lang.String("Hello"); // 使用时直接赋值 label.TextFormatted = _helloJavaString;
内容的提问来源于stack exchange,提问作者JamesL
相关产品推荐
相关产品推荐

