http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 11172|回复: 4

[C#入门] C#函数-形参与实参

[复制链接]
发表于 2014-7-8 05:30:44 | 显示全部楼层 |阅读模式
如果把函数比作是你设计的工厂,那么函数的参数就好比你提供给工厂的原料,函数在定义时的参数是形式参数(简称为形参),调用函数时的参数称为实际参数(简称为实参),实参可以是变量、常量、或表达式,实参与形参必须类型相同或兼容。初学者不太理解形参与实参的关系,特别是形参与实参如何传递,下面讲例子:
[C#] 纯文本查看 复制代码
namespace ConsoleApplication1
{
class Program
{
static double Bigger(double x, double y)//形参x y
{
double maxValue = (x >= y) ? x : y;
return maxValue;
}
static void Main(string[] args)
{
double a = Convert.ToDouble(Console.ReadLine());
double b = Convert.ToDouble(Console.ReadLine());
double result = Bigger(a, b);//实参a b
Console.WriteLine("最大值是:{0}", result);
}
}
}

这里程序启动时,先执行主函数内的语句,当遇到Bigger()函数时,转向执行Bigger()内的语句,Bigger()内的语句执行完毕后,返回主函数继续执行。
执行Main()主函数,double result = Bigger(a, b);   //调用函数Bigger();
执行Bigger()函数,double x=a; double y=b;       //把参数ab的值传递给形参xy,以便函数运算
                              double maxValue =(x>=y)?x:y;
                              return maxValue;
执行Main()主函数,double result = Bigger(a,b); //返回主函数,将返回值赋给变量result.
在调用函数Bigger()时,发生了从实参到形参的数据传递,程序首先为形参xy分配了内存空间,并把实参ab的值复制一份到形参中让函数Bigger()加工,这种参数传递方式称为值传递,实参ab与形参xy是互不相同的变量,他们都有自己的内存空间,当值传递完成之后,他们之间是互不相关的量,形参的变化不会影响到实参。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-7-8 05:56:56 | 显示全部楼层
本帖最后由 wwwconsumer 于 2014-7-8 05:59 编辑

下面这个例子,更有助于理解形参与实参之间的关系,就是设计一个交换数值的函数,看看形参与实参之间如何互相影响的。
[C#] 纯文本查看 复制代码
namespace ConsoleApplication1
{
    class Program
    {
        static void Swap(int x, int y)//交换变量的函数
        {
            int temp = x;
            x=y;
            y = temp;//这个过程就是设计一个空罐temp,然后将形参x、y值倒入空罐temp中达到交换x、y的值的目的
        }
        static void Main(string[] args)
        {
            int  a = Convert.ToInt32(Console.ReadLine());
            int b = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("交换前:a={0},b={1},", a,b);
            Swap(a, b);//调用交换函数,传入实参a\b的值
            Console.WriteLine("交换后:a={0},b={1}",a,b);
        }
    }
}

你运行上述程序后,发现你输入的实参a和b在交换前后都没有变化, 形参.JPG
刚才明明形参x\y交换了位置,但实参ab的位置没有变化,这证明了形参的变化不会影响到实参。
发表于 2014-7-8 08:26:43 | 显示全部楼层
今天有时间了可以和我联系开分类
 楼主| 发表于 2015-5-21 03:33:47 | 显示全部楼层
学习再启航
 楼主| 发表于 2015-5-30 16:24:33 | 显示全部楼层
在这里,为什么a\b的值没有交换呢?原来由于参数是基本类型,所以实参a/b与实参x/y是值传递的,传递完成后,函数Swap()交换的是形参X\Y的值,而没有改变实参a/b的值。
如何改变形参的同时,改变实参的值呢?答案是使用引用型参数,当使用引用型参数时,实参和形参指向同一内存空间,实参将随着形参的变化而变化。应用型参数要用ref申明,调用该函数时,也要使用ref关键字。
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Yingyong
{
    class Program
    {
        static void Swap(ref int x, ref int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main(string[] args)
        {
            int a = Convert.ToInt32(Console.ReadLine());
            int b = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("交换前:a={0},b={1}",a ,b);
            Swap(ref a, ref b);
            Console.WriteLine("交换后:a={0},b={1}",a,b );
        }
    }
}


运行结果:
ref.PNG
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-3-29 19:38

© 2014-2021

快速回复 返回顶部 返回列表