我正在学习ASP.NET MVC,我可以阅读英文文档,但是我真的不太理解这段代码在做什么:
public class Genre
{
public string Name { get; set; }
}
{ get; set; }
是什么意思?
我正在学习ASP.NET MVC,我可以阅读英文文档,但是我真的不太理解这段代码在做什么:
public class Genre
{
public string Name { get; set; }
}
{ get; set; }
是什么意思?
这是所谓的自动属性,本质上是以下代码的简写形式(编译器将生成类似的代码):
private string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
=
运算符,但只针对一个特定的元素,是这样吗? - Hi-Angel据我理解,{ get; set; }
是一种“自动属性”,就像@Klaus和@Brandon所说的那样,它是写一个带有“支持字段”的属性的简写。因此,在这种情况下:
public class Genre
{
private string name; // This is the backing field
public string Name // This is your property
{
get => name;
set => name = value;
}
}
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)
现在我们已经创建了 Genre 类的实例,可以使用之前设置的“Name”属性来设置流派名称。
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.Name = "Hip Hop";
get
和set
可以访问私有字段,否则您将无法访问。 get
只能读取该私有字段中的信息并返回它。 set
只能在该私有字段中写入信息。但通过具有get
和set
的属性,我们能够执行这两个功能。通过编写g1.Name = "Hip Hop";
,我们特别使用了我们的Name属性的set
函数。
set
使用一个隐含变量称为value
。基本上,这意味着任何时候在set
中看到"value",它都是指变量;"value"变量。当我们编写g1.Name =
时,我们使用=
来传递value
变量,在这种情况下是"Hip Hop"
。因此,您可以将其视为:public class g1 //We've created an instance of the Genre Class called "g1"
{
private string name;
public string Name
{
get => 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"'
}
}
需要注意的是上面的例子实际上并没有写在代码中,它更像是一个假想的代码,代表了后台正在发生的事情。
现在我们已经设置了Genre的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"
set{name = value;} // 这里的'value'等于"Hip Hop"
。 - maraaaaaaaaget
和set
方法访问数据。我提供的链接中有John Guttag在页面顶部的优秀引用。我建议阅读他的书籍或甚至参加这个免费在线课程。 - Josie Thompson`public class Genre{public string Name;}`
而不是:`public class Genre{ public string Name { get; set; }}`。
我的意思是,我们为什么需要 { get; set; }? - user2048204这些是自动属性
基本上是使用支持字段写属性的另一种方式。
public class Genre
{
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
}
get
时返回和使用set
持久化的地方。就像是一个橱柜,get
和set
打开它的门来访问。 - Grant Thomas_name
。在自动属性中,私有字段是隐藏的。 - Justin这是简便的做法:
public class Genre
{
private string _name;
public string Name
{
get => _name;
set => _name = value;
}
}
这是一种将数据成员公开的快捷方式,所以您不需要显式地创建私有数据成员。C#会为您创建一个私有数据成员。
如果您决定更改数据成员的实现方式以添加一些逻辑,则可以仅将数据成员公开而不使用此快捷方式,但那样的话您就需要破坏接口。因此,简而言之,它是创建更灵活代码的快捷方式。
基本上,它是以下内容的快捷方式:
class Genre{
private string genre;
public string 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
{ get; set; }
的含义,所以我认为这个答案对于那些来自其他编程语言的人来说是一个好答案。 - carloswm85基本上,它有助于保护您的数据。考虑以下没有setter和getter的示例以及具有它们的相同示例。
没有setter和getter
学生类
using System;
using System.Collections.Generic;
using System.Text;
namespace MyFirstProject
{
class Student
{
public string name;
public string gender;
public Student(string cName, string cGender)
{
name = cName;
gender= cGender;
}
}
}
在主函数中
Student s = new Student("Some name", "Superman"); //Gender is superman, It works but it is meaningless
Console.WriteLine(s.Gender);
使用setter和getter方法
using System;
using System.Collections.Generic;
using System.Text;
namespace MyFirstProject
{
class Student
{
public string name;
private string gender;
public Student(string cName, string cGender)
{
name = cName;
Gender = cGender;
}
public string Gender
{
get { return gender; }
set
{
if (value == "Male" || value == "Female" || value == "Other")
{
gender = value;
}
else
{
throw new ArgumentException("Invalid value supplied");
}
}
}
}
}
在主函数中:
Student s = new Student("somename", "Other"); // Here you can set only those three values otherwise it throws ArgumentException.
Console.WriteLine(s.Gender);
Name { get; set; }
是什么意思? - john k它是C#中的自动实现属性。
get; set;
时从标准位置加载其值? - Aurum Aquilaget/set模式提供了一种结构,允许在实例化的类属性实例的设置('set')或检索('get')期间添加逻辑。当属性需要一些实例化逻辑时,这将非常有用。
属性可能仅具有“get”访问器,这是为了使该属性只读
在实现get/set模式时,中间变量用作容器,其中可以放置一个值并提取一个值。通常使用下划线作为中间变量的前缀。 这个中间变量是私有的,以确保它只能通过它的get/set调用进行访问。请参见Brandon的答案,因为他的答案演示了实现get/set的最常用语法约定。
它们是公共属性Name的访问器。
您可以使用它们来获取/设置Genre实例中该属性的值。
{get; set;}
,你创建的是一个字段;但如果你加上{get; set;}
,你创建的是一个 属性(Property)。使用属性可能会使一些事情变得更容易,特别是在使用反射时。 - Seichi