2013-10-15 85 views
1

我对OOP非常陌生,并且更深入地研究了一些事情,但是我对C#中这三种方法之间存在一些混淆,哪一个最好,两者之间有什么区别?他们。面向对象 - 类变量

例1 因此,让这一个,这(让我明白)开始就是错误的方式做到这一点:

public class MyClass 
{ 
    public string myAttribute; 
} 

,并以这种方式,我可以直接使用设置属性:

myObject.myAttribute = "something"; 

例2 我所看到的未来方式,这似乎是recomended是这样的:

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之间,为什么使用另一个呢?

感谢

+5

请参阅[字段和属性在C#中有什么区别?](http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-anda-a-属性功能于c)中。字段应该保持私有,你使用getter和/或setter公开属性。另请参阅[字段](http://msdn.microsoft.com/zh-cn/library/ms173118.aspx)和[属性](http://msdn.microsoft.com/zh-cn/library/x9fsa0sw。 aspx)在MSDN上的C#编程指南中的章节。 – CodeCaster

回答

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)的内容,它们就像任何其他方法一样。你可以在里面添加尽可能多或者少量的逻辑。即用自动实现的属性制作一个原型是很有用的,然后用一个明确的实现来添加任何必要的逻辑(例如日志属性访问,或添加懒惰初始化)。

+0

你也可以在get和set块内应用一些逻辑,所以我更喜欢第二个例子,因为它非常方便(公共字符串myAttribute {get; set;}) – dave

+0

谢谢,所以例2和例3基本相同,但编译器如何实现它,使其更清洁可写? 但是为什么在示例1上使用示例2,然后如果它只是公开可用呢? –

+0

@SamLeach:不,“myPrivateAttribute”不是**可公开的,即使有一个方法只是设置它。该方法可以改变,而不需要改变调用它的任何代码。例如。即使我始终保持前门未锁定状态,以便任何人都可以进入,但仅仅移开门并不明智,因为这也消除了锁门的选项。 – SWeko

0

你在这里提出的问题与OOP语言中的封装有关。

它们之间的区别在于,您可以在从课程中创建对象后访问对象的合法性。

在第一个示例中,您可以直接访问它new MyClass().MyAttribute是否获取或设置它的值。

在第二个例子中,你申报2个基本功能来访问它:

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

在第三个例子,你声明自己设定的值的方法。如果你想定制setter,这很有用。例如,你不想设置通过的值,但值乘以2或其他东西...

我推荐一些阅读。你可以找到herehere

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 }

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

0

一个OOP的main principles的是封装,这基本上是与第一实施例和其它2

第一个例子之间的差异是不公开的字段其直接从暴露对象 - 这是不好的,因为您允许从对象外部突变内部数据,因此无法控制它。

另外两个例子在语法上是等同的,第二个例子是推荐的,因为它的代码少。但更重要的是,它们都限制访问控制内部数据的变异,因此可以完全控制数据的管理方式 - 这就是ecapsulation。