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

//#define Test

using System;



namespace Wrox.ProCSharp.ParameterTestSample
{

class ParemeterTest
 
{
       
staticvoid TestInt(int[] ints,int i)
{
 ints[
0] =100;
i
=100;
}


 
staticvoid TestInt(int[] ints, refint i)
{
     ints[
0] =200;
     i
=200;
}


staticvoid TestInt2(int[] ints, outint i)
{
     ints[
0] =300;
     i
=300;
}



publicstaticvoid Main()
{
     
int i=0;
     
int[] ints ={0,1,2,3,4};

      Console.WriteLine(
"-----------TestInt------------------");

      Console.WriteLine(
"i={0}",i);
      Console.WriteLine(
"ints[0]={0}",ints[0]);
      Console.WriteLine(
"------------------------------------");

      
//默认情况下,c#所有参数都是通过值引用的,所以值类型i在上面的函数调用时,传送的只是一个副本,函数只是在调用过程中影响了副本的值,对i值实际并没有影响
    
 TestInt(ints, i);

      Console.WriteLine(
"i={0}",i);//这里输出的i值仍然是0
    
 Console.WriteLine("ints[0]={0}",ints[0]);
      Console.WriteLine(
"------------------------------------");

    
//如果要改变i的值,可以用ref让参数i通过引用传送给函数
   
 TestInt(ints, ref i);

      Console.WriteLine(
"i={0}",i);//这里输出的i值为200
    
 Console.WriteLine("ints[0]={0}",ints[0]);
      Console.WriteLine(
"------------------------------------");

  
//要改变i的值,也可以通过out关键字让
      TestInt2(ints, out i);

      Console.WriteLine(
"i={0}", i);//这里输出的i值为300
      Console.WriteLine("ints[0]={0}", ints[0]);
      Console.WriteLine(
"------------------------------------");

    
/ /ref与out很相似,但有也区别,ref必须要求参数初始化,out则不需要
   
#if Test//要测试下面的二行,把代码第一行#define Test去掉注释即可
    
int j;
     SomeFunction(ints,
ref j);//编译时会报错: 使用了未赋值的局部变量“j”
  
#endif

    
int k;
    TestInt2(ints,
out k);
    Console.WriteLine(
"k={0}", k);
    Console.WriteLine(
"------------------------------------");

    Console.ReadLine();
   }

}


}

运行结果;

 

-----------TestInt------------------
i=0
ints[0]=0
------------------------------------
i=0
ints[0]=100
------------------------------------
i=200
ints[0]=200
------------------------------------
i=300
ints[0]=300
------------------------------------
k=300
------------------------------------

文章来源:http://www.cnblogs.com/yjmyzz/archive/2007/12/09/988590.html  Jimmy.Yang

posted @ 2013-06-01 23:56  dean.wei  阅读(166)  评论(0编辑  收藏  举报