Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的{get;set;}语法是什么?_C#_Properties - Fatal编程技术网

C#中的{get;set;}语法是什么?

C#中的{get;set;}语法是什么?,c#,properties,C#,Properties,我正在学习ASP.NET MVC,我可以阅读英文文档,但我不太明白这段代码中发生了什么: public class Genre { public string Name { get; set; } } 这意味着什么:{get;set;}?它是C#的一个函数。它们是公共属性名称的访问器 您可以使用它们来获取/设置流派实例中该属性的值。这些是 基本上是另一种使用支持字段编写属性的方法 public class Genre { private string _name; p

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

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

这意味着什么:
{get;set;}

它是C#的一个函数。

它们是公共属性名称的访问器

您可以使用它们来获取/设置流派实例中该属性的值。

这些是

基本上是另一种使用支持字段编写属性的方法

public class Genre
{
    private string _name;

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

这意味着,如果创建类型为Genre的变量,则可以将该变量作为属性访问

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

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


您可以阅读更多有关MSDN的内容。

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


这是实现这一点的简单方法:

public class Genre
{
    private string _name;

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

它是一种将数据成员公开为公共的快捷方式,这样您就不需要显式地创建私有数据成员。C#将为您创建一个私有数据成员


您可以在不使用此快捷方式的情况下将数据成员公开,但如果您决定更改数据成员的实现以使其具有某些逻辑,则需要中断接口。简而言之,它是创建更灵活代码的捷径。

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

必须使用Visual C#2008/csc v3.5或更高版本进行编译。
但您可以编译低至.NET Framework 2.0的输出(不需要运行时或类来支持此功能)。

Get set是属性的访问修饰符。 Get读取属性字段。 设置属性值。 Get类似于只读访问。 Set类似于只写访问。
要将属性用作读写,必须同时使用get和set。

据我所知,
{get;set;}
是一个“自动属性”,就像@Klaus和@Brandon所说的是用“backing field”编写属性的缩写。因此在本例中:

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}
然而,如果你像我一样——大约一个小时前——你并不真正理解什么是属性访问器,而且你对一些基本术语也没有最好的理解。MSDN是学习这类东西的好工具,但对初学者来说并不总是容易理解。所以我想在这里更深入地解释一下

get
set
访问器,这意味着它们能够访问私有字段中的数据和信息(通常从后台字段),并且通常从公共属性访问数据和信息(如上面的示例所示)

不可否认,上面的陈述相当令人困惑,所以让我们来看看一些例子。假设这个代码是指音乐的类型。因此,在课堂类型中,我们需要不同类型的音乐。假设我们想要三种类型:嘻哈、摇滚和乡村音乐。为此,我们将使用类的名称来创建该类的新实例

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)
现在我们已经创建了流派类的实例,我们可以使用上面设置的“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”的名称设置为Hip Hop

g1.Name = "Hip Hop";
这里发生的事情有点复杂。就像我之前说过的,
get
set
从私有字段访问信息,否则您将无法访问这些信息
get
只能从该私有字段读取信息并返回<代码>设置只能在该专用字段中写入信息。但是通过同时具有
get
set
的属性,我们可以同时执行这两个函数。通过编写
g1.Name=“Hip-Hop”
我们专门使用Name属性中的
set
函数

set
使用一个名为
value
的隐式变量。基本上,这意味着每当你在
集合中看到“value”时,它指的是一个变量;“value”变量。当我们编写
g1.Name=
时,我们使用
=
来传递
变量,在本例中是
“嘻哈”
。所以你可以这样想:

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"'
    }
}
var person = new Person();
Console.WriteLine(person.FullName);
需要注意的是,上面的示例实际上并没有写在代码中。它更多的是一个假设性的代码,代表了背景中发生的事情

现在我们已经设置了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"
如果我们运行这个,我们会在控制台中看到“嘻哈”

因此,出于本解释的目的,我也将用输出来完成示例

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"

基本上,这是一条捷径:

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

在Visual Studio中,如果在类中定义属性
X
,并且只想将该类用作类型,则在生成项目后,您将收到一条警告,提示“字段X从未指定给,并且始终具有其默认值”

通过将
{get;set;}
添加到
X
属性,您将不会收到此警告

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


Get在属性出现在右侧(RHS)时被调用 当属性显示在左侧(LHS)时调用Set “=”符号的名称

对于自动实现的属性,背景字段在场景后面工作且不可见

例如:

public string Log { get; set; }
private string log;

public string Log
{
    get => log;
    set => log = value;
}
而对于非aut
private string _name;

public string Name
{
    get { return _name; }
    set { _name = value ; } // value is a special keyword here
}
private class Person {
    private int _age;  // Person._age = 25; will throw an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}
public  class GridModel
{
    private IEnumerable<SelectList> selectList;
    private IEnumerable<SelectList> Roles;

    public GridModel()
    {
        selectList = from PageSizes e in Enum.GetValues(typeof(PageSizes))
                       select( new SelectList()
                       {
                           Id = (int)e,
                           Name = e.ToString()
                       });

        Roles= from Userroles e in Enum.GetValues(typeof(Userroles))
               select (new SelectList()
               {
                   Id = (int)e,
                   Name = e.ToString()
               });
    }

  public IEnumerable<SelectList> Pagesizelist { get { return this.selectList; } set { this.selectList = value; } } 
  public IEnumerable<SelectList> RoleList { get { return this.Roles; } set { this.Roles = value; } }
  public IEnumerable<SelectList> StatusList { get; set; }

}
public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return $"{FirstName} {LastName}"; } }
}
var person = new Person();
Console.WriteLine(person.FullName);
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);
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);