2012-09-21 147 views
1

以下示例來自本書中的C#編程中的密鑰#靜態方法和實例方法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創建的嗎?我知道該方法的實例版本可以直接訪問結構的字段,但我不知道它的明顯優勢。

回答

1

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

編輯:

在您使用日期結構的一個實例,並將其作爲參數傳遞給DAYOFYEAR函數的第一個例子中,日期(dateParam)的實例,其將使用棧上分配更多的內存,並且需要清理時需要從CLR進行額外的垃圾回收調用。

性能問題:國際海事組織,雖然稍微使用了更多的內存,但由於程序的性質,幾乎不會出現任何性能問題。這只是一個冗餘參數。

+0

你能解釋一下(如果它在合理理解的範圍內)當第一個例子中的方法使用Date對象的另一個副本時發生了什麼?這是否涉及使用更多的內存,性能問題或更可能兩者? – wootscootinboogie

+0

@wootscootinboogie編輯我的答案澄清。希望這有助於 –

+1

謝謝。我已經在學習c#大約兩個星期了,而不是像過去那樣讓內部工作順利進行,並儘可能快地開始工作,我試圖做正確的事情,並得到我所有的鴨子在我之前連續。謝謝 :) – wootscootinboogie

1

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

1

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