C#值类型与引用类型、 out 、 ref、 params 参数、函数重载、数组为函数参数或返回值

来源:互联网 发布:青少年编程最好的机构 编辑:程序博客网 时间:2024/05/20 11:51

引用类型与值类型的区别:

值类型

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; }         }     }




阅读全文
0 0
原创粉丝点击