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

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

值类型

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




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值