什么是{get; 组; 在C#中的语法?

我正在学习ASP.NET MVC,而且我可以阅读英文文档,但是我不太明白这段代码发生了什么事情:

public class Genre { public string Name { get; set; } } 

这是什么意思: { get; set; } { get; set; } { get; set; }

这是一个所谓的自动属性,本质上是下面的简写(类似的代码将由编译器生成):

 private string name; public string Name { get { return this.name; } set { this.name = value; } } 

所以据我了解{get; set;} {get; set;}是一个“自动属性”,就像@Klaus和@Brandon所说的是写一个“后台”属性的简写。 所以在这种情况下:

 public class Genre { private string name; // This is the backing field public string Name // This is your property { get {return name;} set {name = value;} } } 

但是如果你像我一样 – 大约一个小时之前 – 你真的不明白什么属性访问者是什么,而且你也不了解一些基本的术语。 MSDN是学习这样东西的好工具,但对于初学者来说并不总是容易理解。 所以我会试着在这里更深入地解释这一点。

getset访问者 ,这意味着他们可以访问私有字段中的数据和信息(通常来自后台字段 ),并且通常从公共 属性中访问 (如上例所示)。

不可否认的是,上面的陈述很混乱,所以我们来看一些例子。 假设这个代码是指音乐的types。 所以在课堂上,我们会想要不同types的音乐。 假设我们想要3种types:嘻哈,摇滚和国家。 要做到这一点,我们将使用的名称来创build该类的新实例

 Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre" //called g1. We'll create as many as we need (3) Genre g2 = new Genre(); Genre g3 = new Genre(); //Note the () following new Genre. I believe that's essential since we're creating a //new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why //it's there but I do know it's essential) 

现在我们已经创build了stream派类的实例,我们可以使用上面设置的“名称” 属性来设置stream派名称。

 public string Name //Again, this is the 'Name' property { get; set; } //And this is the shorthand version the process we're doing right now 

我们可以通过写下面的内容来设置'g1'的名字给Hip Hop

 g1.Name = "Hip Hop"; 

这里发生的事情有点复杂。 就像我之前说过的那样,从私人领域getset访问信息,否则您将无法访问。 get只能读取该私人领域的信息并将其返回。 set只能在该专用字段中写入信息。 但是通过拥有一个既有get又有set的属性,我们就可以完成这两个function。 并通过编写g1.Name = "Hip Hop"; 我们正在使用我们的Name属性中的set函数

set使用一个名为value的隐式variables。 基本上这意味着什么时候你看到“价值”内的任何时候,它是指一个variables; “价值”variables。 当我们写g1.Name =我们使用=来传入valuevariables,在这种情况下是"Hip Hop" 。 所以你基本上可以这样想:

 public class g1 //We've created an instance of the Genre Class called "g1" { private string name; public string Name { get{return name;} set{name = "Hip Hop"} //instead of 'value', "Hip Hop" is written because //'value' in 'g1' was set to "Hip Hop" by previously //writing 'g1.Name = "Hip Hop"' } } 

需要注意的是,上面的例子实际上并没有写在代码中。 这更像是一个假设的代码,代表了后台正在发生的事情。

所以,现在我们已经设置types的g1实例的名称,我相信我们可以通过写作而得名

 console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property //and returns the field 'name' which we just set to //"Hip Hop" 

如果我们跑这个,我们会在我们的控制台中获得"Hip Hop"

所以为了这个解释的目的,我还要完成输出的例子

 using System; public class Genre { public string Name { get; set; } } public class MainClass { public static void Main() { Genre g1 = new Genre(); Genre g2 = new Genre(); Genre g3 = new Genre(); g1.Name = "Hip Hop"; g2.Name = "Rock"; g3.Name = "Country"; Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name); } } 

输出:

 "Genres: Hip Hop, Rock, Country" 

那些是自动属性

基本上写一个支持领域的财产的另一种方式。

 public class Genre { private string _name; public string Name { get { return _name; } set { _name = value; } } } 

这是做这个的简短方法:

 public class Genre { private string _name; public string Name { get { return _name; } set { _name = value; } } } 

将数据成员公开为公共数据是一种快捷方式,因此您不需要显式创build私有数据成员。 C#将为您创build一个私人数据成员。

你可以公开你的数据成员而不使用这个快捷方式,但是如果你决定改变数据成员的实现来获得逻辑,那么你需要打破这个界面。 所以简而言之,这是创build更灵活的代码的捷径。

这是一个自动执行的属性 。

基本上它是一个捷径:

 class Genre{ private string genre; public void getGenre() { return this.genre; } public void setGenre(string theGenre) { this.genre = theGenre; } } //In Main method genre g1 = new Genre(); g1.setGenre("Female"); g1.getGenre(); //Female 

它是C#的一个自动实现的属性 。

他们是公共财产名称的访问者。

您将使用它们在stream派的实例中获取/设置该属性的值。

这是一个自动执行的属性。 它基本上是一种在C#中为类创build属性的简便方法,而不必为它们定义私有variables。 当获取或设置variables的值时,通常在不需要额外的逻辑时使用它们。

您可以阅读MSDN的自动实现的属性编程指南 。

这意味着如果你创build一个types为stream派的variables,你将能够作为一个属性访问该variables

 Genre oG = new Genre(); oG.Name = "Test"; 

这样{ get; set; } { get; set; } { get; set; }语法被称为自动属性,C#3.0语法

您必须使用Visual C#2008 / csc v3.5或以上版本进行编译。 但是,您可以编译与.NET Framework 2.0一样低的目标输出(无需运行时或支持此function的类)。

获取设置访问修饰符属性。 获取读取属性字段。 Set设置属性值。 获取就像只读访问。 设置就像只写访问。 要将该属性用作读取,必须使用get和set。

在Visual Studio中,如果你在一个类中定义了一个属性X ,并且你只想把这个类作为一个types来使用,那么在构build你的项目之后,你会得到一个警告: “字段X永远不会被分配给它,默认值“

通过添加一个{ get; set; } { get; set; } { get; set; }X属性,你不会得到这个警告。

另外在Visual Studio 2013和更高版本中,通过添加{ get; set; } { get; set; } { get; set; }您可以看到对该属性的所有引用。

在这里输入图像描述

  • get / set模式提供了一个允许在实例化类的属性实例的设置('set')或检索('get')期间添加逻辑的结构,当需要一些实例化逻辑属性。

  • 一个属性只能有一个“获取”访问器,这是为了使该属性为只读

  • 当实现一个get / set模式时,一个中间variables被用作一个容器,可以放置一个值并提取一个值。 中间variables通常以下划线作为前缀。 这个中间variables是私有的,以确保它只能通过get / set调用访问。 请参阅Brandon的答案,因为他的答案演示了实现get / set最常用的语法约定。

当属性出现在右侧时,调用Get(RHS)当属性出现在'='符号的左侧(LHS)时,调用Set

对于自动实现的属性,后台工作在幕后,不可见。

例如:

公共string日志{get; 组; }

而对于非自动实现的属性,后台字段是前期的,作为私有的作用域variables可见。

例如:

私人string日志;

公共string日志{得到{返回this.log; } set {this.log = value; }}

另外值得一提的是“getter”和“setter”可以使用不同的“后台”

如果你想设置属性使用这个代码:

 public string Name { get { if (validacao) return "Name Last Name"; else return "Name"; } }