C#如何在类中将类变量引用另一个值

3

我有以下简化的类:

public class Foo
{
     public DateTime dateOfBirth {get; set;}
     public Age age {get; set;}
}

年龄Age如下:

Public class Age
{
     public DateTime dateOfBirth {get; set;}    
     //..Calculate age here
}

现在,我希望当用户执行以下操作时,Foo.Age.dateOfBirth自动等于Foo.dateOfBirth,例如:
var Foo foo = new Foo();
foo.dateOfBirth = //..whatever

注意,这不能在构造函数中完成,因为用户可能不会在构造函数中设置Dob,而且这也无法覆盖Dob更改的情况。

它需要是对dateOfBirth变量的直接引用。

这可行吗?


有趣。如果age是公共的,为什么你想要有第二个dateOfBirth等于age.dateOfBirth呢?你不喜欢打长变量名吗? - JHBonarius
@J.H.Bonarius 这只是为了举例而已。出生日期储存在类内的另一个变量中,我会使用它来设置出生日期并计算年龄在Age类中。 - Alex
4个回答

3
你应该将Foo中的setter与Age中的setter链接起来。 尝试这样做:
public class Foo
{
 public DateTime dateOfBirth {
     get { return Age.dateOfBirth; }
     set { Age.dateOfBirth = value; }
 }
 public Age age {get; set;}

 public Foo() { Age = new Age(); }
}

3

实现 dateOfBirth 的 getter 和 setter 方法来使用 Age 属性。与大多数其他答案不同,这个方法将确保此属性始终为 != null,并且两个 DateOfBirth 属性始终保持一致:

public class Foo
{
     public DateTime dateOfBirth
     {
         get{ return Age.dateOfBirth; }
         set{ Age.dateOfBirth = value; }
     }

     private readonly Age _age = new Age();
     public Age Age { get{ return _age; } }
}

3

您可以使用setter方法:

public class Foo
{
    private DateTime _dateOfBirth;

    public DateTime DateOfBirth
    {
        get { return _dateOfBirth; }
        set {
            _dateOfBirth = value;
            if(Age != null)
               Age.DateOfBirth = value;
        }
    }

    public Age Age { get; set; }
}

如果您想让"DateOfBirth"属性依赖于"Age"属性,那么更容易的方法是使用C#6中的表达式体只读属性。具体请参阅此链接:C#6
public class Foo
{
    public DateTime DateOfBirth => Age?.DateOfBirth ?? DateTime.MinValue;
    public Age Age { get; set; }
}

1
这个解决方案(较长的那一个)允许设置Age.DateOfBirth,从而破坏了一致性。然而我更喜欢短的那一个。 - wkl

2

是的,通过使用以下代码应该是可能的:

public class Foo
{
     private DateTime _dateOfBirth;

      public DateTime dateOfBirth
      {
        get
        {
            return _dateOfBirth;
        }
        set
        {
            _dateOfBirth = value;
            this.Age.dateOfBirth = value;
        }
     }
     public Age age {get; set;}
}

1
此解决方案允许设置 Age.DateOfBirth,从而破坏一致性。 - wkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接