为什么我们需要C#中的属性

pet*_*ter 15 .net c# properties

你能告诉我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;
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 34

简短回答:封装

答案很长:属性非常多才多艺.它允许您选择将数据公开给外部对象的方式.设置值时,可以注入一些数据验证.它也解决了Java等方面的头痛getX()setX()方法.

  • 简答:使getX()/ setX()模式更漂亮.答案很长:封装.[引证需要];) (11认同)

Tar*_*rik 24

想一想:你有一个房间,你想要管理谁可以进入以保持房间的内部一致性和安全性,因为你不希望任何人进来搞乱它并让它像什么都没发生一样.因此,这个房间将是你实例化的课程,属性将成为人们进入房间的门.您在物业的设置者和吸气剂中进行适当的检查,以确保任何意外的事情进入和离开.

更多技术答案将是封装,您可以查看此答案以获取更多信息:https://stackoverflow.com/a/1523556/44852

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

Room r = new Room();
r.sectionOne = "enter";
Run Code Online (Sandbox Code Playgroud)

人们很容易进入sectionOne,没有任何检查.

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";
Run Code Online (Sandbox Code Playgroud)

现在你检查了那个人并且知道他是否有邪恶的东西.


Joe*_*orn 16

很多原因:

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

  • 你睡过吗? (3认同)

Dou*_*g R 7

这是一个常见的模式:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,这允许我们访问Foo实例上的Bar对象.这种封装意味着我们不必担心如何检索Bar,或者是否已经实例化了foo.bar.我们可以使用该对象,并让Foo类的内部处理它.


Aka*_*ava 5

设计时的好处

属性使视觉设计变得容易,您拥有Visual Studio的“最著名的属性浏览器”,可以更改对象的属性。

属性还提供附加的验证元数据,属性浏览器中的视觉外观,例如下拉列表,范围,颜色选择器等。

分开的数据和动作

它们确实代表了对象的“数据”与对象的“操作”(方法)之间的区别。

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

使用数据访问的方法名称和某些操作会在长期内造成混乱……例如对于Stack,Push / Pop是操作,而“ Size”或“ Count”是数据。

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

数据绑定

正如其他人所提到的,属性提供高级数据绑定,例如双向绑定等。

存取限制

您可以拥有只读属性和其他人提到的其他访问器。

反射

在基于反射的情况下编写通用代码的情况下,使用属性几乎不容易。

不同的存储实现

公共变量仅将数据存储为成员,在其他属性中,属性提供了各种方式以不同的形式存储数据,例如内部存储,它们可以存储为哈希表(因为它们在WPF中的依赖对象中完成)。它们可以被缓存。它们可以进一步中继到其他一些子实体或外来实体。但是,实现对于调用者而言是隐藏的。

验证方式

设置属性可能需要进行某些验证,并且代码“设置”部分中的验证代码可以轻松地帮助您验证输入并相应地报告错误。

通知事项

方法的Set部分可以引发通知事件,例如INotifyPropertyChanged.PropertyChanged,其他对象可以侦听和更新显示值。这是高级数据绑定的重要部分。

简而言之,它是一种具有高级功能的新数据存储“标准”,仅将数据存储在类的成员中。通常,通过避免属性,您可以执行所有功能,但是由于实现因人而异,因此该标准可帮助所有人以一种称为“属性”的单一形式定义/访问/验证/通知数据存储。