Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请解释C#属性是如何工作的?_C#_Properties - Fatal编程技术网

请解释C#属性是如何工作的?

请解释C#属性是如何工作的?,c#,properties,C#,Properties,我学习C语言已经有一段时间了,我在我的C语言书(头先C语言)中遇到了属性。我真的不明白它们是用来干什么的,我为什么要用它们。我已经在谷歌上搜索过几次了,但我还是无法理解它们 有人能给我解释一下这个外国概念吗 谢谢 Varmitharen那么,您熟悉字段吗?如果是这样,从使用类的代码的角度来看,属性与字段完全相同。但在类内部,属性就像一对方法,一个用于将值返回给使用者,另一个用于更新值。这些方法通常称为getter和setter 希望使用属性而不是字段的一个很好的理由是,它可以更好地控制传入和传出

我学习C语言已经有一段时间了,我在我的C语言书(头先C语言)中遇到了属性。我真的不明白它们是用来干什么的,我为什么要用它们。我已经在谷歌上搜索过几次了,但我还是无法理解它们

有人能给我解释一下这个外国概念吗

谢谢


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;
        }
    }
}