请解释C#属性是如何工作的?
我学习C语言已经有一段时间了,我在我的C语言书(头先C语言)中遇到了属性。我真的不明白它们是用来干什么的,我为什么要用它们。我已经在谷歌上搜索过几次了,但我还是无法理解它们 有人能给我解释一下这个外国概念吗 谢谢请解释C#属性是如何工作的?,c#,properties,C#,Properties,我学习C语言已经有一段时间了,我在我的C语言书(头先C语言)中遇到了属性。我真的不明白它们是用来干什么的,我为什么要用它们。我已经在谷歌上搜索过几次了,但我还是无法理解它们 有人能给我解释一下这个外国概念吗 谢谢 Varmitharen那么,您熟悉字段吗?如果是这样,从使用类的代码的角度来看,属性与字段完全相同。但在类内部,属性就像一对方法,一个用于将值返回给使用者,另一个用于更新值。这些方法通常称为getter和setter 希望使用属性而不是字段的一个很好的理由是,它可以更好地控制传入和传出
Varmitharen那么,您熟悉字段吗?如果是这样,从使用类的代码的角度来看,属性与字段完全相同。但在类内部,属性就像一对方法,一个用于将值返回给使用者,另一个用于更新值。这些方法通常称为
getter
和setter
希望使用属性而不是字段的一个很好的理由是,它可以更好地控制传入和传出属性的值 属性提供对数据的受控访问;在最基本的情况下,它可能只是意味着封装一个字段(不建议使用公共字段),编译器可以让您轻松:
public int Foo {get;set;} // the compiler handles the field for you
但是,您可以使用该属性强制执行逻辑或处理副作用:
private int foo;
public int Foo {
get { return foo; }
set {
if(value < 0) throw new ArgumentOutOfRangeException();
if(value != foo) {
foo = value;
OnFooChanged(); // fire event notification for UI bindings
}
}
}
它只能由类型和子类赋值,不能由无关的代码赋值。它也只能有一个get或set
基本上,属性充当get/set方法对的更正式版本,这使得谈论“Foo”比谈论“get\u Foo”/“set\u Foo”等(用于双向绑定)更容易
与字段不同,属性也可以在接口上公布,这对于基于接口的代码是必不可少的属性用于丰富面向对象编程的封装概念 i、 它们封装了一个字段成员,并让您(开发人员)控制如何设置/获取该变量。例子
public class Person
{
private int m_age;
public int Age
{
set
{
if(value < 18)
m_age = 18;
else
m_age = value;
}
get
{
return m_age;
}
}
}
公共类人物
{
私人国际博物馆;
公共信息
{
设置
{
如果(值<18)
m_年龄=18岁;
其他的
m_年龄=价值;
}
得到
{
返回m_年龄;
}
}
}
看到了吗?使用property
Age
,我们保证Age的最小集值为18。尽管其他答案都很好,但它们都与属性的机制有关。这也有助于理解财产哲学
在面向对象编程中,我们花费大量时间构建语义域的模型。当你说你有一个类“Animal”和一个派生类“Tiger”时,你在计算机领域里模拟了一个关于真实世界的事实:世界上所有的事物中,有些是动物,有些是老虎
但是你必须理解,机制和语义是不同的。没有人会说“嘿,让我们去动物园看看zookeeper的实例在tigers的实例上调用IFeedable上的方法”
字段是一种机制,因此应该是类的私有实现细节;它没有描述模型的一部分。属性是语义模型的一部分。每只老虎都有一个生日,所以“生日”应该是老虎类的财产。这是tigers“语义模型”的一部分,所以将其作为属性公开。作为实现细节,生日可能存储在属性访问的私有字段中
这有意义吗?简而言之:使用公共属性来描述您正在建模的事物的语义属性;使用私有字段作为实现机制。即使是编译器生成的字段属性,其另一个原因是,如果需要重新实现getter和setter的逻辑时,它也为您提供了灵活性,而无需重新编译使用的代码。如果发布字段,然后决定实施setter逻辑,则必须将字段设置为私有,实现属性,然后使用代码的每个人都必须重新编译。它们不一定封装字段成员。即使它们封装字段成员,字段成员不一定与属性的类型相同。我不太喜欢这个例子;我通常更喜欢同时具有
get
和set
的属性具有get
返回set
的值@Brian,这是根据开发人员的需要和手头的情况确定的,有时我们可能会将“喜欢的”放在一边,以支持“更好的”。另一方面,从这个问题被问到的方式,我推断OP需要一个简单的例子来理解属性的概念,这就是为什么我的回答是作者的接受而不是社区的接受。其他答案都很好。IFeedable
被弃用,取而代之的是iNomnomanable
。你有没有看过这个链接?这个链接和什么比较?您目前正在使用什么?公共领域?是的,不要这样做;公共字段几乎从来都不是一个好主意。公共字段通常不是好的实践,但是如果您的类仅在内部使用并且是一个自包含的应用程序,那么强制重新编译实际上可能并不重要。也就是说,在.NET3.5及更高版本中,只需添加{get;set;}
,就可以很容易地用公共属性替换公共字段。例如,替换int-foo代码>使用intfoo{get;set;}
。当然,如果您的实现类型在逻辑上不同于您公开的属性,那么使用字段将使您的代码更难使用。
public class Person
{
private int m_age;
public int Age
{
set
{
if(value < 18)
m_age = 18;
else
m_age = value;
}
get
{
return m_age;
}
}
}