引用参数和值参数
在前面的函数学习中,所有函数的参数都是有值参数:在使用参数的时候把一个值传递给函数使用的一个变量.在函数中对此变量的任何修改都不会影响函数调用中指定的参数.还是举例说明比较好:
static void doDouble(double mynum)
{
mynum *= 2;
Console.WriteLine("mynum in 函数中doDouble{0}", mynum);
}
static void Main(string[] args)
{
Console.WriteLine("引用函数");
double mynum = 15;
Console.WriteLine("调用函数之前的mynum={0}",mynum);
doDouble(mynum);
Console.WriteLine("调用函数之后的mynum={0}",mynum);
结果输出如下图所示:
在main()函数中的mynum=15;调用
doDouble(mynum);把mynum的值传递给static void doDouble(double mynum)函数中的局域变量mynum;但是局域变量mynum在此函数中的改变
没有影响main()函数中的mynum.
当然要改变mynum的值也比较简单.只要对函数做如下修改:
static double doDouble(double mynum) { mynum *= 2; Console.WriteLine("mynum in 函数中doDouble{0}", mynum); return mynum; } static void Main(string[] args) { Console.WriteLine("引用函数"); double mynum = 15; |
Console.WriteLine("调用函数之前的mynum={0}",mynum); mynum = doDouble(mynum); Console.WriteLine("调用函数之后的mynum={0}",mynum); 输出结果是 : |
但是以上的方法在改变多个参数的时候就不行了,此时可以通过引用传递参数:函数处理的变量与函数调用中使用的变量相同,在C#中使用关键字:ref指定参数,在调用函数的时候用: doDouble(ref mynum); static void doDouble( ref double mynum),这样修改后的结果与上面的结果一样:
Main()函数
Main()函数是C#应用程序的入口点,执行这个函数就是执行应用程序,也就是说在执行过程开始时候,会从Main()函数开始,当Main()执行结束之后程序运行就结束了.在应用程序中Main()函数的形式是: static void Main(string[] args);Main()函数有形式: static void Main() ,static void Main(string[] args) ,static int Main(), static int Main(string[] args).Main()函数的参数args是从应用程序的外部接受信息的方法.本文发表于编程入门网:www.bianceng.cn
结构函数
所谓结构函数就是结构体中的函数:这中函数非常实用:
struct Cloth //结构体名字 { public int age;//衣服使用寿命 public string sex;//合适性别 public string style;//款式 public double price;//价格 public double count;//折扣 public double SellPrice() { return count * price; } } |
Cloth mycloth; mycloth.age = 2; mycloth.count = 0.98; mycloth.price = 1000; mycloth.sex = "man"; mycloth.style = "长裤"; Console.WriteLine("结构体数据输出:"); Console.WriteLine("age={0},sex={1},style={2}, price={3},count={4}", mycloth.age,mycloth.sex,mycloth.style,mycloth.price,mycloth.count); double sellprice = mycloth.SellPrice(); Console.WriteLine("出售价格mycloth.SellPrice();{0}", sellprice); |
输出结果是:
如果没有结构函数,那么在计算count * price的时候就得使用:
sellprice =mycloth.price*mycloth.count.当然可以根据需要和结构体的特点而定义结构函数.
委托
委托是一种可以把引用存储为函数的类型,只有在介绍到事件和事件处理的时候才解释的清楚.委托的声明非常类型函数,但是不带函数体,而且要使用delegate,委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表.定义了委托后就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同签名的函数引用.之后就可以使用委托变量调用这个函数.先看个例题:
delegate double ProcessDelegate(double param1,double param2); static double Mult(double param1,double param2) { return param1 * param2; } static double Divide(double param1,double param2) { return param1 / param2; } |
ProcessDelegate process; double param1, param2; param1 = 16; param2 = 4; process = new ProcessDelegate(Mult); Console.WriteLine("ProcessDelegate(Mult);{0}", process(param1,param2)); process = new ProcessDelegate(Divide); Console.WriteLine("ProcessDelegate(Divide);{0}", process(param1, param2)); 程序结果是:
|
Delegate关键字指定该定义是用于委托的,而不是用于函数的, 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.
这一节里面的内容比较杂乱.大家可以通过其他方法可以深入学习各个主题.