静态方法和实例方法C#

时间:2012-09-21 14:55:17

标签: c# methods

以下示例来自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类型的对象?我知道该方法的实例版本可以直接访问结构的字段,但我不知道它的独特优势。

3 个答案:

答案 0 :(得分:1)

在第二个版本中,对象本身提供所有信息,而不是静态上下文中的日期参数。如果该方法使用对象自己的数据而不是被参数“告知”它是什么,那么它更面向对象。

答案 1 :(得分:1)

一年中的某一天未在第一个版本中创建日期。它只是评估参数。第二个版本更多OO,因为它在您的类的实例上运行而不是静态方法调用。这通常会使事情变得更有条理,而且更加OO。

答案 2 :(得分:1)

在示例2中,您正在使用Date结构的内部变量iYear, iMonth and iDay。第一个示例使用Date对象的另一个副本,您将传递给不需要的DayOfYearFunction。

修改

在第一个示例中,您使用Date结构的实例并将其作为参数传递给DayOfYear函数,Date(dateParam)的实例在堆栈上分配,这将使用更多内存并需要额外的垃圾回收调用来自CLR的时候需要清理它。

性能问题: IMO,虽然使用的内存略多,但由于程序的性质,几乎不会出现任何性能问题。它只是一个冗余参数。