2009-10-06 89 views
12

你能告诉我是什么性质的C#我的意思是实际的解释确切用法为什么我们需要在C#属性

在我们的项目中,我们使用的是像

/// <summary> 
/// column order 
/// </summary> 
protected int m_order; 

/// <summary> 
/// Get/Set column order 
/// </summary> 
public int Order 
{ 
    get { return m_order; } 
    set { m_order = value; } 
} 

/// <summary> 
/// constructor 
/// </summary> 
/// <param name="name">column name</param> 
/// <param name="width">column width</param> 
/// <param name="order">column order</param> 
public ViewColumn(string name, int width, int order) 
{ 
    // 
    // TODO: Add constructor logic here 
    // 
    m_name = name; 
    m_width = width; 
    m_order = order; 
} 


/// <summary> 
/// returns the column name, width, and order in list view. 
/// </summary> 
/// <returns>string represent of the ViewColumn object</returns> 
public override string ToString() 
{ 
    return (string.Format("column name = {0}, width = {1}, order = {2}.", 
     m_name, m_width, m_order)); 
} 

/// <summary> 
/// Do a comparison of 2 ViewColumn object to see if they're identical. 
/// </summary> 
/// <param name="vc">ViewColumn object for comparison</param> 
/// <returns>True if the objects are identical, False otherwise.</returns> 
public override bool Equals(object obj) 
{ 
    ViewColumn vc = (ViewColumn)obj; 
    if(m_name == vc.Name && 
     m_width == vc.Width && 
     m_order == vc.Order) 
     return true; 
    else 
     return false; 
} 
+0

可能的重复[我应该使用公共财产和私人领域或公共领域的数据?](http://stackoverflow.com/questions/1277572/should-i-use-public-properties-and-private-fields-or-public-字段为数据) – nawfal 2014-07-17 20:21:53

回答

16

想想看:你有一个房间,一进门就进入这个房间。如果你想检查谁是谁来保护你的房间,那么你应该使用财产,否则他们将不会有任何门,每一个人都很容易进入没有任何规定。

class Room { 
    public string sectionOne; 
    public string sectionTwo; 
} 

Room r = new Room(); 
r.sectionOne = "enter"; 

人们正在上一节很容易,没有任何检查。

class Room 
{ 
    private string sectionOne; 
    private string sectionTwo; 

    public string SectionOne 
    { 
     get 
     { 
     return sectionOne; 
     } 
     set 
     { 
     sectionOne = Check(value); 
     } 
    } 
} 

Room r = new Room(); 
r.SectionOne = "enter"; 

现在你检查了这个人,并知道他是否有什么邪恶的东西。

+0

不错的一个..保持它 – 2011-08-12 07:51:04

31

简短的回答性质:封装

很长的答案:属性是非常versitile。它允许您选择想要如何将数据公开给外部对象。设置值时,您可以注入一些数据验证。它还解决了类似于Java等的getX()setX()方法的难题。

+9

简答:使getX()/ setX()模式更漂亮。长答案:封装。 [需要的引证];) – Jimmy 2009-10-06 04:11:26

+1

例如请参阅http://stackoverflow.com/questions/1461598/what-is-the-point-of-setters-and-getters-in-java – Jimmy 2009-10-06 04:12:38

+0

+1为答案-1的问题:为什么这个答案不被接受? – 2011-06-25 08:52:40

0

它们对于数据绑定很有用。

4

这就是使用它的方式,除了可能的设置方式。您可能不想访问成员变量,而是想使用该类中的属性,以便可以使用有关每个成员变量的统一规则。这是使用属性的主要优点,是将访问和setter逻辑全部集中到一个地方。它是否真的取决于您的具体需求,无论您是否想使用Property来设置它。但请注意,在构造函数中,在调用Property时需要非常小心,因为您可能或不可能依赖于正在初始化的其他类,如果通过构造函数访问,那么将不会完成其他部分。这又取决于你的具体实现。

这也是一个少许清洁剂的使用方法:

myObject.Property1 = "Test String"; 
Console.WriteLine(myObject.Property1); 

比你在其他一些语言中看到:

myObject.setProperty1("Test String"); 
System.out.writeln(myObject.getProperty1()); 

在这里,您可以封装一些逻辑的情况下:

public int Order 
{ 
    get { return m_order; } 
    set 
    { 
     // Put some rules checking here. Maybe a call to make sure that the order isn't duplicated or some other error based on your business rules. 
     m_order = value; 
    } 
} 

他们有用的另一种方式是这样的:

public int Order { get; private set; } 

现在你已经拥有了一个自动实现的属性,它带有只能在类内部设置但是在其他地方读取的支持成员变量。

最后,如果你需要控制逻辑,你可以这样写:

public int Order 
{ 
    get { return m_order; } 
    protected set 
    { 
     // Again, you can do some checking here if you want... 
     m_order = value; 
     // You can also do other updates if necessary. Perhaps a database update... 
    } 
} 
+0

