什么是{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是学习这样东西的好工具,但对于初学者来说并不总是容易理解。 所以我会试着在这里更深入地解释这一点。
get
和set
是访问者 ,这意味着他们可以访问私有字段中的数据和信息(通常来自后台字段 ),并且通常从公共 属性中访问 (如上例所示)。
不可否认的是,上面的陈述很混乱,所以我们来看一些例子。 假设这个代码是指音乐的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";
这里发生的事情有点复杂。 就像我之前说过的那样,从私人领域get
和set
访问信息,否则您将无法访问。 get
只能读取该私人领域的信息并将其返回。 set
只能在该专用字段中写入信息。 但是通过拥有一个既有get
又有set
的属性,我们就可以完成这两个function。 并通过编写g1.Name = "Hip Hop";
我们正在使用我们的Name属性中的set
函数
set
使用一个名为value
的隐式variables。 基本上这意味着什么时候你看到“价值”内的任何时候,它是指一个variables; “价值”variables。 当我们写g1.Name =
我们使用=
来传入value
variables,在这种情况下是"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"; } }