C#的引用参数和值参数

引用参数和值参数

在前面的函数学习中,所有函数的参数都是有值参数:在使用参数的时候把一个值传递给函数使用的一个变量.在函数中对此变量的任何修改都不会影响函数调用中指定的参数.还是举例说明比较好:

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关键字指定该定义是用于委托的,而不是用于函数的, 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.

这一节里面的内容比较杂乱.大家可以通过其他方法可以深入学习各个主题.

时间: 2024-09-03 14:00:54

C#的引用参数和值参数的相关文章

c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析

以下是对c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区进行了详细的分析介绍,需要的朋友可以过来参考下   复制代码 代码如下: #define Test using System; namespace Wrox.ProCSharp.ParameterTestSample ...{  class ParemeterTest  ...{     static void TestInt(int[] ints,int i)     ...{         ints[0] = 10

[多问几个为什么]为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?

昨天有一个比较爱思考的同事和我提起一个问题:为什么匿名内部类使用的局部变量和参数需要final修饰,而外部类的成员变量则不用?对这个问题我一直作为默认的语法了,木有仔细想过为什么(在分析完后有点印象在哪本书上看到过,但是就是没有找到,难道是我的幻觉?呵呵).虽然没有想过,但是还是借着之前研究过字节码的基础上,分析了一些,感觉上是找到了一些答案,分享一下:也希望有大牛给指出一些不足的地方. 假如我们有以下的代码:  1 interface Printer { 2     public void p

值参数,形式参数,方法

问题描述 值参数,形式参数,方法 class test {public static void Refchar(ref string str) {str="250";} public static void Valuechar(string str) {str="250"} static void Main() {string st="249"; valuechar(st); Console.writeline("valuechar:{

在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错

问题描述 在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错 javax.el.PropertyNotFoundException: Property 'userAccount' not found on type java.lang.String 上面是报错信息, 下面是JSP页面: 用户名: ${commentlist.userAccount.userName } 职业: ${commentlist.userAccount.job } ${commentl

参数传递-【Maven】 maven的参数透传。 测试code中引用pom.xml 的参数

问题描述 [Maven] maven的参数透传. 测试code中引用pom.xml 的参数 需求: 1, code 中有一些参数需要经常改变其指定值. 2, 希望在pom.xml(或地方存储这些值) 3, 在使用mvn 执行时使用 mvn -DXXX=XXXX 替换pom.xm中的参数值. 问题: 查阅资料发现, mvn -DXXX 一般都是替换pom.xml 中的引用值, 且替换的值都是mvn执行插件或功能值.但我在工程code 中该怎么引用pom.xml 中指定的值呢? pom.xml 中设

C#参数返回值

问题描述 voidButton8Click(objectsender,EventArgse){stringb1="0";stringb2="0";fiox(b1,b2);textBox4.Text=b1+b2;}publicvoidfiox(stringa1,stringa2){a1="1";a2="2";}b1与b3返回还是0应该怎么写,谢谢 解决方案 解决方案二:refstringa1,refstringa2解决方案三:p

java基础:所有参数皆是按值参数

c#中对于参数的传递,有二种处理方式,默认情况下:值类型的参数,按值传递(即:方法体内的参数是原值的副本):引用类型的参数,"加ref关键字后",按引用传递(即:方法体内的参数,是对象的指针引用,在方法体内修改了对象的属性,方法调用完成后,这种变化也会保持下去). java虽然也是OO语言,但是这一点有很大不同,不管是"值"类型的简单参数(比如:int),还是"引用"类型的对象参数(比如:Object),参数永远是按值传递(参数永远是原值的副本)

关于C++引用做为函数参数和指针作为函数参数

关于C++引用做为函数参数和指针作为函数参数 个人感觉引用和指针有着很多相识的地方 参考http://blog.itpub.net/7728585/viewspace-2113049/ 我们这里编写两段函数如下: 1.   AT_NAME & at_r (AT_NAME & cp,const AT_NAME & in_s)   {       cp = in_s;       return cp;   } 2.    AT_NAME* at_p (AT_NAME *cp , con

关于存储过程的ADO调用的一些心得(输出参数,返回值)

ado|存储过程|心得 在一个项目中,我需要用到存储过程来访问数据,为了提供一个比较一致的接口以便调用,我没有使用CreateParameter(),而是调用CommandPtr的Refresh()函数先从数据库中查询参数._ConnectionPtr m_pConn;m_pConn.CreateInstance(__uuidof(Connection));m_pConn->Open("driver={SQL Server};server=127.0.0.1;DATABASE=pub;UI