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

如何将C#对象属性设为数组元素的引用?字符串引用问题

字符串引用类型赋值的逻辑误区与实现方案

问题场景

我尝试将对象属性的值指向后续会被赋值的数组元素,编写了如下C#代码:

using System;

public class HelloWorld
{
    private static string[] s = new string[] { null };
    
    public static void Main(string[] args)
    {
        var a = new A();
        a.Value = s[0];
        Console.WriteLine ("value bef = " + a.Value);
        s[0] = "test";
        Console.WriteLine ("value aft = " + a.Value);
    }
    
    public class A
    {
        public string Value { get; set; }
    }
}

实际运行输出

value bef = 
value aft = 

预期输出

value bef = 
value aft = test

我原本认为C#中字符串是引用类型,修改数组元素后对象属性值应该同步更新,但实际逻辑不生效。想知道原因,并且在不将A.Value改为类类型或s改为A类型数组的前提下,有没有实现该需求的方法?


问题原因

虽然字符串是引用类型,但你对引用类型赋值的逻辑理解存在误区:

  • 执行a.Value = s[0]时,是把s[0]当前的引用值(此时为null)复制给了a.Value,两者只是持有同一个引用的副本,并非绑定到同一个存储位置。
  • 后续执行s[0] = "test"时,是把s[0]的引用改成了指向新的字符串对象"test",但a.Value仍然持有原来的null引用,所以不会同步更新。

简单来说:引用类型的赋值是复制引用,不是让两个变量绑定到同一个存储位置。而字符串的不可变性也加剧了这个误解——即使字符串可变,修改s[0]指向的对象内容会让a.Value看到变化,但这里是直接替换了s[0]的引用,而非修改对象本身的内容。


解决方案(满足限制条件)

要实现"对象属性随数组元素更新而同步"的需求,在不修改A.Value类型和数组s类型的前提下,可以通过封装获取数组元素的委托来实现,让A的属性每次访问时都去读取数组的当前值:

修改后的代码如下:

using System;

public class HelloWorld
{
    private static string[] s = new string[] { null };
    
    public static void Main(string[] args)
    {
        var a = new A(() => s[0]);
        Console.WriteLine("value bef = " + a.Value);
        s[0] = "test";
        Console.WriteLine("value aft = " + a.Value);
    }
    
    public class A
    {
        private readonly Func<string> _valueGetter;
        
        public A(Func<string> valueGetter)
        {
            _valueGetter = valueGetter;
        }
        
        public string Value => _valueGetter();
    }
}

运行输出

value bef = 
value aft = test

原理是:A类不再存储字符串的引用副本,而是持有一个可以获取数组当前元素的委托。每次访问Value属性时,都会执行委托去读取s[0]的最新值,从而实现同步更新的效果。

内容的提问来源于stack exchange,提问作者kovac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:54:51