如果我有一个对象,我只需要访问它的特定部分,我应该只传递那个特定部分还是应该传递整个对象?
就我而言,我正在使用 XNA 使用 C# 构建游戏,并且我需要访问“DrawLayer.cs”中 Camera 类的“边界”,该类绘制单个图层(假设由于视差而存在多个图层)游戏画面上。相机的“边界”作为以下属性存在:
public Rectangle Bounds { get { return onScreenCamera.Bounds; } }
该游戏是一款多人游戏,有一个摄像头,可以根据玩家的动作在玩家之间跳转,因此“onScreenCamera”引用了当前需要使用的摄像头。此外,根据您的播放器类型,相机的功能会有所不同,因此我制作了一个接口 ICameraSetup.cs,我正在讨论的相机实现了该接口。这是 ICameraSetup 接口:
interface ICameraSetup
{
Vector2 Position { get; }
Rectangle Bounds { get; }
void Update(GameTime pGameTime);
}
使用 DrawLayer.cs,我想像这样编写构造函数头(注意 Rectangle 是一个结构,这应该意味着它是一个值类型):
public DrawLayer(ref Rectangle pBounds)
然后使用构造函数调用,就像这样:
new DrawLayer(ref levelState.Camera.Bounds)
这只会将相机的边界传递给 DrawLayer.cs,但我似乎收到了这个错误:“属性 Game.Camera.ICameraSetup.Bounds 没有设置器。” 问题是,我不希望接口为 Bounds 声明一个 setter,因为唯一应该能够设置边界的类是 Camera 类,而 Bounds 的设置方式是通过上面提到的 camera 类中的私有变量,称为“onScreenCamera”。
但是,即使我将 Set 添加到 Bounds 属性,我仍然在 DrawLayer.cs 构造函数调用时收到此错误:“'ref' argument is not分类为变量。”
现在,我知道一种可行的解决方案是将整个相机传递到 DrawLayer.cs 并从那里使用边界,如下所示:
public DrawLayer(ICameraSetup pCamera)
然后
new DrawLayer(levelState.Camera)
然后使用Camera.Bounds,但这似乎没有必要,因为我需要的只是该类中的边界。
我可能遇到的另一个问题是我对传递引用的理解。我理解当您需要一个值类型引用以随时更新您传递给它的类之外的值所做的任何更改时,它很有用,但我也读到它是相反的:使用它在最初声明的位置之外更改值类型并使其保持不变。
那么我在将相机边界传递到 DrawLayer 时是否犯了一个错误?