using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _02值传递与引用传递
{
class Program
{
static void Main()
{
Console.WriteLine("*****传递分四种情况:1、分别是值传递值类型,2、引用传递值类型,3、值传递引用类型,4、引用传递引用类型");
Console.WriteLine("***************");
Console.WriteLine("1、值传递值类型,");
int n = 5;
Console.WriteLine("调用值传递值前的n值: {0}", n);
ZhiChuanzhi(n);
Console.WriteLine("调用值传递值之后n值发生改变: {0}", n);
Console.WriteLine("变量 n 为值类型,包含其数据(值为 5)。当调用 ZhiChuanzhi 时,n 的内容被复制到参数 x 中,在方法内将该参数求平方。但在 Main 中,n 的值在调用 ZhiChuanzhi 方法前后是相同的。实际上,方法内发生的更改只影响局部变量 x。");
Console.WriteLine("***************");
Console.WriteLine("2、引用传递值类型,");
YinyChuanzhi(ref n);
System.Console.WriteLine("调用引用传递值之后n值发生改变: {0}", n);
Console.WriteLine("本示例中,传递的不是 n 的值,而是对 n 的引用。参数 x 不是 int 类型,它是对 int n 的引用。因此,当在方法内对 x 求平方时,实际被求平方的是 x 所引用的项:n。");
Console.WriteLine("***************");
Console.WriteLine("3、值传递引用类型,");
int[] arr = { 1, 4, 5 };
Console.WriteLine("在 Main 内, 调用该方法的前第一个元素是: {0}", arr[0]);
Change(arr);
Console.WriteLine("在 Main 内, 调用该方法后的第一个元素是: {0}", arr[0]);
Console.WriteLine("在上个示例中,数组 arr 为引用类型,在未使用 ref 参数的情况下传递给方法。在此情况下,将向方法传递指向 arr 的引用的一个副本。输出显示方法有可能更改数组元素的内容,在这种情况下,从 1改为 888。但是,在 Change 方法内使用 new 运算符来分配新的内存部分,将使变量 pArray 引用新的数组。因此,这之后的任何更改都不会影响原始数组 arr(它是在 Main 内创建的)。实际上,本示例中创建了两个数组,一个在 Main 内,一个在 Change 方法内。");
Console.WriteLine("***************");
Console.WriteLine("4、引用传递引用类型");
int[] arra = { 1, 4, 5 };
System.Console.WriteLine("在 Main 内, 调用该方法的之前第一个元素是: {0}", arr[0]);
Changeto(ref arra);
System.Console.WriteLine("在 Main 内, 调用该方法的之后第一个元素是: {0}", arr[0]);
Console.WriteLine("方法内发生的所有更改都影响 Main 中的原始数组。实际上,使用 new 运算符对原始数组进行了重新分配。因此,调用 Change 方法后,对 arr 的任何引用都将指向 Changeto 方法中创建的五个元素的数组。");
Console.ReadKey();
}
// 该参数的值是通过值传递的。
// 更改不会影响x的原始值
static void ZhiChuanzhi(int x)
{
x *= x;
Console.WriteLine("在值传递传值方法的内部X进行自乘的结果: {0}", x);
}
// 该参数的值是通过引用传递值的。
// 更改不会影响x的原始值
static void YinyChuanzhi(ref int x)
{
x *= x;
Console.WriteLine("在引用传递传值方法的内部X进行自乘的结果: {0}", x);
}
//值传递引用类型
static void Change(int[] pArray)
{
pArray[0] = 888; // 此项更改会影响原始值
pArray = new int[5] { -3, -1, -2, -3, -4 }; // 这个更改是局部的.
Console.WriteLine("在方法内部的第一个元素是: {0}", pArray[0]);
}
static void Changeto(ref int[] pArray)
{
// Both of the following changes will affect the original variables:
pArray[0] = 888;
pArray = new int[5] { -3, -1, -2, -3, -4 };
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
}
}
}
转载于:https://my.oschina.net/qau/blog/506064