C#:getter / setter


109

我在某处看到以下内容,并且想知道它的含义。我知道它们是getter和setter,但想知道为什么字符串Type是这样定义的。谢谢你帮我

public string Type { get; set; }


4
这称为自动属性,请查看以下内容:msdn.microsoft.com/en-us/library/bb384054.aspx
Allov 2011年

这是一个名为"Type".NET 的属性的定义System.string。没什么了。
乔恩

2
我认为他可能会将自动属性的命名与Reflection类System.Type混淆了。 msdn.microsoft.com/en-us/library/system.type.aspx
eandersson 2011年

Answers:


178

这些是自动执行的属性(简称自动属性)。

编译器将自动生成以下简单实现的等效项:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}

2
@barlop作为来自谷歌的人,毫无头绪,需要更新什么?哈桑斯先生回答您的意思吗?谢谢。
Aethenosity

1
回想起来,@ Aethenosity我认为还可以。。发问者有一个有效的getter setter案例,它简洁得多(作为一个衬套/不需要第二个字段)。您也可以不写public int b { get { return b * 2; } } 第二个字段。但是我认为,当二传手的身体时,就需要第二场。这个展示了一个有身体的二传手。虽然它和发问者的一根衬里一样。
barlop

2
@Aethenosity还有c#7,当setter有一个body时,请确保您仍然需要第二个字段,但是它具有=>语法并且没有return关键字。虽然那不是我的初衷。我想到第二个字段是不必要的,尽管此后我发现第二个字段有时是必需的。在此示例中,第二字段不是必需的(因为没有主体的默认设置器会执行此操作),但应答者将其放入(主体和第二字段),以向发问者解释他们的行没有第二场正在做。
barlop

33

这是一种自动属性,它是这样的简写形式:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}

4
...除了不能访问后备字段。
弗拉德

7
...这就是为什么它被称为背景领域
Teoman Soygul 2011年

5
不过,您应该能够将其视为<Type>k__BackingField具有反思性。
弗拉德

25

在C#6中:

现在可以将自动属性声明为一个字段:

public string FirstName { get; set; } = "Ropert";

只读自动属性

public string FirstName { get;} = "Ropert";

13
public string Type { get; set; } 

没什么不同

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}


5

它是自动支持的属性,基本上等同于

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}

4

这些称为自动属性。

http://msdn.microsoft.com/en-us/library/bb384054.aspx

在功能上(就编译后的IL而言),它们与具有后备字段的属性相同。


1
您是否仍可以在类中引用private _type或type,还是只使用Type?
mikey 2011年

2
不,但是您可以为auto属性指定修饰符:public string Type {get; 私人套装;}
杰夫(Jeff)

在这种情况下,您将无法访问_type。
猎犬

1
因此,在这种情况下,this.Type =“ foo”; 应该可以,但是从外部instance.Type =“ foo”; 不会。.这些汽车道具绝对是对语言的有益补充。谢谢。
mikey 2011年

1

我知道这是一个老问题,但是随着C#6的发布,您现在可以对私有属性执行类似的操作。

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }

2
您可以直接在C#6中设置初始值:公共字符串myProp {get; } =“一些值”)没有构造函数;
哈桑(M.Hassan)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.