簡體   English   中英

靜態方法和實例方法C#

[英]Static methods and instance methods C#

以下示例來自C#Key中的Programming

程序的第一次迭代是典型的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);
}

在第二個版本中究竟發生了什么,使它比第一個版本更友好? 是否在第一次迭代中由DayOfYear方法創建了Date類型的對象? 我知道該方法的實例版本可以直接訪問結構的字段,但我不知道它的獨特優勢。

在第二個版本中,對象本身提供所有信息,而不是靜態上下文中的日期參數。 如果該方法使用對象自己的數據而不是被參數“告知”它是什么,那么它更面向對象。

一年中的某一天沒有在第一個版本中創建日期。 它只是評估參數。 第二個版本更多OO,因為它在您的類的實例上運行而不是靜態方法調用。 這通常可以使事情更有條理,更有用。

在示例2中,您使用Date結構的內部變量iYear, iMonth and iDay 第一個示例使用Date對象的另一個副本,您將傳遞給不需要的DayOfYearFunction。

編輯:

在第一個示例中,您使用Date結構的實例並將其作為參數傳遞給DayOfYear函數,Date(dateParam)的實例在堆棧上分配,這將使用更多內存並需要來自CLR的額外垃圾收集調用什么時候需要清理。

性能問題: IMO雖然使用的內存略多,但由於程序的性質,幾乎不會出現任何性能問題。 它只是一個冗余參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM