[英]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.