C#中方法的参数有四种类型: 1. 值参数类型 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出型参数 (以out 修饰符声明) 4. 数组型参数 (以params 修饰符声明)---------------------------------------------------------------------1、值类型是方法默认的参数类型,采用的是值拷贝的方式。
简单讲就是传递参数到方法体内,js、asp、mvc等写函数有带参数的话,我们外部引用都会传递值进去。function c(int c){ alert(c); return c;}var x = c(5/*5就是值参数传递*/);2和3、一般比较不常使用。
4、params 关键字可以指定在参数数目可变处采用参数的方法参数。也就是说。
使用params可以自动把你传入的值按照规则转换为一个新建的数组。这个参数个数是可控的,像1不可控,写的方法是带几个参数。
引用的时候就传递几个值进去public static void p(params object[] list){/*一般通过编列,计算结果*/for(var i = 0; i < list.length; i++){ alert(list[i]);}}object[] arr = new object[3] { 1, 'a', "k" };p(arr);。
C#参数类型有四种: 值类型 引用类型 输出类型 数组型参数 C#参数类型(1):值参数 所谓值参数,就是利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并将此拷贝传递给该方法,这样做的结果就是被调用的方法不会修改实参的值,保证了实际值的安全,在调用方法时,如果形参的类型时值类型的话,必须保证实参的类型也是值类型的数据. 例子: public class MyClass { public MyClass() { // //TODO: 在此处添加构造函数逻辑 // } public void ChangeValue(string value) { value = "Value is Changed!"; } } ------------------------------------- string value = "Value"; Response.Write(value+""); MyClass mc = new MyClass(); mc.ChangeValue(value); Response.Write(value); 效果: C#参数类型(2):引用参数 使用ref关键字可以使参数按照引用传递.在需要传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中,若使用ref关键字,则在方法定义和调用方法时都必须显式使用ref关键字. 注意ref的使用! 例子: public class MyClass { public MyClass() { // //TODO: 在此处添加构造函数逻辑 // } public void ChangeValue(ref string value) { value = "Value is Changed!"; } } ----------------------------- string value = "Value"; Response.Write(value+""); MyClass mc = new MyClass(); mc.ChangeValue(ref value); Response.Write(value); 效果: C#参数类型(3):输出参数 使用out关键字来进行引用传递,这和ref关键字很累世,不同之处在于ref要求变量必须在传递之前就进行初始化,若使用out关键字,则方法定义和调用时都必须显式的使用out关键字. 例子: public class MyClass { public MyClass() { // //TODO: 在此处添加构造函数逻辑 // } public void ChangeValue(out string value) { value = "Value is Changed!"; } } --------------------------------- string value ; MyClass mc = new MyClass(); mc.ChangeValue(out value); Response.Write(value); 效果: C#参数类型(4):数组型参数 数组型参数就是声明params关键字,用于指定在参数数目可变处采用参数的方法参数. 在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字. 例子: public class MyClass { public MyClass() { // //TODO: 在此处添加构造函数逻辑 // } public void ChangeValue(params string[] value) { foreach (string s in value) { HttpContext.Current.Response.Write(s + ""); } } } ------------------------------------------ string value1 = "Value1"; string value2 = "Value2"; MyClass mc = new MyClass(); mc.ChangeValue(value1, value2); 效果: 另: 数组类型的参数: 数组类型是引用类型的数据,所以也应归类于引用类型. public class MyClass { public MyClass() { // //TODO: 在此处添加构造函数逻辑 // } public void ChangeValue(string[] value) { value[0] = "This is Value0,Changed!"; } } ---------------------------------------------- string[] value = { "Value1", "Value2" }; Response.Write(value[0] + ""); MyClass mc = new MyClass(); mc.ChangeValue(value); Response.Write(value[0] + ""); 效果: 注意: ref和out的区别: 传递到ref参数的参数必须最先初始化,而out的参数在传递之前不必初始化.。
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
形参和实参其实没有实质区别,都是值传递。
形式上你可以发现实参是可以在其他函数里面修改的~
形参和实参最大的区别就是形参能够虽然也能够进行值得修改,但是只能够在函数内部,而实参是可以在全局范围内修改变量的值~这里需要提的是C语言有全局和局部的概念~形参就是仅仅的值传递,而当你的值传递到函数内部的时候,这个时候函数内修改的参数的地址已经不是主函数的变量地址了~也就是是说函数内对数值的任何修改都对主函数的变量没有任何影响
与之相对的实参,一般是通过指针的形式,它虽然也是传递值,但是这个值是地址,所以呢,你可以发现,地址传过去了,那么就可以像一根指针一样远程操纵者主函数内部的变量。
下面这个例子我都写好了,记住是VisualStudioC++的运行环境啊~别用TC了~
#include<stdio.h>
int main()
{
void max1(int *a,int *b);//实参例子
void max2(int c,int d);//形参例子
int *x,*y;
int e,f;char k;
printf("请输入两个数字,格式为:”数字,数字“(不包括引号)");
scanf("%d,%d",&e,&f);
printf("请输入你要演示的例子:\n 1.实参例子 \n 2.形参例子");
getchar(k);
switch(k)
{
case'1':{
x=&e;y=&f;max1(x,y);printf("这是在主函数输出的数据:e=%d,f=%d",&e,&f);
}
case'2':{max2(e,f);
printf("这是在主函数输出的数据:e=%d,f=%d",&e,&f);}
default:printf("error\n");
}
return 1;
}
void max1(int *a,int *b);//实参例子
{
int c;
if(*a>*b)
{
c=*a;*a=*b;*b=c;
}
printf("这是在max1函数输出的数据:e=%d,f=%d",a,b);
}
void max2(int c,int d);//形参例子
{
int g;
if(c>d)
{
g=c;c=d;d=g;
}
printf("这是在max2函数输出的数据:e=%d,f=%d",a,b);
}
实参:调用的地方使用的变量,可以是变量,也可以是常量
形参:声明函数的地方或者直接写子函数代码的地方用的
如
int f(int m) //m是形参
{
return m++; //这里m也是形参
}
main()
{
int a=5,b,c;
b=f(a); //这里a是实参
c=f(3); //这里3是实参
}
这样知道什么是实参,什么是形参了吧
其实不管哪里是实参,哪里是形参,这个定义名字真的无所谓,我就经常记不住,但是你只要知道怎么用即可
注意几个地方,对于参数
1、可以同名,但是不建议实参和形参同名
虽然同名可以使用,但是容易混淆
同名时,就是变量作用域的问题,有点难以把握,容易出错
2、实参和形参不在同一个内存空间中(除非实参用&来取地址直接传递过去,这个c中一般不讲,c++中才讲)。
这里产生的效果就是在子函数中改变形参的值,不会改变实参的值
&取地址时,那么形参需要指针形式,因为参数是要地址。因为同在一个内存地址中,所以可以改变实参的值
参数传递主要用于模块化程序设计中。
如果不了解参数传递是无法编写出正确的调用函数的。形参就是形式参数,用一个变量代表大家。
实参就是实际参数,用一个 确切的数值代替形式参数,可以是表达式。实际参数与形式参数的参数个数、类型和顺序都应一样,如果不一样的话,系统会强制转换,这样会造成数据的丢失。
实 参向形参的传递是值的传递。 这个值就是对实参的表达式进行计算的结果,它可以是常量值、变量值、数组元素、函数值等。
如果实参是数组名了,那么它传送的就是地址的值了。比如: double power(double x ,int n)定义一个双精度参数 power(3.0,5) 调用 x n 是形参,3.0,5是实参。
如果上面定义的是整形 double power(int x ,int n),下面调用的是power(3.3,5)那么实参中3.3会被转换成3,一部分数据丢失了。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:3.795秒