C#当构造函数中的对象发生更改时更新对象

时间:2016-09-28 19:32:59

标签: c# oop reference

我不确定如何以优雅的方式提出这个问题,所以在这里。我有这个类在其构造函数中接受一个类AbilityScores的实例。我想知道是否有某种方法可以使它如果传入的AbilityScores实例更新它将自动更新技能实例,如果它不需要更新技能实例,那就更好了更新技能中的属性abilityScores。

它可能与引用它有关,而不是像我在这里那样复制它,但我不确定。任何帮助表示赞赏。

class Skills
{
    AbilityScores abilityScores;
    List<SkillChecks> skillProficiencies;
    List<SkillChecks> skillExpertices;
    LevelAndLevelRelatedBonuses level;

    public Skills(AbilityScores abilityScores, List<SkillChecks> skillProficiencies, List<SkillChecks> skillExpertices, LevelAndLevelRelatedBonuses level)
    {
        this.abilityScores = abilityScores;
        this.skillProficiencies = skillProficiencies;
        this.skillExpertices = skillExpertices;
        this.level = level;
    }

    //Insert other methods here (not important at the moment)
}

1 个答案:

答案 0 :(得分:1)

您要求的是默认情况下对象引用的工作原理,假设AbilityScores是一个类。您的Skills类有一个引用到该AbilityScores实例。如果其他内容具有该引用并对该类起作用,则由于您具有相同的引用,因此将更新它。

来自c# documentation on reference types

  

C#中有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。对于引用类型,两个变量可以引用同一个对象;因此,对一个变量的操作可能会影响另一个变量引用的对象。对于值类型,每个变量都有自己的数据副本,并且对一个变量的操作不可能影响另一个变量(除了ref和out参数变量的情况,请参阅ref(C#Reference)和out参数修饰符(C#参考))。

     

以下关键字用于声明引用类型:   类   接口   代表

假设某些事情没有发生,默认情况下会发生这种情况。见this dotnet fiddle

using System;

public class Program
{
    public static void Main()
    {
        var scores = new AbilityScores() { Speed = 1, Durability = 1 };
        var skills = new Skills(scores);

        Console.WriteLine("Before change: " + skills.GetCurrentScores());

        scores.Speed = 2;
        scores.Durability = 0;

        Console.WriteLine("After change: " + skills.GetCurrentScores());

    }

}

public class Skills
{
    public AbilityScores abilityScores;

    public Skills(AbilityScores abilityScores)
    {
        this.abilityScores = abilityScores;
    }

    public string GetCurrentScores()
    {
        return "Speed: " + abilityScores.Speed + ", Durability: " + abilityScores.Durability;
    }


}

public class AbilityScores
{
    public int Speed {get; set;}
    public int Durability {get; set;}
}

输出:

Before change: Speed: 1, Durability: 1
After change: Speed: 2, Durability: 0