A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 康子龙 中级黑马   /  2012-10-20 03:28  /  1688 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  给方法传递参数
    参数可以通过引用或通过值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧有效。而如果变量通过值传递给方法,被调用的方法得到的是变量的一个相同的副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。
在C#中,除非特别说明,所有的参数都是通过值来传递。但是,在理解引用类型的含义时需要注意。因为引用类型的变量只包含对象的引用,将要复制的正是这个引用,而不是对象本身。所以对底层的修改会保留下来。相反,值类型的对象包含的是实际数据,所以传递给方法的是数据本身的副本。例如,int通过值传递给方法,对应方法对该int的值所做的任何改变都没有改变原int对象的值。但如果把数组或其它引用类型(如类)传递给方法,对应的方法就会使用该方法改变这个数组中的值,而新值会反射在原始数组对象上。例如:
class ParameterTest
{
static void SomeFunction(int[] ints,int i)
{
  ints[0]=100;
  i=100;
}
public static void Main()
{
  int i=0;
  int[] ints={0,1,2,4,8};
  //Display
  Console.WriteLine("i="+i);
  Console.WriteLine("ints[0]="+ints[0]);
  Console.WriteLine("-------------------");
  SomeFunction(ints,i);
  Console.WriteLine("i="+i);
  Console.WriteLine("ints[0]="+ints[0]);
}
}
结果如下:


    注意字符串的行为方式有所不同,因为字符串是不可变的(如果改变字符串的值,就会创建一个全新的字符串),所以字符串无法采用一般引用类型的行为方式。在方法调用中,对字符串所做的任何改变都不会影响原始字符串。
    1.ref参数
    通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此要使用ref关键字。如果使用ref关键字传参则该方法对变量所作的改变会影响变量的原始值:
static void SomeFunction(int[] ints,ref int i)
{
ints[0]=100;
i=100;
}
  在调用该方法时,还需要添加ref关键字:
SomeFunction(ints,ref i);
  C#里要求对传递给方法的参数进行初始化。  2out参数  在方法的输入参数前面加上out前缀时,传递给该方法的变量可以不初始化(事实上即使是已赋值参数也会在函数执行时丢失值)。该变量通过引用传递,同ref参数相似:
static void SomeFunction(out int i)
{
i = 100;
}
public void Main()
{
int i;
SomeFunction(out i);
Console.WriteLine(i);
}

  3.命名参数  参数一般需要按定义的顺序传送给方法。命名参数允许按任意顺序传递。
string FullName(string firstName, string lastName)
{
return firstName + " " + lastName;
}
FullName("Allen","Iverson");
FullName(lastName:"Iverson",firstName:"Allen");

  上面的两个执行结果是相同的。  4.可选参数可选参数必须为其提供默认值,可选参数还必须是否能够发定义的最后一个参数。
void TestMethod(int notOptionalNumber,int optionalNumber=10)
{
Console.WriteLine(optionalNumber+notOptionalNumber);
}


评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

1 个回复

正序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马