您的位置:首页 > 编程语言 > C#

C#高级编程(中文第七版) chap 3.2.2

2017-12-04 14:22 155 查看
//chap 3.2.2(3)
class Program
{
static void Main(string[] args)
{
int[] ints = {0,1,2,3,4 };
int i = 10;
Console.WriteLine("i=" + i);
Console.WriteLine("ints=" + ints[0]);
Console.WriteLine("改变后");
ChangeFun(ints, i);
Console.WriteLine("i=" + i);
Console.WriteLine("ints=" + ints[0]);
Console.ReadLine();

}
static void ChangeFun(int [] ints,int i) {
ints[0] = 100;
i = 100;
}
}


除非特殊说明,所有的参数都是通过方法来传递。但是,因为引用类型的变量只包含对象的引用,将要复制的正是这个引用,而不是对象本身,所以对底层对象的修改会保留下来。相反,值类型的对象包含的是实际数据,所以传递给方法的是数据本身的副本。

例如,int通过传递给方法,对应方法对该int的值所做的任何改变都没有改变原int对象的值,但如果把数组或其他引用类型(如类)传递给方法,对应的方法就会使用该引用改变这个数组中的值,而新值会反射在原始数组对象上。

需要注意的是,字符串的行为方式有所不同,因为字符串是不可变的(如果字符串的值改变,就会创建一个全新的字符串),所以字符串无法采用一般引用类型的行为方式。在方法调用中,对字符串做的任何改变都不会影响原始字符串。

//chap3.2.2 (4)
class Program
{
static void Main(string[] args)
{
string name = "Jack";
int[] ints = {0,1,2,3,4 };
int i = 10;
Console.WriteLine("i=" + i);
Console.WriteLine("ints=" + ints[0]);
Console.WriteLine("name=" + name);
Console.WriteLine("改变后");
ChangeFun(ints, ref i, ref name);
Console.WriteLine("i=" + i);
Console.WriteLine("ints=" + ints[0]);
Console.WriteLine("name=" + name);
Console.ReadLine();

}
//如果把一个参数传递给方法,且这个方法的输入参数前面带了ref关键字,则该方法所做的任何改变都会影响原始对象的值
static void ChangeFun(int [] ints,ref int i, ref string name) {
name = "Tom";
ints[0] = 100;
i = 100;
}
}


//chap3.2.2 (5)
class Program
{
static void Main(string[] args)
{
int j;
string testName;
Console.WriteLine("out关
9122
键字:");
outInt(out j,out testName);
Console.WriteLine("j=" + j);
Console.WriteLine("testName=" + testName);
Console.ReadLine();

}
//编译器使用out关键字来初始化。在方法的输入参数前面加上out时,传递给方法的变量可以不需要初始化,改变量通过引用传递,所以在被调用的方法中返回,对应方法对该变量进行的任何改变都会保留下来。
static void outInt(out int i,out string testName)
{
i = 100;
testName = "test";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: