以下示例来自《Programming in the Key of 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);
}
在第二个版本中究竟发生了什么使它比第一个更适合 OOP?该方法是否在第一次迭代Date
中创建了一个类型的对象?DayOfYear
我知道该方法的实例版本可以直接访问结构的字段,但我不知道它的明显优势。