码迷,mamicode.com
首页 > 其他好文 > 详细

不要小看了get 与set

时间:2014-07-22 23:43:57      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:面向对象

不知道大家以前是怎么使用实体中的getset.我先前是这样使用的.

定义一个实体类.之后写与之相关的字段名称.最后匹配上与之相关的属性,控制字段的读写权限.

以前使用方式

代码1

public class product
	{
		private string code;
		private string commodity_Name;
		public string Code
		{
			get{ 
				return code;
			}
			set{
				this.code=value;
			}
		}

		public string CommodityName
		{
			get
			{
				return commodity_Name;
			}
			set
			{
				this.commodity_Name = value;
			}
		}
	}

之后就可以再别的类中对product的属性进行取值和赋值了.这是我们常用的方式.


最近使用方式

而最近一直在使用的实体类中发现。有的只进行的字段的声明,有的之定义了属性,没有字段声明.

后来发现虽然类中没有声明字段,但是程序会默认生成一个字段:

  Public String Name{
   Get;
   Set;
}

系统会生成默认字段string _name;

以上是背景。下面说说自身的使用


getset使用的体会

在表的设计中我们使用用到关联,但是在实体对象中,我们是经常用到的却是实体关联。而关联的使用,它的控制就体现在 getset中。

1使用get与set延迟加载

如:我们在上面的product类中关联了一个电商品清单集合类。

我们可以根据传入的code,实现动态的加载相关的产品清单。

代码2

	private ProductElectricCollection  _productElectric;
	public ProductElectricCollection  ProductElectric
	{
		get
		{         //集合类初始为空
			if (_productElectric==null)
			{//判断关联的主类是否为空,说明已经加载了,那么就需要根据code从数据库中加载需要的电商品集合数据
				if (this.code != null)
				{
					_productElectric = AdapterElectric.Instance.Load(this.Code);
				}
				//若传入的code为空,则创建一个空的集合类
				else
				{
					_productElectric = new ProductElectricCollection();
				}
			}
			//已经存在该集合
			return _productElectric;
		}
		set
		{
			this._productElectric = value;
		}
	}

当我们加载完整个Product类的时候,引用类ProductElectric中是没有数据的

 bubuko.com,布布扣

只有当我们使用引用类中的数据时,才会触发调用该电商的数据。

bubuko.com,布布扣

这时候的写法很如下

textBox1.Text=textBox1.Text = pc.ProductElectric[0].CommodityName.ToString();

这样就会调用实体类中预先写好的get方法。根据id加载我们我们电商集合订单。方法为以上的代码2

该方法为一种简单的延迟加载方式

2 使用get与set对其他字段赋值

不在自己的属性中对字段进行赋值

避免不必要经常调用,浪费资源

实例:

我们要算最小值,最小值需要使用到岗位经费,但是岗位经费需要根据职级加载。

 1原来思路:定义岗位经费属性和字段。每次调用则获取员工职级进行加载。

 就像上面的get方法一样,多次调用多次加载。

后来发现,计算费用需要多次调用该方法。

2修改思路岗位经费根据职级加载,只要职级不变,那么经费就是不会改变的。则在进行职级赋值时,进行经费加载,这样,后续调用直接获取字段中的值,就不必要在多次加载了。减少了资源的开销。同时也将开放的postExpenseAnnuallyAmount属性去掉了。也是一种不错的写法。

		//员工岗位经费
		private decimal _postExpenseAnnuallyAmount;

		private string _vocationLevel;
		/// <summary>
		/// 员工职级
		/// </summary>
		public string VocationLevel
		{
			get
			{
				return this._vocationLevel;
			}
			set
			{
				//如果职级与获得的不相等,则进行经费加载。
				if (_vocationLevel != value && (value!=""))
				{
					//根据职级加载岗位经费
					_vocationLevel = value;
					var expense = PostExpenseStandardAdapter.Instance.GetDataByVocationLevel(Convert.ToInt32(_vocationLevel), DateTime.Now.SimulateTime());
					if (expense != null)
					{
						this._postExpenseAnnuallyAmount = expense.PostExpenseAnnuallyAmount;
					}
				}

				this._vocationLevel = value;

			}
		}

		/// <summary>
		/// 最小薪酬值
		/// 仅对宽带制有效,档级制时该值等于SalaryRealValue
		/// </summary>
		public Decimal MinSalaryValue
		{
			get
			{
				decimal salaryWithoutPostAmount = SalaryStandardValue * (1 - FloatSpan) - _postExpenseAnnuallyAmount;
				return IsNeedCityFactor ? salaryWithoutPostAmount * CityFactorValue :
										  salaryWithoutPostAmount;

			}
		}

小结:

通过两个很小的实例,

1发现getset的用法很灵活,变通的很,同时也是面向对象的一种体现。但是我们却很少这样使用。

2同时在定义实体类的时候也很少使用实体关联的方法,这样大大减少了面向对象的使用。

3定义属性和字段,并不是必要的,要根据实际情况来使用。小小的使用经验,希望对大家所有启发

下篇介绍动态加载中的泛型委托 参数使用

不要小看了get 与set

标签:面向对象

原文地址:http://blog.csdn.net/han_yankun2009/article/details/38052897

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!