私人会员与公共吸气者和制定者的目的是什么? C#

时间:2017-04-04 12:34:29

标签: c# oop

直接写这个getter和setter有什么不同:

public string Name {get; set;}

并且像这样:

private string _name;

public string Name
{
    get
    {
       return this._name;
    }
    set
    {
        this._name = value;
    }
}

我在许多代码中看到了这一点。为什么他们使用私人成员而不是公共吸气者和制定者。

是表现还是隐私还是重点是什么? 谢谢。

6 个答案:

答案 0 :(得分:2)

没有。

问题是:auto-implemented properties在C#3之前是不可用的(如果你看一下引用的文档:它会回到使用C#3发布的VS 2008),而不是所有代码都写完了在C#3时代。此外,并非所有开发人员都知道此功能。如果我偶然发现这种代码,我会重写它以使用自动实现的属性。

答案 1 :(得分:2)

  

直接编写getter和setter之间有什么不同   像这样

public string Name {get; set;}

它们基本相同。

下面的代码基本上是创建私有字段并为其提供getter和setter,这当然符合预期的想法。但是,语言实现者决定通过提供更短的语法来简化程序员的生活,您可以创建私有字段,同时提供getter或setter或两者兼而有之。

private string _name;

public string Name
{
    get
    {
       return this._name;
    }
    set
    {
        this._name = value;
    }
}

因此,在C#3中,他们(语言实现者)提出了通过使程序员同时创建私有字段并同时提供getter或setter或两者来缩短语法的想法。

在幕后,下面代码发生的一切都是编译器创建一个私有字段,并为它提供一个getter和setter。因此,基本上,它是更简洁,更简洁的语法,以实现与上述示例相同的任务。

自动实施的属性

public string Name {get; set;}

答案 2 :(得分:2)

属性只是一个简短的手,将在后台创建一个公共get方法,一个公共set方法和一个私有字段来存储该值。

示例代码

col1 | calculatedCol | col2

见图片

示例类只有代码col1 | col2 | calculatedCol 中的属性。 如果您使用Reflection从Sample类中获取所有成员,您将看到在运行时生成 // example property public string Name { get; set; } // at run time it is the same as: private string Name; public string GetName(){ return this.Name; } public string SetName(string name){ this.Name = name; } Name方法。 这些方法未在代码中指定。

enter image description here

答案 3 :(得分:1)

简短的回答,没有区别。编译器将“auto”属性转换为该样式,无论如何,它只是为您节省了几次击键。当你开始使用DataBinding或者必须在Set部分做其他事情时,它才真正发挥作用。

private string _name;

public string Name
{
    get
    {
       return this._name;
    }
    set
    {
        this._name = value;OnPropertyChange();
    }
}

在WPF / XAML / DataBinding中,这将允许任何订阅此对象的人知道名称为“Name”的属性已更改,并且应该在UI中反映出来。

答案 4 :(得分:0)

第一个被称为自动实现的属性。 如果要添加一些自定义代码逻辑来验证setter中的值,则使用第二个。

答案 5 :(得分:-1)

你可以控制吸气剂和吸气剂中发生的情况。 setters,如果该成员是公共的,则可以直接修改该变量。

private string _name;

public string Name
{
    get
    {
       return this._name + " likes chocolate";
    }
    set
    {
        this._name = value;
    }
}

在这里,您的私人_name始终保持不变,但访问姓名的任何人都会获得_name +“喜欢巧克力”。

在setter中,你可以做一些验证。