初始化复杂的对象

时间:2015-08-07 06:36:00

标签: c# class initialization

编辑:主要问题 - 初始化非常嵌套的对象的最佳方法是什么我可以在类中添加任何我无法更改的内容。

在我的项目中,我有一个非常复杂的对象进行初始化,将来我将不得不初始化100个不同的实例。我想问你什么是最好的初始化方法,因为我永远不需要完全初始化。

public class PassivePowerUp
{
    public string name = "";               //powerup name to display
    public string description = "";        //description to display at runtime
    public Image icon = null;             //icon sprite
    public Sprite defaultSprite = null;    //icon sprite name on unlock
    public Sprite enabledSprite = null;    //icon sprite name on purchase
    public Image onEnabledIcon = null;    //additional sprite to show on purchase
    public bool locked = false;            //whether this powerup is locked (requirements)
    public bool enabled = false;           //whether the user bought this powerup
    public float[] cost;
    public PassiveTowerPowerUp towerProperties;
    public PassiveEnemyPowerUp enemyProperties;
    public PassivePlayerPowerUp playerProperties;
.
.
.
}

哪里

public class PassivePlayerPowerUp
{
    public Health health;
    public Resources resources;

    //Game variables
    [System.Serializable]
    public class Health
    {
        public bool enabled;
        public float value;
        public float interval;
        public TDValue type;
    }

    [System.Serializable]
    public class Resources
    {
        public bool enabled;
        public float[] value;
        public float interval;
        public TDValue type;
        public CostType costType;
    }
}

PassiveTowerPowerUp甚至比PassivePlayerPowerUp大3倍。

原来这些字段是在Unity编辑器中初始化的,所以这不是问题,但现在我需要从代码中创建和初始化它们。

public PassiveTowerPowerUp towerProperties;
public PassiveEnemyPowerUp enemyProperties;
public PassivePlayerPowerUp playerProperties;

实际上只会有一个初学者

2 个答案:

答案 0 :(得分:0)

在C#中,您不需要使用默认值初始化字段,这由编译器自动完成。

  • 任何引用类型(class)字段都将自动设置为null
  • 任何值类型(struct)字段都将设置为默认值。

有关完整参考,请参阅MSDN: Default Values Table (C#)

所以你可以改变例如:

public Image onEnabledIcon = null;
public bool locked = false;

为:

public Image onEnabledIcon;
public bool locked;  

为了设置其他值,我要么对它们进行硬编码,要么实现一个加载机制来获取其他值。一个XML文件,其中包含字段的名称和值。

答案 1 :(得分:0)

通常,您不必使用默认值设置属性。

默认值

Numeric Types => (0)或等效值取决于类型(0.0)

对于Strings和所有Reference Types => null

bool => false

加号您可以在声明中初始化类成员变量,如:

  public string name = "DesiredValue";  
  public bool locked = true;    

或者您可以在构造函数中初始化它们,如:

 public string name ;
 public bool locked ;

 public PassivePowerUp()
        {
              name = "DesiredValue";  
              locked = true;    
        }

最后如果值可能会从对象更改为另一个,那么您可以使用parameterized constructor之类的

   public string name ;
   public bool locked ;

   public PassivePowerUp(string name , bool locked)
          {
                this.name = name;
                this.locked = locked;    
          }