zoukankan      html  css  js  c++  java
  • out ref params

    out的使用

    out 能够使我们的函数返回多个类型的值,不再受返回类型的设置

    就是相当于在方法里不仅仅给了一个返回值,被out修饰的参数的值也能带出去;

    所以就是说,在方法体内被out修饰的参数,都可以在主函数内获取值来用。大致就是这样

    ————————————————————————————————————————————————— 

     在这里面被修饰的参数是msg,而且在方法体内部,对不同情况msg有不同的值;

    所以在主函数内,我们就看到,msg被定义了一下,但是,msg的值还是方法体内的值。

     1   class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5           
     6             Console.WriteLine("请输入一个用户名");
     7             string name = Console.ReadLine();
     8             Console.WriteLine("请输入一个密码");
     9             string pwd = Console.ReadLine();
    10             string msg;
    11             bool b = login(name, pwd, out msg);
    12             Console.WriteLine("登陆结果{0}",b);
    13             Console.WriteLine("登陆信息{0}",msg);
    14             Console.ReadKey();
    15             
    16         }
    17         //方法的作用就是:先定义好要实现一个什么功能的公式,然后在主函数里代入数据再代用方法,
    18         //第一步先在形参中写上out等要多余返回的参数
    19         //out参数
    20       
    21        
    22         //分别提示用户输入用户名和密码
    23         //写一个方法来判断用户名和输入的是否正确
    24         //返回给用户一个登陆结果,并且单独返回给用户一个登录信息
    25         //如果用户名错误,除了返回登陆结果之外,还要返回一个“用户名错误”
    26         public static bool login(string name,string pwd,out string msg)
    27         {
    28             //就作用户名和密码能不能匹配正确和返回相应的信息
    29             if (name == "lisi" && pwd == "123")
    30             {
    31                 msg = "登陆成功";
    32                 return true;
    33             }
    34             if (name == "lisi")
    35             {
    36                 msg = "密码错误";
    37                 return false;
    38             }
    39             if (pwd == "123")
    40             {
    41                 msg = "用户名错误";
    42                 return false;
    43             }
    44             else
    45             {
    46                 msg = "未知错误";
    47                 return false;
    48             }
    49 
    50          }
    51     }
    View Code
    1  int numm;//这个trypase自带out返回参数的类型,F12可以进去看看他的定义
    2             bool num = int.TryParse(null, out numm);
    3           //  bool num = int.TryParse("1212", out numm);
    4             Console.WriteLine(num);
    5             Console.WriteLine(numm);
    6             Console.ReadKey();
    View Code

     ————————————————————————————————————————————————

     ref的使用

    ————————————————————————————————————————————————— 

    //ref 就是讲一个变量作为参数带入到一个方法中进行改变,deng这个值改变后再将改变后的值
    //带回来。注意:无论方法有没有返回值,会将参数的值改变。只要参数被ref改变啦

    //这个方法就没有返回值return等词,照样可以将主函数内的改变掉
    //反正,我认为ref就是你在方法没有return 的时候参数只要被ref修饰,参数就会改变

    其他的没啥用

    ————————————————————————————————————————————————— 

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace ref参数
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             //double money = 5000;
    14             ////double b= jiangjin(money);
    15             //jiangjin(ref money);
    16             //Console.WriteLine(money);
    17             //Console.ReadKey();
    18             int n1 = 10;
    19             int n2 = 20;
    20             //引入第三者进行转换
    21             //int temp = n1;
    22             //n1 = n2;
    23             //n2 = temp;
    24 
    25             //不用第三者
    26             //n1 = n1 - n2;//n1:-10  n2: 20
    27             //n2=n1+n2;//n2:10 n1;-10
    28             //n1=n2-n1;//n1:20 n2:10
    29             change(ref n1,ref n2);
    30             Console.WriteLine(n1);
    31             Console.WriteLine(n2);
    32 
    33             string name = "zkb";
    34             tom(ref name);
    35             Console.ReadKey();
    36         }
    37         //ref 就是讲一个变量作为参数带入到一个方法中进行改变,deng这个值改变后再将改变后的值
    38         //带回来。注意:无论方法有没有返回值,会将参数的值改变。只要参数被ref改变啦
    39         public static void jiangjin(ref double s)
    40         {
    41             //s = s + 500;
    42             // return 在加ref之前,是无返回值的方法,还没有写return 是有错误的,加上ref之后,在主函数中方法后面的参数+ref就可以啦
    43             //ref就是方法不加return 不改变方法的类型
    44         }
    45         //这个方法就没有返回值return等词,照样可以将主函数内的改变掉
    46         //反正,我认为ref就是你在方法没有return 的时候参数只要被ref修饰,参数就会改变
    47         public static void change(ref int s1,ref int s2)
    48         {
    49             int temp = s1;
    50             s1 = s2;
    51             s2 = temp;
    52         }
    53 
    54         public static void tom(ref string name)
    55         {
    56            Console.WriteLine(  name = name + "ojbk");
    57         }
    58     }
    59 }
    View Code

    ------------------------------------------------------------------------------------------------------------------------

    关于params的知识

    //应该就是被params修饰的参数来说,params的内容就可以随意更改但是类型要一致。
    //看例子2:test的里面的int数组,被params修饰,自己可以随意添加整型的数是多少。不再固定。
    //值得一提的是:但是这个要放在方法的最后面 

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace params可变参数
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             //int[] num = {66,99,55,44, };
    14             //Test("老王",num);
    15             //Test("老王",55,55,55,9999); //从方法哪里的参数可以知道,老王后面应该是数组,但是数组的内容一旦确定就不能修改了
    16            // 但是要想改变数组的内容,要在方法里加上一个params可变参数(但是可变内容的类型要与数组类型相同),但是这个要放在方法的最后面,
    17             //应该就是被params修饰的参数来说,params的内容就可以随意更改但是类型要一致。
    18             //看例子2:test的里面的int数组,被params修饰,自己可以随意添加整型的数是多少。不再固定。
    19             //值得一提的是:但是这个要放在方法的最后面
    20            //  例如要添加一个学号
    21             //Console.ReadKey();
    22             int b = Sum(56, 56, 56, 56,45);//这里的Sum方法里面的参数被params修饰,那么,里面的数可以随意增减,但必须得是整形
    23             Console.WriteLine(b);
    24             Console.ReadKey();
    25         }
    26         public static void Test(string name, params int[] score)
    27         {
    28             int sum = 0;
    29 
    30             for (int i = 0; i < score.Length; i++)
    31             {
    32                 sum += score[i];
    33             }
    34             Console.WriteLine("我叫{0},我这次的总成绩{1}", name, sum);
    35 
    36         }
    37          public static int Sum(params int[] sum)
    38             {
    39                 int a = 0;
    40                 for (int i = 0; i < sum.Length; i++)
    41                 {
    42                     a+=sum[i];
    43                 }
    44                 return a;
    45                 //Console.WriteLine();
    46 
    47             }
    48     }
    49 }
    View Code

    Coding Change The  World  Coding Change The  World   Coding Change The  World  Coding Change The  World Coding Change The  World

    总而言之:

    out 将方法内的被修饰参数值带出去

    ref   将带进入到方法里的值改变后再带出去,无视return的存在

    params 主函数内可以对被修饰的参数进行毫无人道的增减

    //这里的role参数被out修饰,role 进入到CheckAccount方法里,
    //但是可以看到CheckAccount返回的是bool值,但是role的值还是会改变,出了方法后,
    //role的值会根据CheekAccount的逻辑改变,然后从方法里带出来,这就是Out的好处

    public IActionResult Get(string userName, string pwd) { if (CheckAccount(userName, pwd, out string role)) { Const.ValidAudience = userName + pwd + DateTime.Now.ToString(); var claims = new[] { new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") , new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"), new Claim(ClaimTypes.NameIdentifier, userName), new Claim("Role", role) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( //颁发者 issuer: Const.Domain, //接收者 audience: Const.ValidAudience, //过期时间 expires: DateTime.Now.AddMinutes(30), //签名证书 signingCredentials: creds, //自定义参数 claims: claims ); return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) }); } else { return BadRequest(new { message = "username or password is incorrect." }); } }
     private bool CheckAccount(string userName, string pwd, out string role)
            {
                role = "user";
    
                if (string.IsNullOrEmpty(userName))
                    return false;
    
                if (userName.Equals("admin"))
                    role = "admin";
    
                return true;
            }
     int zz ;
     string e = get("a", "b", out zz);
    
    当我们将Out用于方法内部的时候,只是需要将out修饰的zz,在方法外声明一下就行了,赋不赋值都无所谓,
    因为out修饰的一定要在方法内赋值的。
    然后出了方法zz的值就变了;
    public static string get(string a,string b,out int c) { c = 1; c = c + 100; return a + b; }

    感觉更多的用法还是TryParse这个上面
    关于什么时候用OUT
    out表示参数传出的。一般是用作函数返回多个值时使用
    例如:Int32的TryParse函数,它用作把一个对象转化为Int32类型。

    string s = "123";
    Int32 a;
    bool canParse = Int32.TryParse(s, out a);

    Console.WriteLine("canParse的值是"+canParse);//true
    Console.WriteLine("a的值是" + a);//123
    Console.ReadKey();

    也就是说TryParse实际有2个返回值,一个在canParse里,是一个bool值,表示是否能够转换。

    另一个返回值在a里,如果能转换,a就是转换后的结果。

    也就是说可以用来实验一个参数是不是你要的类型;比如前端传过来一个字符串,你不知道他是不是时间类型,就可以用Out来比较,

      

    DateTime mydate;
    if (!DateTime.TryParse(myset.Tables[0].Rows[0]["z"].ToString(), out mydate))//备注:如果符合这个时间类型的话,那么mydate的值就是前面取出来的值
    {
        Exception ex = new Exception("wnd.attribute8 = [" + myset.Tables[0].Rows[0]["z"].ToString() + "],无法转换为DateTime类型");
        throw ex;
    }

    TryParse(a,b)的用法就是将a类型转成b类型; 上面就是判断从数据库中取出来的数据判断是否满足验证要求。

    DateTime date;
    bool b = DateTime.TryParse("2020/7/23", out date);//这个结果就是b是true,因为'2020/7/23'  符合时间类型的格式;而且date的值也变成了2020/7/23
    //bool bb= DateTime.TryParse("123", out date);//这个123没办法转成时间格式,bb就是false,而date还是0:00:00 的样式

  • 相关阅读:
    使用WebAPI流式传输大文件(在IIS上大于2GB)
    网页扫描仪图像上传
    网页高拍仪图像上传
    C++
    Tomcat Connector三种执行模式(BIO, NIO, APR)的比較和优化
    编程精粹--编写高质量C语言代码(1):假想编译程序
    一个软件项目的总纲性的測试计划叫什么?
    Java字符串的格式化与输出
    Servlet入门(第一个Servlet的Web程序)
    求职小技巧,赢得大机会
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/7994583.html
Copyright © 2011-2022 走看看