黑马程序员技术交流社区

标题: C#关于参数的学习 (自己博客里粘来的) [打印本页]

作者: 康子龙    时间: 2012-10-20 03:28
标题: C#关于参数的学习 (自己博客里粘来的)
  给方法传递参数
    参数可以通过引用或通过值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧有效。而如果变量通过值传递给方法,被调用的方法得到的是变量的一个相同的副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。
在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);
}



作者: 许庭洲    时间: 2012-10-20 20:14
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2