面向对象 - 类变量

时间:2013-10-15 08:31:41

标签: c# oop

我是OOP的新手并且更深入地研究了一些事情,但是我在C#中的这三种方法之间有一些混淆,哪一种最好,两种之间的差异是什么。

示例1 所以让我们从这个开始,我知道这是错误的方法:

public class MyClass
{
    public string myAttribute;
}

以这种方式我可以直接使用:

设置属性
myObject.myAttribute = "something";

示例2 我看到的下一个方式似乎是建议的:

public class MyClass
{
    public string myAttribute { get; set;}
}

有了getter和setter,这个我不明白前两个变量的区别仍然可以直接在对象上设置?

示例3 第三种方式,以及我理解背后的理论的方式,是创建一个集函数

public class MyClass
{
    string myAttribute;
    public void setAttribute(string newSetting)
    {
        myAttribute = newSetting;
        //obviously you can apply some logic in here to remove unwanted characters or validate etc.
    }
}

那么,三者之间有什么区别?我假设示例1是一个很大的禁忌,所以最好是2和3,为什么要使用其中一个?

由于

4 个答案:

答案 0 :(得分:3)

第二个

public class MyClass
{
  public string MyAttribute { get; set;}
}

基本上是简写:

public class MyClass
{
  private string myPrivateAttribute;

  public string MyAttribute 
  { 
     get {return myPrivateAttribute;}
     set {myPrivateAttribute = value;}
  }
}

这是auto-implemented property,它与任何常规属性完全相同,只要编译器可以为您执行此操作,就不必实现它。

那么,什么是财产?它只不过是一些方法,加上一个名字。我能做到:

public class MyClass
{
  private string myPrivateAttribute;

  public string GetMyAttribute()
  { 
     return myPrivateAttribute;
  }

  public void SetMyAttribute(string value)
  {
     myPrivateAttribute = value;
  }

}

然后而不是写

myClass.MyAttribute = "something";
string variable = myClass.MyAttribute;

我必须使用更详细,但不一定更清晰的形式:

myClass.SetMyAttribute("something");
string variable = myClass.GetMyAttribute();

请注意,没有什么限制getset方法(C#术语中的accessors)的内容,它们是方法,就像其他任何方法一样。您可以根据需要添加尽可能多的逻辑。即使用自动实现的属性创建原型,然后使用显式实现添加任何必要的逻辑(例如,日志属性访问或添加延迟初始化)非常有用。

答案 1 :(得分:0)

你在这里要求与OOP语言中的封装有什么关系。

它们之间的区别在于您在从类中创建对象后可以访问对象的适当性。

在第一个示例中,您可以直接访问new MyClass().MyAttribute,无论您是获得还是设置它的价值。

在第二个示例中,您声明了两个用于访问它的基本功能:

public string MyAttribute 
{ 
   get {return myPrivateAttribute;}
   set {myPrivateAttribute = value;}
}

在第三个示例中,您声明了自己设置值的方法。如果要自定义setter,这非常有用。例如,您不希望设置传递的值,但值乘以2或其他...

我推荐一些阅读。您可以找到herehere的内容。

答案 2 :(得分:0)

属性是使用get和set方法的私有属性的语法糖,它非常有用且快速输入;

您可以将{ get; set;}作为公共属性处理自动属性。它没有额外的逻辑,但你可以在以后添加它而不用注意它。 只需交换

public string MyLine { get; set;}

string myLine;
public string MyLine 
{
    get { return myLine; }
    set { myLine = value + Environment.NewLine;  }
}

例如,如果你需要的话。

您还可以轻松地将只读属性创建为{ get; private set }

因此每次使用Properties而不是公共属性只是因为它更容易和更快地编写并且它提供了更好的封装,因为如果您决定在新版本的程序中使用它,则不应使用get和set方法。

答案 3 :(得分:0)

OOP的main principles之一是封装,这实际上是第一个示例与另一个示例之间的差异。

第一个示例是您有一个私有字段直接从对象公开 - 这是错误,因为您允许从对象外部突变内部数据,因此无法控制它。

其他两个示例在语法上是等效的,第二个被推荐只是因为它编写的代码较少。然而,更重要的是,他们都限制访问和控制内部数据的变异,这样就可以完全控制数据的管理方式 - 这就是封装。