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

C#如何使特定变量引用的类实例不可修改?

解决方案

要实现你需要的效果——允许其他类访问实例属性但禁止修改,同时不限制变量重新赋值,核心是把可变的Rigidbody2D包装成只读视图对外暴露,避免外部直接拿到可变的实例引用。下面是具体实现方案:

步骤1:创建只读包装类与接口

先定义一个只包含可读属性的类型,用来封装Rigidbody2D的只读访问:

// 只读接口,定义允许外部访问的属性
public interface IReadOnlyRigidbody2D
{
    Vector2 Velocity { get; }
    // 可按需添加其他需要只读访问的属性,比如Position、Mass等
}

// 实现接口的包装类,持有真实的Rigidbody2D实例
public class ReadOnlyRigidbody2DWrapper : IReadOnlyRigidbody2D
{
    private readonly Rigidbody2D _originalRb;

    public ReadOnlyRigidbody2DWrapper(Rigidbody2D originalRb)
    {
        _originalRb = originalRb;
    }

    public Vector2 Velocity => _originalRb.velocity;
    // 按需添加其他只读属性的映射
}

步骤2:修改MetaRB类

让MetaRB不再直接暴露原始的Rigidbody2D,而是对外提供只读包装实例:

public class MetaRB
{
    private readonly Rigidbody2D _rb;
    private readonly IReadOnlyRigidbody2D _readOnlyRb;

    // 额外元数据
    
    public MetaRB(Rigidbody2D rigidBody)
    {
        _rb = rigidBody;
        _readOnlyRb = new ReadOnlyRigidbody2DWrapper(rigidBody);
    }

    // 对外暴露只读视图,禁止外部拿到可变实例
    public IReadOnlyRigidbody2D ReadOnlyRb => _readOnlyRb;

    // 内部如果需要修改Rigidbody2D,直接用私有字段_rb即可
    public void InternalModifyVelocity(Vector2 newVelocity)
    {
        _rb.velocity = newVelocity;
    }
}

步骤3:调整RigidBodyAccessor类

现在RigidBodyAccessor只能通过只读接口访问属性,无法修改:

public class RigidBodyAccessor
{
    public MetaRB metaRB;
    
    public RigidBodyAccessor(MetaRB metaRB)
    {
        this.metaRB = metaRB;
    }

    public void Access()
    {
        var velocity = metaRB.ReadOnlyRb.Velocity; // 正常允许访问
    }

    public void Modify()
    {
        // 此处会编译报错:IReadOnlyRigidbody2D没有Velocity的setter
        // metaRB.ReadOnlyRb.Velocity = Vector2.zero; 
    }
}

补充说明

  • 这种方式完全满足需求:RigidBodyAccessor可以重新赋值metaRB变量,但无法通过它修改内部的Rigidbody2D实例;
  • 如果需要扩展可访问的只读属性,只需要在IReadOnlyRigidbody2D和包装类中添加对应的getter即可;
  • 若不想额外定义接口,也可以直接把ReadOnlyRigidbody2DWrapper作为对外暴露的类型,效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:12:24