C# 重载的几种实现
算法重用是非常普遍的需求,在C#中可以使用如下手段实现,非常简单,自己记录一下,方便查询。
以一个小功能为例来说明一下:打印1-5这5个数,和A-E这5个字符。
重载方式
static void Main(string[] args) { PrintValues(1, 5); PrintValues('A', 'E'); Console.ReadLine(); } private static void PrintValues(int startIndex, int endIndex) { if (startIndex > endIndex) { int temp = endIndex; endIndex = startIndex; startIndex = temp; } for (int i = startIndex; i <= endIndex; i++) { Console.WriteLine(i.ToString()); } } private static void PrintValues(char startIndex, char endIndex) { if (startIndex > endIndex) { char temp = endIndex; endIndex = startIndex; startIndex = temp; } for (char i = startIndex; i <= endIndex; i++) { Console.WriteLine(i.ToString()); } }
默认值方式
static void Main(string[] args) { PrintValues(1); PrintValues('A'); Console.ReadLine(); } private static void PrintValues(int startIndex, int endIndex = 5) { if (startIndex > endIndex) { int temp = endIndex; endIndex = startIndex; startIndex = temp; } for (int i = startIndex; i <= endIndex; i++) { Console.WriteLine(i.ToString()); } } private static void PrintValues(char startIndex, char endIndex = 'E') { if (startIndex > endIndex) { char temp = endIndex; endIndex = startIndex; startIndex = temp; } for (char i = startIndex; i <= endIndex; i++) { Console.WriteLine(i.ToString()); } }
好吧,对于很多含有默认值的函数来说,这个是有效减少重载的方式。
泛型方式
这个例子我简单试了一下,没找到使用泛型合适的方式,壮士,教我!好在我直接使用dynamic实现了,也不怎么纠结。看其中的交换的那个可能实现:
static void Main(string[] args) { int startIndex = 1; int endIndex = 5; Swap<int>(ref startIndex, ref endIndex); char startCharIndex = 'A'; char endCharIndex = 'E'; Swap<char>(ref startCharIndex, ref endCharIndex); Console.ReadLine(); } private static void Swap<T>(ref T startIndex, ref T endIndex) { T temp = endIndex; endIndex = startIndex; startIndex = temp; }
当然了,强大的泛型可不是这么简单货,感兴趣自己搜索。
dynamic方式
static void Main(string[] args) { PrintValues(1, 5); PrintValues('A', 'E'); Console.ReadLine(); } private static void PrintValues(dynamic startIndex, dynamic endIndex) { if (startIndex > endIndex) { dynamic temp = endIndex; endIndex = startIndex; startIndex = temp; } for (dynamic i = startIndex; i <= endIndex; i++) { Console.WriteLine(i.ToString()); } }
简单,当只需要运行时行为的时候,或者是不希望编辑器检查的时候,dynamic真是方便。