理解Get和Set访问器

5

我是一名初学者,正在尝试学习C#的基础知识。这可能听起来很琐碎,也许很愚蠢,但这是一个疑问。在查看应用程序的源代码时,我看到一个类中的一段代码:

private string fname;
public string FirstName
{
    get
    {
       return fname
    }
    set
    {
       fname = value;
    }
}

有人能告诉我这是什么意思吗?我理解,我们声明一个类时,使用别名 FirstName 访问 fname 。 如果这是出于某种安全目的,那么是为什么呢?


1
请查看有关属性的文章 - http://msdn.microsoft.com/zh-cn/library/x9fsa0sw.aspx - alex
3
我认为iBlue因为不知道而仅仅是询问应该不应该被贬低分数有点不妥。 - user1945782
@Westie的标题不太好,这往往会吸引快速的踩票。 - psubsee2003
可能是 C# 中的属性 的重复问题。 - Roman C
5个回答

6

这段代码也等同于:

public string FirstName { get; set; }

这段代码定义了一个属性。在C#中,属性为私有字段提供了封装。

1
作为后续,这也提供了一个位置来添加验证(例如防止名字被分配为空值,确保它始终是小写等)。 - Brad Christie
但是编译器如何知道FirstNamefname相对应呢?谢谢。 - Sabuncu
仅有公共字符串FirstName;与仅有公共字符串FirstName;之间的区别是什么? - RollRoll
同时,您可以通过仅使用 { get; } 来指定属性对公共只读,并且仍然能够在类内部进行设置。 - JonP

3
您可以在属性上编写自定义逻辑,例如进行一些验证操作:

public string FirstName
{
    get
    {
       return fname;
    }
    set
    {
       if (value.Count(s => Char.IsDigit(s)) > 0)
       {
           throw new Exception("Only letters allowed");
       }
       fname = value;
    }
}

你已经表达了观点,但让我们提醒人们,调用IEnumerable方法时不需要调用ToCharArray - ChaosPandion
好的...我明白了,但是如果代码像这样 public string FirstName { get; set; },你该如何实现它呢? - iJade
@iBlue 简单属性和字段没有区别。您也可以查看此链接:https://dev59.com/mHE95IYBdhLWcg3wSb_P - Farhad Jabiyev

2

fname是一个字段,具有私有可见性,但FirstName是公共属性,因此它将在类外部可见,并且可以包含get和set方法中的逻辑。


0

它被称为属性(MSDN文章)。使用它们的原因是封装访问某些类字段,以便在将来需要时轻松更改类行为。

这也等同于所谓的自动属性,因为此时该属性不添加任何逻辑:

public string FirstName { get; set; }

0

获取和设置方法被称为访问器(getters)和修改器(setters),这些方法用于访问和修改对象的属性,而不允许从类外部进行访问。请注意变量fname的访问修饰符是private,这意味着它只能被类内的任何方法访问。

请注意,通常应该给予get和set方法public访问修饰符,以使该方法能够从任何外部类进行访问。


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