You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:45:45