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

C#当构造函数中的对象发生更改时更新对象,c#,oop,reference,C#,Oop,Reference,我不知道如何优雅地问这个问题,所以这里。我有一个类,它在构造函数中接受一个类AbilityScores的实例。我想知道是否有某种方法可以使它这样,如果传入的AbilityScores实例被更新,它将自动更新Skills实例,或者如果它不必更新Skills实例,而只更新Skills中的属性AbilityScores,那么它会更好 它可能与引用它有关,而不是像我在这里所做的那样复制它,但我不确定。感谢您的帮助 class Skills { AbilityScores abilityScore

我不知道如何优雅地问这个问题,所以这里。我有一个类,它在构造函数中接受一个类AbilityScores的实例。我想知道是否有某种方法可以使它这样,如果传入的AbilityScores实例被更新,它将自动更新Skills实例,或者如果它不必更新Skills实例,而只更新Skills中的属性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)
}
课堂技能
{
能力核心能力核心;
列出技能熟练程度;
列出技能技能;
level和levelrelated奖金级别;
公共技能(能力核心能力核心、列出技能熟练程度、列出技能经验、级别和级别相关奖金级别)
{
this.abilityScores=abilityScores;
this.skillProficiencies=skillProficiencies;
this.skillexperties=skillexperties;
这个水平=水平;
}
//在此处插入其他方法(目前不重要)
}

假设
AbilityScores
是一个类,那么您需要的是对象引用在默认情况下是如何工作的。您的
技能
类引用了该
能力核心
实例。如果其他对象具有该引用并作用于该类,因为您对该类具有相同的引用,它将被更新

发件人:

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

以下关键字用于声明引用类型: 班 接口 委派

假设没有发生奇怪的事情,默认情况下应该发生。看

输出:

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

除非
AbilityScores
是一个结构,否则您是在引用它,而不是复制它。类是引用类型,因此您可以在
Skills
中引用
AbilityScores
对象“如果它不必更新Skills实例,只需更新Skills中的属性AbilityScores”
-这就是您让我感到困惑的地方。您能否具体描述您看到的行为,它是如何不正确的,并显示产生该行为的代码?您正在引用它。如果对引用的是同一个实例有疑问,请使用“.GetHashCode”方法并比较它们。@Jay实际上应该使用
ReferenceEquals
来查看引用是否相等,因为
GetHashCode
可以被覆盖。@DStanley你说得对。。如何用skills对象而不是scores obj更新scores值?
Before change: Speed: 1, Durability: 1
After change: Speed: 2, Durability: 0