C# 跨类对象

标签 c#

我正在开发非常简单的 Roguelike 游戏(仅供我自己使用)并有一个问题:

由于不可能创建可以从我的程序的任何类访问的跨类结构对象(游戏案例中的实体),那么使用什么来创建跨类对象?我正在考虑将所有新创建的对象(实体)存储在静态对象数组中,但我想这个问题有更简单的解决方案。

问题本身:如何使用自己的属性创建跨类可访问对象?

谢谢大家,我找到了我要找的东西。

最佳答案

您似乎尝试在不同的类之间传递值类型(struct),并且您注意到当您更新一个位置的值时,它不会更改另一个位置的值。

这是 value types and reference types 之间的基本区别.

如果您自己创建struct,您可能希望将其定义为类。

如果没有,您可以将所有结构包装在一个类中,并将该类作为状态对象传递。

如果您拥有的只是相同类型结构的列表(例如 Points),则只需传递列表本身即可。 C# 集合作为类实现。

public class GameState
{
    public Point PlayerLocation { get; set; }
    public List<Point> BulletPoints { get; set; }
    public double Health { get; set; }
}

现在您可以创建一个 GameState 并将其传递给不同的类:

public class Game
{
    private GameState _state = new GameState();
    private BulletUpdater _bulletUpdater = new BulletUpdater();

    public void Update()
    {
        _bulletUpdater.UpdatePoints(_state);

        // Points have now been modified by another class, even though a Point is a struct.
    }
}

public class BulletUpdater
{
    public void UpdatePoints(GameState state)
    {
        for (int i = 0; i < state.BulletPoints.Count; i++)
        {
            Point p = state.BulletPoints[i];
            state.BulletPoints[i] = new Point(p.X + 1, p.Y + 1);
        }
    }
}

只要记住上面的代码,如果我要写:

Point p = state.BulletPoints[i];
p.X += 1;
p.Y += 1;

这不会影响原来的观点!当您从列表或类中读取值类型时,仅将值复制到局部变量中。因此,为了反射(reflect)对存储在引用类型中的原始对象的更改,您需要像这样覆盖它:

state.BulletPoints[i] = p;

同样的原则也是为什么以下内容也不起作用的原因:

state.PlayerLocation.X += 5; // Doesn't do anything
state.PlayerLocation.Y += 5; // Also doesn't do anything

在这种情况下,编译器会告诉你你做错了什么。您仅修改属性的返回值,而不是支持字段本身。你必须这样写:

state.PlayerLocation = new Point(state.PlayerLocation.X + 5, state.PlayerLocation.Y + 5); // This works!

关于C# 跨类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19592466/

相关文章:

c# - 使用bindingsource c#将图片从图片框保存到数据库

c# - 通过代码,我怎样才能让硬盘驱动器进入休眠状态

c# - 解析以所需格式 C# 上传到内存的 .txt 文件中的文本

c# - 使多个控件使用相同的工具提示消息(c# 客户端应用程序)

c# - 无符号整数的一元取反

c# - Guid 构造函数在明显有效的字符串上抛出 formatException

c# - 从其基类调用继承的方法

c# - 无法运行程序,因为它要求我附加进程

c# - 一个接收 PictureBox 和 String 的方法,两者都在里面定义,但最后 String 将为空

c# - 根据年份在 View 中呈现不同的表格