速记访问器和修改器

17

我正在学习C#,并学习如何将字段设为私有,并使用Getter和Setter公开方法而不是字段值。

方法1方法2中的get; set;是否等同?例如,其中一个是另一个的简写吗?

class Student
{
    // Instance fields
    private string name;
    private int mark;

    // Method 1
    public string Name { get; set; }

    // Method 2
    public int Mark
    {
        get { return mark; }
        set { mark = value; }
    }
}

最后,当您想要在获取或设置值之前执行计算时,例如将值转换为百分比或执行验证时,是否会使用方法2?例如:

class Student
{
    // Instance fields
    private string name;
    private double mark;
    private int maxMark = 50;

    // Method 1
    public string Name { get; set; }

    // Method 2
    public double Mark
    {
        get { return mark; }
        set { if ( mark <= maxMark ) mark = value / maxMark * 100; }
    }
}

请查看这个答案,它详细展示了一些内容。 - Ken Kin
2个回答

15

是的,当您拥有自定义 getter 和 setter 函数时,Method2 是正确的方法。默认情况下,使用 Method1 时,会有一个默认的私有属性在内部处理。更多详细信息请参考此 URL

示例:

string _name;

public string Name 
{
    get => _name;
    set => _name = value;
}

有没有办法使用默认的私有属性,但手动设置它的getter或setter方法?此外,链接已失效。 - Aaron Franke
是的,方法是使用私有变量,并使用公共属性或函数进行获取和设置。我已经更新了一个有效的链接,并添加了一个小示例代码供参考。 - Saravanan

12

是的,方法1是方法2的快捷方式。建议默认使用方法1。当您需要更多功能时,请使用方法2。您也可以为获取和设置指定不同的访问修饰符。


1
啊,你的意思是我可以这样做 protected set { if ( mark <= maxMark ) mark = value / maxMark * 100; } 吗? - Gravy
2
请注意,Name getter/setter 不会返回/设置私有字符串名称,而是一个您无法直接访问的内部变量。 - Bikonja
1
谢谢,我说的没错吧,我不需要显式声明namemark字段 - 但我可以在类内部/外部引用NameMark方法,对吗? - Gravy
是的,没错。Name和Mark是自动属性,所以没有后备字段。你可以直接从类内引用它们。如果它们是公共的,你也可以从类外引用它们。 - Robin
@Robin 这是错误的。如果你从程序中删除 private int mark;,它会抛出错误。 - Aaron Franke

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