繁体   English   中英

带数组的C#结构

[英]C# struct with an array

我正在使用C#和XNA框架进行游戏。 播放器是屏幕上的2D士兵,用户可以发射子弹。 项目符号存储在数组中。 我研究了为此使用列表和数组,我得出的结论是,数组对我来说要好得多,因为会有很多子弹同时发射并被销毁,我读过列表无法解决的问题很好

在阅读了XNA论坛上的一些帖子后,这引起了我的注意: http : //forums.xna.com/forums/p/16037/84353.aspx

我创建了一个像这样的结构:

// Bullets
struct Bullet
{
    Vector2 Position;
    Vector2 Velocity;
    float Rotation;
    Rectangle BoundingRect;
    bool Active;
}

然后我像这样制作数组:

Bullet[] bulletCollection = new Bullet[100];

但是,当我尝试执行以下代码时:

    // Fire bullet
    if (mouseState.LeftButton == ButtonState.Pressed)
    {
        for (int i = 0; i < bulletCollection.Length; i++)
        {
            if (!bulletCollection[i].Active)
            {
                // something
            }
        }

我收到以下错误:

由于其保护级别,无法访问“ Zombie_Apocalypse.Game1.Bullet.Active”

谁能伸出援手? 我不知道为什么会弹出此错误,或者即使我正确声明了数组还是其他任何内容……也因为XNA论坛上的帖子没有对此进行详细介绍。

感谢您提供任何帮助。 :)

我相信C#默认将成员设为私有,因此您只需要将Active为公共字段即可:

public bool Active;

更为可取的是将其设置为具有公共get访问者的属性,并将set私有:

public bool Active { get; private set; }

更新 (对于那些刚刚遇到此问题的人):

或者,使用readonly字段来达到此目的可能是一个更好的主意(无论是为了获得更好的性能还是在游戏开发人员的同事中少打招呼):

public readonly bool Active;

在后一种情况下,您需要在类型的构造函数中设置Active的值。

我最初是从非游戏开发者的角度回答这个问题的,所以这个答案(就像您在此处或在互联网上其他地方所读到的任何内容)都应引起关注。 我坚持认为,使用属性在字段上隐藏设置器(无论是在结构还是在类中)在典型应用程序中都是有意义的。 其他人留下的评论使我相信,将属性包装在属性中并不是游戏的规范(出于可理解的性能考虑); 因此您可以放心地忽略我的最终建议。

尝试添加public

public struct Bullet
{
    public Vector2 Position;
    public Vector2 Velocity;
    public float Rotation;
    public Rectangle BoundingRect;
    pubilc bool Active;
}

默认情况下,C#将所有类成员设为私有-您需要指定访问修饰符:

public struct Bullet
{
  public Vector2 Position;
  public Vector2 Velocity;
  public float Rotation;
  public Rectangle BoundingRect;
  public bool Active;
}

我相信将struct本身公开是必要的,因为结构字段默认为public而类字段默认为private 但是,正如其他人所建议的那样,明确地将您的字段公开是一种好习惯:写下您的意思,而不是让语言为您假设! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM