c#: getter/setter

144

我在某处看到了以下的代码,想知道这是什么意思。我知道它们是getter和setter,但想知道为什么字符串类型(Type)要这样定义。谢谢帮忙。

public string Type { get; set; }

http://weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx - Snowbear
4
这被称为自动属性,看一下这个链接:http://msdn.microsoft.com/en-us/library/bb384054.aspx。 - Allov
这是一个名为“Type”的属性的定义,其.NET类型为System.string。没有其他内容了。 - Jon
2
我认为他可能将自动属性的命名与反射类System.Type混淆了。http://msdn.microsoft.com/en-us/library/system.type.aspx - eandersson
http://stackoverflow.com/documentation/c%23/49/properties/3365/auto-implemented-properties#t=201610041453344442997 - Jon Schneider
9个回答

226

这些是自动实现属性(Auto Properties)(Auto-Implemented Properties)

编译器会自动生成以下简单实现的等效代码:

private string _type;

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

2
作为来自谷歌的人,您不知道需要更新什么?M. Hassans的回答是否符合您的意思?谢谢。 - user9853322
1
@Aethenosity 回想起来,我认为这没问题。我当时是在考虑getter setter的例子。提问者有一个有效的getter setter案例,它更加简洁(作为一行代码/不需要第二个字段)。你也可以写成public int b { get { return b * 2; } },不需要第二个字段。但是我认为当你有一个带有主体的setter时,你需要第二个字段。而这个示例显示了一个带有主体的setter。尽管它与提问者的一行代码相同。 - barlop
2
@Aethenosity 还有C# 7,即使setter有一个主体,你仍然需要第二个字段,但它具有=>语法和没有返回关键字。虽然这不是我想要的,我原本认为第二个字段是不必要的,但后来发现有时第二个字段是必要的。在这个例子中,第二个字段是不必要的(因为没有主体的默认setter会执行此操作),但回答者将其放入(setter主体和第二个字段)以解释问题者没有第二个字段的代码行在做什么。 - barlop

42

这是一个自动属性,它是这个的简写:

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

5
除了无法访问后备字段外,其他都相同。 - Vlad
9
这就是为什么它被称为“背景字段”的原因。 - Teoman Soygul
5
然而,你应该能够通过反射将其视为 <Type>k__BackingField - Vlad

35

在 C# 6 中:

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

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

只读自动属性

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

21
public string Type { get; set; } 

与做什么没有什么不同

private string _Type;

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

这是按值传递还是按引用传递? - Meric Ozcan
@MericOzcan 字符串和所有基本类型都是传值调用。int、double、bool等同理。 - Niels Lucas

8
这意味着编译器会在运行时定义一个后备字段。这是自动实现属性的语法。
更多信息:自动实现属性

5

这是一个自动生成的属性,基本上相当于:

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

5

您也可以使用 lambda 表达式。

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

4

1
你还能在类中引用私有的 _type 或 type 变量,或者只能使用 Type? - mikey
2
不行,但是你可以为自动属性指定修饰符:public string Type { get; private set; }。 - Jeff
在这种情况下,您将无法访问_type。 - Security Hound
1
那么在这种情况下,this.Type = "foo"; 应该可以正常工作,但是从实例外部 instance.Type = "foo"; 将不会生效。这些自动属性绝对是语言中一个有用的补充。谢谢。 - mikey

1
随着C# 6的发布,您现在可以为私有属性做类似于这样的事情。
public constructor()
{
   myProp = "some value";
}

public string myProp { get; }

3
在C# 6中,你可以直接设置初始值而无需构造函数,例如:public string myProp { get; } ="some value"。这里的“some value”是属性的初始值。 - M.Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接