有人可以提供C#中自动属性的简单解释,它们的用途,也许还有一些例子吗?请尽量保持外行的条件!
如果属性访问器中不需要其他逻辑,则使用自动属性。 声明看起来像这样:
public int SomeProperty { get; set; }
它们只是语法糖,因此您不需要编写以下更冗长的代码:
private int _someField;
public int SomeProperty
{
get { return _someField;}
set { _someField = value;}
}
编辑:扩展一点,这些用于使类更容易拥有私有变量,但允许它们在类外部可见(无法修改它们)
哦,自动属性的另一个优点是你可以在界面中使用它们! (不允许任何类型的成员变量)
使用普通属性,您可以执行以下操作:
private string example;
public string Example
{
get { return example; }
set { example = value; }
}
自动属性允许您创建一些非常简洁的东西:
public string Example { get; set; }
因此,如果您想创建一个只能在类中设置的字段,您可以执行以下操作:
public string Example { get; private set; }
这相当于:
private string example;
public string Example
{
get { return example; }
private set { example = value; }
}
或者在Java中:
private String example;
public String getExample() {
return example;
}
public void setExample(String value) {
example = value;
}
编辑:@Paya还提醒我:
如果您问为什么要使用属性或自动属性,这就是它背后的设计理念。
一个重要的设计原则是,您永远不会将字段公开为公共字段,而是始终通过属性访问所有内容。这是因为你永远不知道何时访问某个字段,更重要的是它何时被设置。现在,很多时候,在设置或获取值时从不需要任何处理(例如,范围检查)。这就是创建自动属性的原因。它们是创建房产的简单,单线方式。它的后备存储由编译器创建。
虽然这就是我对内部程序的所作所为,但对于那些专为公共用途(销售,开源等)而言,它可能更为重要。如果您使用自动属性,然后决定需要在set
或get
中执行其他操作,则可以轻松更改代码而不会破坏公共界面。
更新
作为对下面评论的澄清,如果所有代码都是您自己的代码,那么不,它可能不会给您带来属性和字段之间的差异。但是,如果您正在设计一个将被其他人使用的库,那么在公共字段和属性之间来回切换将导致异常,除非首先重新编译使用该库的代码。
作为测试,我创建了一个库项目并声明了一个名为TestData
的属性。我创建了一个全新的项目来使用这个库。一切都按预期工作。然后我将属性更改为公共字段(名称保持不变)并复制到新库DLL而不重新编译使用项目。结果是抛出的异常,因为代码期望找到方法属性方法get_TestData
和set_TestData
,但是不能通过方法访问字段。
Unhandled Exception: System.MissingMethodException: Method not found: 'Void TestLibrary.TesterClass.set_TestData(System.String)'.
at TestLibraryConsumer.Program.Main(String[] args)
它们只是一个编码快捷方式,可以为程序员节省一些按键。而不是键入所有这些:
private string _lastName;
public string LastName {
get {
return _lastName;
}
set {
_lastName = value;
}
}
你可以输入:
public string LastName {
get; set;
}
然后让编译器自动生成其余的。
来自Auto-Implemented Properties (C# Programming Guide):
在C#3.0及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更简洁。它们还使客户端代码能够创建对象。 声明属性时,编译器会创建一个专用的匿名支持字段,只能通过属性的get和set访问器进行访问。
class Person
{
public string Name { get; set; }
}
我是早期版本的C#,为了使用属性,您需要创建一个字段来保存该值(称为Backing Store):
private string _something;
public string Prop { get { return _something; } }
从C#3.0开始,不再需要此要求,编译器将自动为您创建后备存储,因此无需声明_something字段。
你可以在这里阅读更多关于此事的信息:http://msdn.microsoft.com/en-us/library/bb384054.aspx
希望这可以帮助。
简化已接受的答案,您还可以使用:
public int SomeProperty { get; private set; }
它具有相同的效果,您不再需要为此创建另一个变量。
对于任何VB.NET读者,实现方式略有不同。例如:
''' <summary>The property is declared and can be initialized.</summary>
Public Property MyProperty As String = "SomeValue"
但是,通过为下划线添加前缀,可以明确地获得关联字段:
Dim sConcat As String = _MyProperty + _MyProperty
_MyProperty = sConcat
在外部代码中:
Dim sMyValue As String = oMyClassObj.MyProperty ' = "SomeValueSomeValue"
就个人而言,我更喜欢这种方法,因为当您使用内部字段或可能暴露的属性时,您可以在消费代码中清楚地看到。
使用以下代码:
using System;
class My Class
{
public string Dummy { get; set; }
public My Class()
{
Dummy = "I'm dummy property";
}
}
class Program
{
static void Main()
{
var my Class = new My Class();
Console .Write Line (my Class .Dummy);
}
}