引用类型与值类型的区别:
值类型
ref把一个变量以参数的形式带到一个方法中进行改变,再将改变后的值返回(实参和形参在栈中的地址相同);[栈中也是有地址的]
不加ref,形参和实参是两个量,栈中的地址不同;
值类型的赋值是复制值
引用类型的赋值是复制的地址
1、 在C#中方法是将一堆代码进行重用的一种机制;
若调用类中的方法时,若类与Main()函数在一个类中是,类名可以省略,若不在一个类中,类名不可以省略;
2 、 返回值为数组的函数
public static int [ ] GetNumbers ( int [ ] num)
{
int [ ] res=new int [ 4 ];
res={ 1,2,3,4 };
num[0]=2; // 数组的内容会被改变
return res;
}
a:在一个方法中,同一个类型的多个值返回时,放到数组中返回即可;若类型不同,可以考虑用Out;
b: 在方法中改变值时,数组是个例外:在方法中改变数组,数组中的值会变。
3、 out
public static void Test ( int [ ] nums, out int max, out int min, out string str) ;
在调用函数是格式:Test(numbers,out max, out min ,out str1);
Test(nuber1,34,34,"hello");
注意: out参数要求在方法的内部为其赋值。
4、 ref 引用
public static void Max(ref int a1, ref int a2)
调用函数格式:Max (ref n1, ref n2) // 形参和实参前面都要有ref
ref参数侧重于将一个值带到函数中进行改变,再将改变的值带出去,ref参数在方法内不用赋值,方法外必须赋值。
注意:ref要求参数在方法之前必须为其赋值。
5、 params 可变参数
将实参列表中跟可变参数数组类型一样的元素都当做数组中的元素;
public static void Test(string str,int id, params int [ ] nums ) // 注意:参数列表中的可变数组必须是形参中的最后一个参数,并且只能有一个可变参数。
调用格式: Test("hello",34,44,33,23,32)
其中参数params int [ ] nums,可以有两种情况: a: 传一个数组,b: 传相同类型的多个数值
注意:参数列表中只能出现一个可变参数(唯一性),并且位于参数列表的最后一个。
6、函数重载
方法名相同,参数不同;
参数个数相同的话,类型应不同;参数类型相同的话,个数应不同。与返回值无关。注意:只有返回值不同不是函数重载。
Console.WriteLine(): 就是一个函数重载。
各个参数的用法
class Hello
{
static void Main(string[] argvs)
{
string str1 = "immutable";
string str2;
str2 = str1;
str2= "another"; // 虽然string是引用类型,但是由于字符串的不可变性,这里str2又指向了新的地址,所以str1与str2的内容分别是“immutable”和“another”,不一样
father fa1 = new father();
fa1.Name = "dad";
father fa2 = new father();
fa2.Name = "Bb";
father fa3 = fa1; // 这里可以看出fa1赋值给fa3,引用类型的传递
fa1.Name = "father and children";
changle(fa1);// 这里返回的引用类型值发生了改变。为:"change father's name"
// changeUseRef(ref fa2.Name);//属性、索引器、动态成员访问不可作为out、ref的参数
changeUseRef(ref str2);//改变了str2的值
string Formation;
IsLogin("Name","9999",out Formation);
int max=0;
Test_Params(max,new int[]{1,2,3,4,5});//若方法的形参没有加params,这里实参只能是数组
Test_Params(max, 1, 2, 3, 4, 5);//方法的形参加params,实参可以是数组类型相同的变量
Console.WriteLine("fa1 is content is {0}",fa1.Name );
Console.WriteLine(str2);
Console.ReadKey();
}
public static void changle(father f) { // 引用类型传递的是地址
f.Name = "change father's name";
// 下面这种方式也是传递地址
father ff = f;
ff.Name = "change father's name";
}
/// <summary>
/// 利用ref改变string的值引用
/// </summary>
/// <param name="str"></param>
public static void changeUseRef(ref string str)
{
str = "Use Ref To Change String";
}
/// <summary>
/// out参数侧重于方法中返回多个参数,out参数要求必须在方法内部为其赋值,此方法可以有返回值
/// </summary>
/// <param name="str"></param>
/// <param name="num"></param>
/// <param name="bo"></param>
public static void ReturnMultiRef(out string str,out int num,out bool bo)
{
str = "UseOutChange";
num = 200;
bo = true;
}
public static bool IsLogin( string Name, string PassWord,out string Information)
{
if(Name=="Name"&&PassWord=="1111")
{
Information = "登陆成功";
return true;
}
else if(Name!="Name")
{
Information = "用户名输入错误";
return false;
}else
{
Information = "密码输入错误";
return false;
}
}
public static void Test_Params(int max,params int[] nums)//params必须是形参列表的最后一个元素
{
max=nums[0];
foreach (var item in nums)
{
if(item>max)
{
max = item;
}
}
}
}
public class father {
string _name;
public string Name{
get { return _name; }
set { _name = value; }
}
}