将`List <list <bitmap>&gt;`作为ref </list <bitmap>传递

时间:2012-04-03 17:39:42

标签: c# list ref

我在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 有什么办法吗?

2 个答案:

答案 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上的文章,该文章应该澄清一切。