7

我想我一直在使用这些术语可互换/错误!在C#属性和实例变量有什么区别?

public class ClassName 
{ 
    private string variable; 

    public string property 
    { 
     get{ return variable; } 
     set { variable = value; } 
    } 
} 

回答

17

伊恩做

+1

+1:绝对是语言相关的。 – Powerlord 2009-05-01 13:41:38

2

代码示例,这基本上是一个术语问题是,尽管这个问题,非常语言/环境相关的相关的“语言无关”的标签。

对于设计讨论的缘故,属性和实例变量可以互换使用,因为想法是属性是描述对象的数据项。

当谈到一种特定的语言时,这两个可以是不同的。例如,在C#中,属性实际上是一个返回对象的函数,而实例变量是类的非静态成员变量。

0

除了C#语言之外,一个属性本质上是一个get和set函数。因此,除了获取/设置之外,它还可以具有自定义逻辑。一个实例变量不能做到这一点。

1

也许这是因为你第一次来自C++吧?! 在我上学的日子里,我有教授说,班级属性或班级一直都是属性的。自从我转到Java C#世界后,我开始听到有关成员的消息。班级成员,实例成员...

然后属性apear!在Java和.NET中。所以我认为你最好称它为会员。他们是实例成员(或称为实例变量)或类成员....

干杯!

1

属性可以,我想大多数情况下,返回一个实例变量,但它可以做更多。你可以把逻辑放在一个属性中,聚合值或更新其他实例变量等。我认为最好避免这样做。逻辑应该进入方法。

0

属性是某种与对象关联的数据。例如,一个圆的属性是它的直径,另一个是它的面积。

实例变量是存储在对象中的一段数据。它不一定需要直接与财产相对应。例如(heh),圆圈可以将其半径存储在实例变量中,并根据该半径计算其直径和面积。所有三个仍然是属性,但只有半径存储在一个实例变量中。

一些语言具有“头等”属性的概念。这意味着对于客户端应用程序来说,该属性看起来像使用实例变量一样使用。也就是说,不要写如circle.getDiameter()之类的东西,而是写circle.diameter,而不是circle.setRadius(5),你会写circle.radius = 5

3

赫尔希是正确的关于这是特定的语言。但要添加语言特定的答案:

在python中,实例变量是实例的属性,(通常)是实例字典中引用的内容。这与Java中的成员或实例变量类似,只是所有内容都是公开的。

属性是获取器/设置器方法的快捷方式,看起来就像实例变量。因此,在下面的类定义(修改从圭的new style object manifesto):

class C(object): 

    def __init__(self): 
     self.y = 0 

    def getx(self): 
     if self.y < 0: return 0 
     else: return self.y 

    def setx(self, x): 
     self.y = x 

    x = property(getx, setx) 

>>> z = C() 
>>> z.x = -3 
>>> print z.x 
0 
>>> print z.y 
-3 
>>> z.x = 5 
>>> print z.x 
5 
>>> print z.y 
5 

yz实例变量,x是一个属性。 (一般来说,在定义属性的地方,有一些技巧用于遮蔽关联的实例变量,以便其他代码不直接访问它)。python中的属性的好处是设计者不必四处走动先发制人地封装所有实例变量,因为未来通过将实例变量转换为属性进行封装不应该破坏任何现有代码(除非代码利用了封装试图修复的漏洞,或者依赖于类检查或其他元数据 - 编程技术)。

所有这一切都是一个很长的回答,说在设计层面上,谈论属性是很好的。关于你可能需要执行什么类型的封装是不可知的。我想这个原则不是语言不可知的,但是适用于python旁边的语言。

0

与给出的其他答案相反,我认为认为在语言不可知的成员变量和属性之间存在有用的区别。

这种区分在面向组件的编程中最为明显,它在任何地方都很有用,但在图形用户界面中最容易理解。在这种情况下,我倾向于将组件的设计时配置视为操纵对象的“属性”。例如,我通过设置其属性来选择前景和背景颜色,边框样式以及文本输入字段的字体。虽然这些属性可能在运行时更改,但它们通常不是。在运行时,代表字段内容的一组不同的变量更有可能被读取和写入。我认为这些信息是组件的“状态”。

这个区别为什么有用?当创建一个布线组件的抽象时,通常只需要暴露“状态”变量。回到文本字段示例,您可能会声明一个接口来提供对当前内容的访问。但是,控制组件外观的“属性”仅在具体的实现类中定义。

2

在目标c中,属性是一个实例变量,它可以利用重载的点运算符来调用它的setter和getter。所以my.food =“cheeseburger”实际上被解释为[我的setFood:“芝士汉堡”]。这是定义绝对不是语言不可知的另一种情况,因为objective-c定义了@property关键字。

相关问题