以下示例来自C#键中的编程。
程序的第一次迭代是典型的C方式,而下一次转世更加面向对象。该程序是一个简单的例子,用于计算某一事件发生在一年中的哪一天(如果是闰年,则12月31日为365或366)。
using System;
class StructureAndMethodsTwo
{
static void Main()
{
Date dateMoonWalk = new Date();
dateMoonWalk.iYear = 1969;
dateMoonWalk.iMonth = 7;
dateMoonWalk.iDay = 20;
Console.WriteLine("Moon walk: {0}/{1}/{2} Day of Year: {3}",
dateMoonWalk.iMonth, dateMoonWalk.iDay, dateMoonWalk.iYear,
Date.DayOfYear(dateMoonWalk));
}
}
struct Date
{
public int iYear;
public int iMonth;
public int iDay;
public static bool IsLeapYear(int iYear)
{
return iYear % 4 == 0 && (iYear % 100 != 0 || iYear % 400 == 0);
}
static int[] aiCumulativeDays = { 0, 31, 59, 90, 120, 151,
181, 212, 243, 273, 304, 334 };
public static int DayOfYear(Date dateParam)
{
return aiCumulativeDays[dateParam.iMonth - 1] + dateParam.iDay +
(dateParam.iMonth > 2 && IsLeapYear(dateParam.iYear) ? 1 : 0);
}
}
除了转换为
的DayOfYear
方法之外,该程序的下一个版本是相同的
public int DayOfYear()
{
return aiCumulativeDays[iMonth -1] + iDay+ (iMonth > 2 && IsLeapYear(iYear) ? 1:0);
}
第二个版本究竟发生了什么,使其比第一个版本更友好?在第一次迭代中,方法Date
是否创建了DayOfYear
类型的对象?我知道该方法的实例版本可以直接访问结构的字段,但我不知道它的独特优势。
答案 0 :(得分:1)
在第二个版本中,对象本身提供所有信息,而不是静态上下文中的日期参数。如果该方法使用对象自己的数据而不是被参数“告知”它是什么,那么它更面向对象。
答案 1 :(得分:1)
一年中的某一天未在第一个版本中创建日期。它只是评估参数。第二个版本更多OO,因为它在您的类的实例上运行而不是静态方法调用。这通常会使事情变得更有条理,而且更加OO。
答案 2 :(得分:1)
在示例2中,您正在使用Date结构的内部变量iYear, iMonth and iDay
。第一个示例使用Date对象的另一个副本,您将传递给不需要的DayOfYearFunction。
修改强>
在第一个示例中,您使用Date结构的实例并将其作为参数传递给DayOfYear函数,Date(dateParam)的实例在堆栈上分配,这将使用更多内存并需要额外的垃圾回收调用来自CLR的时候需要清理它。
性能问题: IMO,虽然使用的内存略多,但由于程序的性质,几乎不会出现任何性能问题。它只是一个冗余参数。