封装,对外部有个安全的接口 虽然有时候字段也可以代替属性,但属性内部可以写代码,可以调用类的私有函数,而字段除了取值和赋值外,不能干其他的事了,要是同时再干其他的事,只能通过公共函数来执行,对外部调用者来说多走了一部,起不到封装的效果 举例说明: public class TV { public Color m_clrTVColor; //公共字段,当前电视的颜色 private Color m_clrTVpColor; //私有字段,当前电视的颜色,配合下面的属性用 public Color TVColor { get{return m_clrTVpColor;} set{m_clrTVpColor=value; ChangeTVColor(); //切换电视颜色 } } //切换电视颜色 public void ChangeTVColor() { .... } }//用公共字段调用需要执行两步 TV tv=new TV(); tv.clrTVColor=Colors.Red; tv.ChangeTVColor(); //而用属性,只需执行一步 TV tv=new TV(); tv.TVColor=Colors.Red;
字段也可以设置访问权限(可读/可写/可读写) Public ReadOnly m_clrColor As Colorpublic readonly Color m_clrColor;
Property is some kind of uniform interface to leverage OO design. Using property can isolate interface and implementation, since people no longer care about the internal implementation of property. Property could be easily implemented by a pair function calls, like "get***", "set***".
覆盖操作正好是个特例。public class MyClass { private int _test; public int Test {set _test = value;} public MyClass(){} }MyClass mc = new MyClass(); mc.Test = 100;// right mc.Test += 10;//wrong. Error Msg:属性或索引器“xx.xx.Test”无法用于此上下文中,因为它缺少 get 访问器 mc.Test = mc.Test + 10;//wrong. Error Msg is the same.
如: protected void Check()
{
判断条件;
}
public string Name
{
get {
Check( );
return name;}
set {
Check( );
name=value;
}
}
2.传递参数较方便,当你需要依次传递某个类多个参数的时候,可以通过该类的set get方法将属性set保存起来,传参的时候传递该类的引用就OK了。
虽然有时候字段也可以代替属性,但属性内部可以写代码,可以调用类的私有函数,而字段除了取值和赋值外,不能干其他的事了,要是同时再干其他的事,只能通过公共函数来执行,对外部调用者来说多走了一部,起不到封装的效果
举例说明:
public class TV
{
public Color m_clrTVColor; //公共字段,当前电视的颜色
private Color m_clrTVpColor; //私有字段,当前电视的颜色,配合下面的属性用
public Color TVColor
{
get{return m_clrTVpColor;}
set{m_clrTVpColor=value;
ChangeTVColor(); //切换电视颜色
}
} //切换电视颜色
public void ChangeTVColor()
{
....
}
}//用公共字段调用需要执行两步
TV tv=new TV();
tv.clrTVColor=Colors.Red;
tv.ChangeTVColor();
//而用属性,只需执行一步
TV tv=new TV();
tv.TVColor=Colors.Red;
Public ReadOnly m_clrColor As Colorpublic readonly Color m_clrColor;
其实在c++里很多地方就提倡这么用,特意用一个Get(),Set()函数来封装字段
而c#就是标准化了,更好运用
属性也有便利.
只写不读只有set即可
是通过调用类中其他的方法来实现吗?
但这个属性没有get,其他方法又如何能获取并操纵它的value呢?这种权限的设置是通过其他辅助方法来实现,还是单纯用只有set的属性就能实现呢?
其实就是覆盖以前的值(不管以前的值是多少),所以不需要get比方说电视颜色,不用知道以前是什么颜色,我只想它现在的颜色变成红色即可
{
private int _test;
public int Test
{set _test = value;}
public MyClass(){}
}MyClass mc = new MyClass();
mc.Test = 100;// right
mc.Test += 10;//wrong. Error Msg:属性或索引器“xx.xx.Test”无法用于此上下文中,因为它缺少 get 访问器
mc.Test = mc.Test + 10;//wrong. Error Msg is the same.
无中生有,装牛角尖!这东西,谁让你用属性?怎么用?
封装,函数,类,接口都可实现!!!带扣款参数进来,,,判断是否足够扣款,足够返回 TRUE,不足够返回 FALSE;
再进行 扣款。根本什么都不会返回!
能用字段的部分最好都用属性来实现。因为属性的调用在编译过程中是解释为方法的,具体的妙处可以看看,有很详细的解释。
{
private static string _SoftwareName = "金点家庭记账簿";
public static string SoftwareName
{
get
{
return _SoftwareName;
} set
{
_SoftwareName = value;
}
}
} 我如果在窗体的标题栏要用这个软件名称,我可以:
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
} private void InitUI()
{
this.Text = AboutDlg.SoftwareName;
}
}
【原创家庭记账簿1.1,简单实用,欢迎工薪阶层、家庭主妇下载使用
http://download.csdn.net/source/1842593】
C#引入属性,是为了更好的实现封装性。具体表现为:
1.数据安全:字段只在内部使用,属性作为对外接口。
2.读写权限:get/set轻松实现对读写权限的控制。
3.函数本质:属性的调用在编译时解释为方法,属性中可以调用其它方法,这些方法对调用者透明。
4.接口定义:定义接口时只能用属性及方法,不能定义字段。结贴。
比如你写一个类,有一个string的成员变量Data,原本程序逻辑上Data是null就是null,但是某天多了一个规则,规定data绝对不准是null,如果是null的话就用某个特别的常量,比如<null>表达。如果你用的是Field的话不就立即傻眼了?而如果用的proptery的话在get方法里面直接修改一下就可以用了还有只能写的属性也没有什么不可理解的,一般我们在构造方法里面通过参数对类的私有变量作初始化,但是有些情况可能在类创建的时候还无法获得初始化值,那么为了确保私有属性不被读到,就用只写的属性作初始化。通常这样的属性都是对象属性不太担心会被人乱写,反倒担心会被人乱改内容