你可以给我一个代码 – peter 2009-10-06 04:12:06

+0

的实际解释你去了,我已经添加了几个。 – jasonh 2009-10-06 04:17:47

16

很多原因:

  • 语义。属性将你类型的实现与接口分开。
  • 二进制兼容性。如果您需要更改属性,则可以在不破坏相关代码的二进制兼容性的情况下执行此操作。对于字段,即使新实现使用同名的属性,也必须重新编译的所有内容
  • 数据绑定。你不能绑定到一个领域。
+3

你有没有睡过? – 2009-10-06 04:16:24

+0

*贱人自己*我不知道二进制兼容性的东西。尼斯。 – Tarik 2009-10-06 04:23:16

+0

@Justin:只在'y'结束的日子里,但有时候不会很长。 – 2009-10-06 04:24:32

3

正如贾斯汀所说,封装是面向对象的基本原则之一。您希望保持隐藏在外部的数据的内部表示,并提供批准的查看/操作方法。

C#属性是构造,提供了一个简单的方法来做到这一点。在你的榜样,你没有做任何事情的getset方法内,但在现实生活中,你可能需要做某些事情像

  • 店货币美分的10日为一个长整型,但回到外面的世界作为具有2个小数空格和$符号的字符串。
  • 将某个属性限制为只读(或者甚至是只写:例如:密码验证程序/哈希生成器类)。
  • 当此值设置/获取时,以某种方式更改对象的状态。

在Java中,您编写的getter和setters是分别返回或接受值的普通旧方法。

+0

+1用于访问说明符方面,不仅用于调节数据级别(如成员),还用于操作级别(get/set):只读,只写 – jdehaan 2009-10-06 04:48:31

+0

在IL级属性也有方法。事实上,C#编译器为属性创建诸如get_Order和set_Order之类的方法,并且不允许您使用相同的名称定义自己的方法。 – softveda 2009-10-06 06:04:56

6

这里有一个共同的模式:

class Foo { 

    private Bar _bar; 

    //here, Foo has a Bar object. If that object has already been instantiated, return that value. Otherwise, get it from the database. 
    public Bar bar { 
     set { _bar = value;} 
     get { 
      if (_bar == null) { 
       _bar = Bar.find_by_foo_name(this._name); 
      } 
      return _bar; 
     } 
    } 
} 

总之,这使我们能够访问我们的Foo实例的酒吧对象。这个封装意味着我们不必担心如何检索Bar,或者如果foo.bar已经实例化。我们可以使用这个对象,让Foo类的内部处理它。

4

属性用于限制对类的成员变量的直接访问。 使用属性维护抽象。 无论何时您想使用属性实例化一个对象并将数据设置为它的成员变量,都可以检查某些条件是否将该值设置为成员变量。 您可以限制对属性的读写操作,以便在访问该类的对象时可以只读,只写成员变量的值。

4

设计时间优势

属性使得视觉设计容易,你有最有名的属性浏览器的Visual Studio,让你改变对象的属性。

地产也提供验证的额外的元数据,属性浏览器中的视觉外观,像下拉,范围,颜色选择器等

独立的数据和操作

他们的“数据”之间忠实地代表差对象的对象和“动作”(方法)。

当我们看课程的时候,如果我们有50种方法可以看,不是每个人都会使用正确的函数命名,这会使以后难以理解。我总是告诉程序员,无论你什么时候编程,都要以这样的方式编写代码,5年后,如果其他人查看代码,他应该了解代码。

使用方法名称的数据访问和一些操作在长期运行中会产生混淆......就像Stack的情况一样,Push/Pop是操作,但“Size”或“Count”是数据。

创建“Count”属性只是将其目的区分为数据而不是操作。

数据绑定

正如其他人所提到的,性能提供数据绑定的先进水平像双向绑定等

访问限制

提到你可以有只读属性和其他访问由他人。

反思

它的小易以书面基于反射通用代码的情况下与性质的工作。

不同的存储实施

公共变量存储数据仅作为成员,还有什么地方特性提供不同的方式来存储不同格式的数据像internaly它们可以被存储为散列表(因为它们是依赖对象做过WPF)。他们可以被缓存。他们出租车可以进一步转达给其他一些儿童实体或其他实体。但是对于呼叫者隐藏了实现。

验证

设置属性可能因此需要一定的验证,以及验证码中的“设置”部分代码可以轻松帮你验证输入和报告错误。

通知

方法可以提高通知的事件,如INotifyPropertyChanged.PropertyChanged哪些其他对象可以侦听和更新显示值的设置的一部分。这是高级数据绑定的重要组成部分。

总之,它是一个新的“标准”的数据存储,具有先进的设施,然后只是将数据存储在类的成员。通过避免属性,通常您可以执行所有功能,但由于实施可能会因人而异,因此其标准可帮助每个人以单一形式定义/访问/验证/通知数据存储,称为“属性”