主题:这篇文章我来说下属性(Properties)和字段在C#中的关系。首先申明一下,这里讲的属性就是通常说的包含get,或者是set访问器的属性,不是属性 (Attribute)。我们写程序的时候大多都会用到实体类,而生成实体类,我们都会申明一些常规属性或者是自动实现的属性。至于到底选用哪一种属性,或者说是否可以直接用字段代替呢? 常规属性和自动实现属性的区别:
2:一个get访问器,它负责读取数据,用于返回字段值或者是用于计算并返回字段值。以return或者是throw语句终止。其中可以包含些简单的逻辑处理,例如数据验证等等。
说明:get访问器是读取数据,所有不要在代码块中修改属性状态。下面的代码是不被推荐的。
3:一个set访问器,负责给属性赋值,类似于一个返回类型为void的方法,可以包含逻辑处理,例如可以根据默认的值通过计算后返回结果。
自动实现属性和常规属性的区别:
2:自动实现的属性 (Property) 不允许具有属性 (Attribute)。如果您必须在属性 (Property) 的后备字段上使用属性 (Attribute),则应该只创建常规属性 (Property)。 什么是字段,这里不用多说,这里讲下字段和属性的区别:
class studentProperties3 { public string sName { get; set; } } private static void refName(ref string sName) { sName = sName+'ref'; } private static void outName(string sName, out string sName2) { sName2 = sName+'out'; } studentProperties3 s3 = new studentProperties3(); s3.sName = '王五'; sName = s3.sName; refName(ref s3 .sName );//错误 outName(sName,out sName);//错误
常规属性,自动实现属性和字段都各有特点: 1:常规属性功能最全,灵活必也最强。 案例:项目开发中,有时会发现两个系统之间的某些类中属性有部分相同有部分不同,调用时需要把一个类的相关属性赋值给另一个类的相同属性,如果属性的数目较少,我们可以一个一个手工来写,但如果较多,或者属性里面中包含复杂属性,我想这是比较烦人的事,有了属性就会变得更加简洁。 //转换公共属性 PropertyInfo[] proAs = s3.GetType().GetProperties(); PropertyInfo[] proBs = s4.GetType().GetProperties(); if (proAs != null && proAs.Length > 0 && proBs != null && proBs.Length > 0) { foreach (PropertyInfo proA in proAs) { if (!proA.CanRead) continue; foreach (PropertyInfo proB in proBs) { if (proB.Name.ToLower() == proA.Name.ToLower() && proB.PropertyType == proA.PropertyType && proB.CanWrite) { proB.SetValue(s4, proA.GetValue(s3, null), null); } } } }
2:自动实现属性较常规属性代码简洁,但灵活性不够(get,set访问器中不能包含逻辑代码)。在数据的存储和读取上功能和字段相同。 |
|
来自: VeryHappyAG > 《编程》