最近白天没球事,觉得不能混吃等死,重拾了C#。
第一篇: C# 函数
这里记录的主要是跟C之间的差异:
1.可变参数:
即不定长参数。
关键词: params
/*可变参数*/
static int SumVals(params int[] i_list)
{
int l_sum = 0;
foreach (int l_i in i_list)
{
l_sum += l_i;
}
return l_sum;
}
TakeTheMax(out l_max, 1, 2, 3, 4, 5, 10, 5);
2.引用参数:
即指针参数(本人下的定义,可能不严谨)
关键词: ref
/*引用参数(指针参数)*/
static void ChangeRadian2Deg(ref double io_val)
{
io_val = io_val * 180.0 / Math.PI;
}
double l_val = 3.14;
ChangeRadian2Deg(ref l_val);
3.输出参数:
即指针参数(本人下的定义,可能不严谨)
关键词:out
/*输出参数(指针参数)*/
static void TakeTheMax(out int o_max, params int[] i_list)
{
o_max = 0;
if (i_list.Length > 0)
{
o_max = i_list[0];
}
foreach(int l_i in i_list)
{
o_max = o_max > l_i ? o_max : l_i;
}
}
int l_max = 0;
TakeTheMax(out l_max, 1, 2, 3, 4, 5, 10, 5);
4.重载:
函数名一样,但是参数不一致
/*重载,(重载比较浪费代码)*/
static void TakeTheMin(out int o_min, params int[] i_list)
{
o_min = i_list.Length > 0 ? i_list[0] : 0;
foreach(int l_i in i_list)
{
o_min = o_min > l_i ? l_i : o_min;
}
}
static void TakeTheMin(out double o_min, params double[] i_list)
{
o_min = i_list.Length > 0 ? i_list[0] : 0;
foreach(double l_i in i_list)
{
o_min = o_min > l_i ? l_i : o_min;
}
}
int l_min_int = 0;
double l_min_double = 0.0;
TakeTheMin(out l_min_int, 1, 2, 3, 4, 5);
TakeTheMin(out l_min_double, 1.0, -1.0, 2.0);
5.委托:
即指针函数
/*定义委托类型(类比函数指针)*/
delegate double DeleFuncType(double i_val_1, double i_val_2);
/*定义与委托匹配的2个函数*/
static double Multi(double i_val_1, double i_val_2)
{
return i_val_1 * i_val_2;
}
static double Add(double i_val_1, double i_val_2)
{
return i_val_1 + i_val_2;
}
/*使用委托的实例*/
static void UseDel()
{
DeleFuncType l_func;
char l_user_input;
/*获取用户输入,知道输入的为M 或者 A*/
do
{
Console.WriteLine("Enter your choise, 'M' for Multiple, 'A' for Add : ");
l_user_input = Convert.ToChar(Console.Read());
/*怎么清空输入缓冲区呢?? 怎么没有Flush函数????*/
} while (l_user_input != 'M'&&
l_user_input != 'm'&&
l_user_input != 'A'&&
l_user_input != 'a');
/*如果为M/m则相乘,否则相加*/
if ('M' == l_user_input||
'm' == l_user_input)
{
l_func = Multi;
}
else
{
l_func = Add;
}
Console.WriteLine("5.0 */+ 3.0 = {0}", l_func(5.0, 3.0));
}
6.主函数的输入参数:
在C中mian函数的第一个参数肯定是应用程序名称,但是在C#中不是!
/*主函数的参数没有包含应用程序名!!!!*/
Console.WriteLine("params num: {0}", args.Length);
using System;
namespace FuncTst
{
class Program
{
/*定义委托类型(类比函数指针)*/
delegate double DeleFuncType(double i_val_1, double i_val_2);
/*定义与委托匹配的2个函数*/
static double Multi(double i_val_1, double i_val_2)
{
return i_val_1 * i_val_2;
}
static double Add(double i_val_1, double i_val_2)
{
return i_val_1 + i_val_2;
}
/*使用委托的实例*/
static void UseDel()
{
DeleFuncType l_func;
char l_user_input;
/*获取用户输入,知道输入的为M 或者 A*/
do
{
Console.WriteLine("Enter your choise, 'M' for Multiple, 'A' for Add : ");
l_user_input = Convert.ToChar(Console.Read());
/*怎么清空输入缓冲区呢?? 怎么没有Flush函数????*/
} while (l_user_input != 'M'&&
l_user_input != 'm'&&
l_user_input != 'A'&&
l_user_input != 'a');
/*如果为M/m则相乘,否则相加*/
if ('M' == l_user_input||
'm' == l_user_input)
{
l_func = Multi;
}
else
{
l_func = Add;
}
Console.WriteLine("5.0 */+ 3.0 = {0}", l_func(5.0, 3.0));
}
/*可变参数*/
static int SumVals(params int[] i_list)
{
int l_sum = 0;
foreach (int l_i in i_list)
{
l_sum += l_i;
}
return l_sum;
}
/*引用参数(指针参数)*/
static void ChangeRadian2Deg(ref double io_val)
{
io_val = io_val * 180.0 / Math.PI;
}
/*输出参数(指针参数)*/
static void TakeTheMax(out int o_max, params int[] i_list)
{
o_max = 0;
if (i_list.Length > 0)
{
o_max = i_list[0];
}
foreach(int l_i in i_list)
{
o_max = o_max > l_i ? o_max : l_i;
}
}
/*重载,(重载比较浪费代码)*/
static void TakeTheMin(out int o_min, params int[] i_list)
{
o_min = i_list.Length > 0 ? i_list[0] : 0;
foreach(int l_i in i_list)
{
o_min = o_min > l_i ? l_i : o_min;
}
}
static void TakeTheMin(out double o_min, params double[] i_list)
{
o_min = i_list.Length > 0 ? i_list[0] : 0;
foreach(double l_i in i_list)
{
o_min = o_min > l_i ? l_i : o_min;
}
}
static void Main(string[] args)
{
double l_val = 3.14;
int l_max = 0;
int l_min_int = 0;
double l_min_double = 0.0;
/*主函数的参数没有包含应用程序名!!!!*/
Console.WriteLine("params num: {0}", args.Length);
Console.WriteLine("Sum val = {0}, {1}", SumVals(), SumVals(1, 2, 3));
ChangeRadian2Deg(ref l_val);
Console.WriteLine("Radians(3.14) = Deg({0})", l_val);
TakeTheMax(out l_max, 1, 2, 3, 4, 5, 10, 5);
Console.WriteLine("The max is : {0}", l_max);
TakeTheMin(out l_min_int, 1, 2, 3, 4, 5);
TakeTheMin(out l_min_double, 1.0, -1.0, 2.0);
Console.WriteLine("The min is : {0}, {1}", l_min_int, l_min_double);
UseDel();
Console.ReadKey();
}
}
}
最后,提出一个问题,怎么清空输入输出的缓冲区。
一般来说我 Consle.Read()了之后,需要把输入缓冲区清空,但是找了半天没找到!!!! 虽然有人推荐用ReadLine,但是还是比较不习惯!!!!