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
相关产品推荐
相关产品推荐

