我在C#中制作太空入侵者游戏,使用Bitmap
来存储入侵者,炸弹等的图像。
让我感到困惑的是:
我有一个抽象类GameObject
代表游戏中的简单元素:
protected Bitmap image;
protected Rectangle bounds;
protected Rectangle movementBounds;
public GameObject(ref Bitmap image, Point position, Rectangle movementBounds)
{
this.image = image;
this.bounds = new Rectangle(position, new Size(image.Width, image.Height));
this.movementBounds = movementBounds;
}
比代表ShieldSegment
的单个正方形的Shield
类,其中包含四个不同损坏阶段的图像:
private int timesHit = 0;
private IList<Bitmap> alternateImages = new List<Bitmap>();
public ShieldSegment(ref List<Bitmap> images, Point position, Rectangle movementBounds)
: base(ref images.First(), position, movementBounds)
{
alternateImages = images;
}
一个Shield
类,它将整个盾牌表示为一个段列表:
private IList<ShieldSegment> segments = new List<ShieldSegment>();
//fill, upper left, upper right, lower left, lower right
public Shield(ref List<List<Bitmap>> images, Point position, Size imageSize)
{
//upper row
Point startPosition = position;
segments.Add(new ShieldSegment(ref images.ElementAt(1), startPosition,new Rectangle(startPosition, imageSize)));
startPosition.X += imageSize.Width;
segments.Add(new ShieldSegment(ref images.ElementAt(0), startPosition,new Rectangle(startPosition, imageSize)));
startPosition.X += imageSize.Width;
segments.Add(new ShieldSegment(ref images.ElementAt(0), startPosition, new Rectangle(startPosition, imageSize)));
startPosition.X += imageSize.Width;
segments.Add(new ShieldSegment(ref images.ElementAt(2), startPosition, new Rectangle(startPosition, imageSize)));
//middle row
startPosition = position;
startPosition.Y += imageSize.Height;
...
我需要将列表元素作为引用传递,因为(对不起,如果我错了)将每个段和屏蔽重新存储图像将是浪费。将单个引用传递给Bitmap
时,它可以正常工作,但我得到a ref or out argument must be an assignable variable
有什么办法吗?
答案 0 :(得分:3)
List
是参考类型。这意味着List
变量本身的值images
是一个参考。您可以在没有ref
的情况下传递它!
请注意不要将其视为函数中的out
参数。例如,不要使用images
将内容分配给images = new List...
这将无效。
答案 1 :(得分:3)
我需要将列表元素作为引用传递
你真的不清楚这里。列表引用仅在默认情况下按值传递,但必要时通过引用传递。当您访问列表时,您将获得一个参考。但是,这段代码:
public ShieldSegment(ref List<Bitmap> images, Point position,
Rectangle movementBounds)
: base(ref images.First(), position, movementBounds)
{
alternateImages = images;
}
建议您可能无法理解参数传递在.NET中如何工作:
images
参数的值,因此您无需使用ref
ref
与作为方法调用结果的参数一起使用是没有意义的......你期望做什么?我建议您阅读我的article on it以及我在reference types and value types上的文章,该文章应该澄清一切。