C#编程语言中有“值类型”与“引用类型”之分。讲这个概念之前,先说明一下什么是“形式参数”(简称:“形参”),什么是“实际参数”(简称“实参”)。
“形参”("形式参数"): C#方法中的参数列表,即可以称为“形式参数",因为在程序运行之前,我们是不能知道具体的参数到底是什么。
"实参"("实际参数"): 给C#定义的带参方法,进行实际赋值的代码数值,称为“实参”。因为我们可以知道或者估计实际运行过程中参数的数值类型与数值多少。
知道以上概念后,我们再来说明“值传递”与“引用传递”
所谓值传递是指: “实参”传递给“形参”为本身的一个拷贝副本。
所谓引用传递指: “实参”传递给“形参”为本身的“地址”作为数值给形参。
软件编程中正确理解值传递与引用传递,对设计优秀软件有重要作用。
关于本节知识点,我们总结如下规则:
规则1: 基本数据类型(int,float ,double,char),都是值传递。
规则2: 类的实例化对象与数组都是“引用”传递。
规则3: ref (输入输出)关键字可以把基本数据类型的值传递,改为“引用传递”。
规则4: 字符串不是基本数据类型,但是它默认也是“值传递”,当然可以通过ref 变为引用传递。
一般我们学习本节,还会增加一个常用关键字:out 。 这个关键字定义方法的参数为“输出参数”,使得一个方法,具备多个输出参数。(否则只能用方法的返回类型,做唯一的返回类型)。
为了更好的理解C#的“形参”与“实参”,笔者提供如下习题,供C#初学者进行研究学习,不明之处,欢迎留言讨论!
//习题: 学习面向对象编程: 值类型与引用类型
class Program
{
//值类型
public void AddNumber(int num1) //num1 称为 “形参”
{
num1 = num1 + 100;
}
//引用类型
public void AddNumberWithRef(ref int num1)
{
num1 = num1 + 100;
}
//引用类型(传递)
public void AddNumberByArray(int[] intArray)
{
intArray[0] = intArray[0] + 100;
}
//引用传递(对象类型)
public void AddNumberByPerson(Person per)
{
per.IntHeight = 200;
per.strName = "李四";
}
//字符串传递
public void AddNumberByString(ref string str)
{
str = str + "大家好!";
}
//演示out 关键字的作用
public void ComputNumber(int intNum1,int intNum2,out int intAddResult,out int intSubResult)
{
intAddResult = intNum1 + intNum2;
intSubResult = intNum1 - intNum2;
}
static void Main1(string[] args)
{
//Person perObj = new Person();
Program obj = new Program();
//int intTestNum = 10;
//int[] intArray = new int[1];
//intArray[0] = 20;
//string strTest = "同学们";
//"值传递" 测试,传递的是“复制品”
//obj.AddNumber(intTestNum); //intTestNum 称为“实参” ,结果是:10
//"引用数据传递"测试。
//obj.AddNumberWithRef(ref intTestNum);//结果为: 110.
//obj.AddNumberByArray(intArray); //结果为: 120;
//“对象”数据传递
//obj.AddNumberByPerson(perObj);
//字符串的传递测试
//obj.AddNumberByString(ref strTest);
//演示out 关键字作用
int intAddResult = 0;
int intSubResult = 0;
obj.ComputNumber(10, 20, out intAddResult, out intSubResult);
//显示结果
Console.WriteLine("10+20={0},10-20={1}",intAddResult,intSubResult);
}
}