有人可以提供一个非常简单的解释自动属性在 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;
}
private void setExample(String value) {
example = value;
}
编辑:@ Paya 还提醒我:
http://msdn.microsoft.com/en-us/library/bb384054.aspx http://weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx如果你问为什么要使用属性或自动属性,这是它背后的设计理念。
一个重要的设计原则是,您从不将字段公开为公共字段,而是始终通过属性访问所有内容。这是因为您永远无法确定何时访问字段,更重要的是何时设置字段。现在,很多时候,在设置或获取值时(例如,范围检查)都不需要任何处理。这就是创建自动属性的原因。它们是由编译器创建的一种简单的单行方式。
虽然这是我所做的,甚至为我的内部程序,它可能是更重要的设计用于公共使用(销售,开源等),如果你使用一个自动属性,后来决定,你需要做的东西在set
或get
,你可以很容易地改变你的 code 不公共接口。
作为对下面注释的澄清,如果所有代码都是您自己的,那么不,它可能不会对您的属性和字段产生太大影响。但是,如果您正在设计一个将被其他人使用的库,那么在公共字段和属性之间来回切换将导致异常,除非首先重新编译使用该库的代码。
作为测试,我创建了一个库项目,并声明了一个名为TestData
的属性。我创建了一个全新的项目,只是为了使用这个库。所有工作都按预期进行。然后,我将属性更改为公共字段(名称保持不变),并在不重新编译使用项目的情况下复制新的库 DLL。结果是抛出异常,因为代码期望找到方法属性方法get_TestData
和
Unhandled Exception: System.MissingMetdException: Metd not found: 'Void TestLibrary.TesterCl.set_TestData(System.String)'.
at TestLibraryConsumer.Program.Main(String[] args)
许多人已经说过 auto 属性是语法糖-一种编写简单属性的速记方式。我将处理公共变量和公共属性之间的差异,以及为什么在两者之间切换时需要重新编译。采取以下措施:
public cl MyCl
{
public int MyPublicVariable = 0;
public int MyPublicProperty
{
get;
set;
}
}
一旦编译,概念上,它实际上结束了类似于以下内容:
public cl MyCl
{
public int MyPublicVariable = 0;
private int MyPublicProperty = 0;
public int get_MyPublicProperty()
{
return MyPublicProperty;
}
public void set_MyPublicProperty( int value )
{
MyPublicProperty = value;
}
}
很久以前,属性被发明为定义 get 和 set 方法对的一种快速简便的方法。它使代码更易读,更容易理解,因为它们传达了意图并确保了一致性。
MyCl myCl = new MyCl();
myCl.MyPublicVariable = 2;
myCl.MyPublicProperty = 2;
一旦编译,再次概念上,它最终类似于以下内容:
MyCl myCl = new MyCl();
myCl.MyPublicVariable = 2;
myCl.set_MyPublicProperty( 2 );
这也是 auto 属性被发明的原因-在保持最佳实践的同时加快代码编写速度。
还有一些关于接口的评论。接口本质上是一个契约,保证在实现它们的任何类中存在某些方法。从上面我们知道,属性表示一个或两个方法,所以它们在接口中工作得很好。
希望这有助于一点。
这是另一个可能感兴趣的例子:
public cl MyCl
{
private int[] _myArray = new int[ 5 ];
public int MyArray[ int index ]
{
get
{
return _myArray[ index ];
}
set
{
_myArray[ index ] = value;
}
}
}
public cl MyCl
{
private int[] _myArray = new int[ 5 ];
public int get_MyArray( int index )
{
return _myArray[ index ];
}
public void set_MyArray( int index, int value )
{
_myArray[ index ] = value;
}
}
请注意:我不能完全记住反编译属性时使用的方法签名。我认为它是 'get_XXX' 和 'set_XXX' 但它可能是非常相似的其他东西。只要理解在那里,它可能不会太重要。最后,它们都变成了内存地址反正:-)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(42条)