什么是{得到;组; C#中的语法?

时间:2011-02-23 20:49:47

标签: c# properties

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

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

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

19 个答案:

答案 0 :(得分:516)

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

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

答案 1 :(得分:399)

据我了解,{ 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;
    }
}

但是如果你像我一样 - 大约一个小时前 - 你真的不明白 属性 访问者 是,并且您对某些基本术语也没有最好的理解。 MSDN是学习这类东西的好工具,但初学者并不总是很容易理解。所以我将在这里更深入地解释这一点。

getset 访问者 ,这意味着他们可以访问私有中的数据和信息字段(通常来自支持字段),通常来自公共 属性 (正如您在上面的例子)。

不可否认,上述陈述令人困惑,让我们进入一些例子。让我们说这段代码指的是音乐类型。因此,在类型类型中,我们将需要不同类型的音乐。假设我们想要3种类型:Hip Hop,Rock和Country。为此,我们将使用的名称来创建该类的新实例

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类的实例,我们可以使用上面设置的“名称” 属性 来设置类型名称。

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只能在该私有字段中撰写信息。但是通过拥有同时具有getset的属性,我们可以执行这两项功能。通过编写g1.Name = "Hip Hop";,我们专门使用Name属性中的set函数

set使用名为value的隐式变量。基本上这意味着,只要你在set中看到“价值”,它就是指一个变量; “价值”变量。当我们写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实例的名称,我相信我们可以获取这个名称< / p>

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"

答案 2 :(得分:94)

那些是automatic properties

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

public class Genre
{
    private string _name;

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

答案 3 :(得分:36)

这是执行此操作的简短方法:

public class Genre
{
    private string _name;

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

答案 4 :(得分:27)

将数据成员公开为public是一种快捷方式,因此您无需显式创建私有数据成员。 C#将为您创建一个私有数据成员。

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

答案 5 :(得分:15)

基本上,它是以下的捷径:

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

答案 6 :(得分:10)

答案 7 :(得分:6)

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

您可以使用它们在类型实例中获取/设置该属性的值。

答案 8 :(得分:6)

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

您可以在MSDN的Auto-Implemented Properties Programming Guide上阅读更多内容。

答案 9 :(得分:5)

这意味着如果您创建Genre类型的变量,您将能够将该变量作为属性访问

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

答案 10 :(得分:5)

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

  • 一个属性只能有一个'get'访问者,这样才能使该属性成为只读

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

答案 11 :(得分:4)

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

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

答案 12 :(得分:4)

在Visual Studio中,如果在类中定义属性X并且只想将此类用作类型,则在构建项目后,您将收到一条警告,其中显示“Field X永远不会分配给,并且始终具有默认值“

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

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

enter image description here

答案 13 :(得分:2)

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

答案 14 :(得分:1)

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

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

示例:

{ Create a disabled version }
with MonoBmp do
begin
  Assign(FOriginal);
  HandleType := bmDDB;
  Canvas.Brush.Color := clBlack;
  Width := IWidth;
  if Monochrome then
  begin
    Canvas.Font.Color := clWhite;
    Monochrome := False;
    Canvas.Brush.Color := clWhite;
  end;
  Monochrome := True;
end;
with TmpImage.Canvas do
begin
  Brush.Color := clBtnFace;
  FillRect(IRect);
  Brush.Color := clBtnHighlight;
  SetTextColor(Handle, clBlack);
  SetBkColor(Handle, clWhite);
  BitBlt(Handle, 1, 1, IWidth, IHeight,
    MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax);
  Brush.Color := clBtnShadow;
  SetTextColor(Handle, clBlack);
  SetBkColor(Handle, clWhite);
  BitBlt(Handle, 0, 0, IWidth, IHeight,
    MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax);
end;

对于非自动实现的属性,支持字段是预先显示的,作为私有范围变量可见。

示例:

public string Log { get; set; }

此外,值得注意的是'getter'和'setter'可以使用不同的'支持字段'

答案 15 :(得分:1)

基本上是速记。您可以编写 公用字符串Name {get;组; } ,就像许多示例一样,但您也可以编写它:

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 through an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

它的正式名称为“自动实现的属性”,并且具有读取(programming guide)的良好习惯。 我还将推荐教程视频C# Properties: Why use "get" and "set"

答案 16 :(得分:1)

属性就像是一层,将私有变量与类的其他成员分开。从外界看来,属性只是一个字段,可以使用.Property

来访问属性
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}"; } }
}

FullName是一个属性。带箭头的是快捷方式。从外部世界,我们可以这样访问FullName:

var person = new Person();
Console.WriteLine(person.FullName);

呼叫者不在乎您如何实现FullName。但是在类中,您可以根据需要更改FullName。

查看Microsoft文档以获取更多详细说明:

https://docs.microsoft.com/en-us/dotnet/csharp/properties

答案 17 :(得分:0)

定义私有变量

在构造函数内部并加载数据

我已经创建了Constant并将数据从constant加载到Selected List类。

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; }

}

答案 18 :(得分:0)

基本上它有助于保护您的数据。考虑这个没有 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);