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()方法.
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
很多原因:
这是一个常见的模式:
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类的内部处理它.
设计时的好处
属性使视觉设计变得容易,您拥有Visual Studio的“最著名的属性浏览器”,可以更改对象的属性。
属性还提供附加的验证元数据,属性浏览器中的视觉外观,例如下拉列表,范围,颜色选择器等。
分开的数据和动作
它们确实代表了对象的“数据”与对象的“操作”(方法)之间的区别。
当我们查看类时,如果有50种方法可以查看,并不是每个人都会总是使用正确的函数命名,这会使以后很难理解。我总是告诉程序员,无论您何时编程,编写代码的方式都是5年后,如果有人看了代码,他应该理解代码。
使用数据访问的方法名称和某些操作会在长期内造成混乱……例如对于Stack,Push / Pop是操作,而“ Size”或“ Count”是数据。
创建“ Count”的属性只是将其目的区别为数据而不是操作。
数据绑定
正如其他人所提到的,属性提供高级数据绑定,例如双向绑定等。
存取限制
您可以拥有只读属性和其他人提到的其他访问器。
反射
在基于反射的情况下编写通用代码的情况下,使用属性几乎不容易。
不同的存储实现
公共变量仅将数据存储为成员,在其他属性中,属性提供了各种方式以不同的形式存储数据,例如内部存储,它们可以存储为哈希表(因为它们在WPF中的依赖对象中完成)。它们可以被缓存。它们可以进一步中继到其他一些子实体或外来实体。但是,实现对于调用者而言是隐藏的。
验证方式
设置属性可能需要进行某些验证,并且代码“设置”部分中的验证代码可以轻松地帮助您验证输入并相应地报告错误。
通知事项
方法的Set部分可以引发通知事件,例如INotifyPropertyChanged.PropertyChanged,其他对象可以侦听和更新显示值。这是高级数据绑定的重要部分。
简而言之,它是一种具有高级功能的新数据存储“标准”,仅将数据存储在类的成员中。通常,通过避免属性,您可以执行所有功能,但是由于实现因人而异,因此该标准可帮助所有人以一种称为“属性”的单一形式定义/访问/验证/通知数据存储。