Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#_Oop - Fatal编程技术网

私人会员拥有公共的接受者和接受者的目的是什么?c#

私人会员拥有公共的接受者和接受者的目的是什么?c#,c#,oop,C#,Oop,像这样直接编写getter和setter有什么不同: public string Name {get; set;} 就像这样: private string _name; public string Name { get { return this._name; } set { this._name = value; } } 我在很多代码中都看到了这一点。为什么他们使用私有成员而不是公共的getter和sette

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

public string Name {get; set;}
就像这样:

private string _name;

public string Name
{
    get
    {
       return this._name;
    }
    set
    {
        this._name = value;
    }
}
我在很多代码中都看到了这一点。为什么他们使用私有成员而不是公共的getter和setter

是为了性能还是隐私,还是为了什么?
谢谢。

您可以控制getter和setter中发生的事情,而如果成员是公共的,则可以直接修改变量

private string _name;

public string Name
{
    get
    {
       return this._name + " likes chocolate";
    }
    set
    {
        this._name = value;
    }
}
在这里,您的私人_名称始终保持不变,但任何访问该名称的人都将获得_name+“喜欢巧克力”


在setter中,您可以进行一些验证。

简单回答,没有区别。不管怎样,编译器都会将“auto”属性转换为该样式,这只会为编写器节省一些击键时间。只有当您开始使用数据绑定或必须在设置部分执行其他操作时,它才会真正发挥作用

private string _name;

public string Name
{
    get
    {
       return this._name;
    }
    set
    {
        this._name = value;OnPropertyChange();
    }
}
在WPF/XAML/DataBinding中,这将让订阅此对象的任何人都知道名为“name”的属性已更改,并且它应该在UI中反映出来。

没有

问题是:直到C#3才可用(如果您查看参考文档:它可以追溯到与C#3一起发布的VS 2008),并且并非所有代码都是在C#3时代编写的。此外,并非所有开发人员都知道此功能。如果我偶然发现这种代码,我会重写它以使用自动实现的属性

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

它们本质上是一样的

下面的代码基本上是创建私有字段并为其提供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;}

属性只是一个简写,它将在后台创建一个公共get方法、一个公共set方法和一个私有字段来存储值

示例代码

 // 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;
}
参见图片:

示例类在code
Name
中只有一个属性。 如果使用反射从示例类中获取所有成员,您将看到在运行时会生成
set\u name()
get\u name()
方法。 代码中未指定这些方法


第一个属性称为自动实现的属性。
第二个是当您想添加一些自定义代码逻辑来验证setter中的值时使用的。

它们基本上是一样的。第一个代码只是C#3中的一个选项。很久以前,它甚至不存在。第一个代码只是一个可以编译成第二个的代码。它是后来在C#life中添加的,因此它可能是习惯的力量,也可能只是旧代码。主要区别在于,使用第二种方法,您可以从类内部直接操作私有字段,但没有。第一个是第二个的语法糖。请参见第二种方法,当您在设置或获取时希望其他事情发生时使用。有时,人们使用长路径,因为他们希望类直接访问字段,而不是使用自己的接口。这样,您就可以在不破坏类实现的情况下向setter或getter添加内容。C#最棒的一点是,你可以用很短的方式编写它,然后在不破坏任何客户端的情况下修改它。在这两种情况下,都有一个私有字段和一个公共属性。当我必须编写某种getter和setter时,我可以理解这段代码,但为什么我像我那样使用普通代码。我在一家大公司工作,所有的代码都是这样写的我很抱歉。我没有看到行
公共字符串名称{get;set;}
。我在比较:
private string\u name
公共字符串名称
。其他人是正确的,他们是一样的。。。只需写一行就可以了:)没有人期望属性会更改输入值。这是代码smell@SamySammour,只是出于好奇,你是编程新手还是C?这是如何回答这个问题的?
 // 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;
}