in,out,ref都可能作为方法参数据修饰符,从字面意思可就可以理解这三个关键字的含义,那用法是什么样子的呢,通过demo来看一下。

定义一个引用类型Order

public class Order
{public string OrderNo { get; set; }public override string ToString(){return OrderNo;}
}

in参数用法:

Console.WriteLine("in 参数 只能从外部把值传入方法内部使用");
var i = 10;
InMethod01(in i);
Console.WriteLine($"外:{i}");
//InMethod01(in 10);//错误,in后不能是实际的数据//可以直接传入数据
InMethod01(10);//order内的OrderNo传入方法内部有可能被改掉,但order不可以被替换
var order = new Order { OrderNo = "O000000" };
InMethod02(in order);
Console.WriteLine($"外:{order}");
//InMethod02(in new Order { OrderNo = "abcd" });//错误,in后不能是实际的数据//可以直接传入数据
InMethod02(new Order { OrderNo = "O000000" });//int i1;
//Order order1;
//InMethod03(in order1 in i1);//错误,不能是没有赋值的变量int i1 = 1;
Order order1 = new Order() { OrderNo = "O000000" };
//方法的参数列表中可以有多个in
InMethod03(in order1, in i1);//错误,不能是没有赋值的变量InMethod03(new Order { OrderNo = "O000000" }, 20);static void InMethod01(in int i)
{//i = 10;//错误Console.WriteLine($"内:{i}");
}
static void InMethod02(in Order order)
{//order = new Order();//错误order.OrderNo = "O000002"; //正确,这里可以参数成员赋值Console.WriteLine($"内:{order}");
}
static void InMethod03(in Order order, in int i)
{//i = 10;Console.WriteLine($"内:{i}");//order = new Order(); //错误//order.OrderNo = "O000001"; //正确,这里可以参数成员赋值Console.WriteLine($"内:{order}");
}

out参数用法:

Console.WriteLine("out 参数,是从方法内部把数据带出来");//定义调用一起
OutMethod01(out int i1);
Console.WriteLine($"外 :{i1}");//定义调用分开
int i2=20; //即使赋值,方法内部接收不到
OutMethod01(out i2);
Console.WriteLine($"外  :{i2}");//定义调用一起
OutMethod02(out Order order1);
Console.WriteLine($"外  :{order1}");//定义调用分开
Order order2;
OutMethod02(out order2);
Console.WriteLine($"外  :{order2}");//多个out同时存在
OutMethod03(out Order order3, out int i3);
Console.WriteLine($"外  :{order3}");
Console.WriteLine($"外  :{i3}");Order order4;
int i4=20;//这里的20是能传入OutMethod03中的,但在方法内部,不能在给i赋值前使用
OutMethod03(out order4, out i4);
Console.WriteLine($"外  :{order4}");
Console.WriteLine($"外  :{i4}");//带有out的参数,在方法内即使有值,也能不使用,只有赋值后才能使用
static void OutMethod01(out int i)
{//Console.WriteLine(i);//错误i = 10;Console.WriteLine(i);
}
static void OutMethod02(out Order order)
{//Console.WriteLine(order); //错误order = new Order { OrderNo = "O000001" };Console.WriteLine(order);
}
static void OutMethod03(out Order order, out int i)
{//Console.WriteLine(i);//错误//Console.WriteLine(order); //错误i = 10;order = new Order { OrderNo = "O000001" };Console.WriteLine(i);//错误Console.WriteLine(order); //错误
}

ref参数用法:

Console.WriteLine("ref 参数,即能把外部的数据传入,也能把方法里的参数变化值传出,这里更多的是把参数转成一个引用,穿透方法内外共享");//RefMethod01(ref 10);//错误,这里只能传入一个变量,不能是具体的数据//int i1;//错误,ref要求传入必须有值
//RefMethod01(ref i1);//错误
int i1 = 1;
RefMethod01(ref i1);
Console.WriteLine($"外 :{i1}");var order1 = new Order { OrderNo = "O000000" };
RefMethod02(ref order1);
Console.WriteLine($"外 :{order1}");Order order2 = new Order { OrderNo = "O000000" };
int i2 = 1;
RefMethod03(ref order2, ref i2);
Console.WriteLine($"外 :{order2}");
Console.WriteLine($"外 :{i2}");static void RefMethod01(ref int i)
{Console.WriteLine($"前:{i}");i = 10;Console.WriteLine($"后:{i}");
}
static void RefMethod02(ref Order order)
{Console.WriteLine($"前:{order}");order = new Order { OrderNo = "O000001" };Console.WriteLine($"后:{order}");
}
static void RefMethod03(ref Order order, ref int i)
{Console.WriteLine($"前:{i}");Console.WriteLine($"前:{order}");i = 10;order = new Order { OrderNo = "O000001" };Console.WriteLine($"后:{i}");Console.WriteLine($"后:{order}");
}

方法参数修饰符in,out,ref相关推荐

  1. C#的方法的参数修饰符详解

    方法参数修饰 (啥也没有) 如果参数的修饰是啥也没有,那么其参数传递的方式是值传递,接受方收到的是原始数据的拷贝 out 说明了参数是引用传递. params 可变参,注意了这种修饰符针对的参数一定是 ...

  2. .net程序员的盲点(一):参数修饰符ref,out ,params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...

  3. 参数修饰符ref,out ,params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...

  4. 参数修饰符 params、 out、ref

    /// <summary> /// 参数修饰符 params. out.ref /// </summary> using System; namespace ConDemo { ...

  5. C#参考之方法参数关键字:params、ref及out

    params 使用 params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 如果未发送任何参数,则 pa ...

  6. java域的控制修饰符可分为_Java中的类和方法的修饰符

    java 中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类 ...

  7. java方法和变量修饰符有哪些_死磕Java基础---类,变量和方法的修饰符

    欢迎关注微信公众号:一个自学的程序员 类修饰符 对于类的修饰符,毫无疑问是用来修饰类的,那么,修饰类的修饰符都有哪些? 有如下这些: 1. abstract 2. final 3. private 4 ...

  8. C#基础知识-方法参数Params、In、Ref、Out

    方法参数时可以使用的关键字: params 指定此参数采用可变数量的参数. in 指定此参数由引用传递,但只由调用方法读取. ref 指定此参数由引用传递,可能由调用方法读取或写入. out 指定此参 ...

  9. ES6-13 正则方法、修饰符yus、UTF_16编码方式

    修饰符 m multiLine 对于str中含\n的情况 g global i ignoreCase 元字符 反斜杠加转义 元字符 含义 简写 \w 匹配字母.数字.下划线.等价于'[A-Za-z0- ...

最新文章

  1. Pytorch | BERT模型实现,提供转换脚本【横扫NLP】
  2. Python_赋值和深浅copy
  3. 【Android开发教程】一、基础概念
  4. Make!Sense 动手好伴侣,带你轻松做实验
  5. Replace Error Code with Exception(以异常取代错误码)
  6. 角标越界 Java_【新人求助】利用占位符操作数据库是总是提示数组角标越界是怎么回事 - Java论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  7. 服务端断开_Java多线程技术:实现多用户服务端Socket通信
  8. 颜色和心理年龄测试软件,超准的色彩心理学:选8个颜色,就可以测出你的心理年龄...
  9. 小米路由器(R2D)开发版-固件分析
  10. 于NXP芯片第一次无法进入CAN中断的问题
  11. 2022年熔化焊接与热切割操作证考试题库及答案
  12. YUV Alpha Blend 推导过程
  13. OUC_SE_Group04_Blog1
  14. Mysql培训第一天
  15. 面试mysql之SQL优化总结一:索引的使用
  16. 使用 spacedesk 与 parsec 让安卓平板 或者电脑 作为电脑的拓展屏 的简单介绍
  17. Debian11 更换软件源
  18. Markdown之表格table的处理
  19. linux 时区设置 美国西部,美国西部太平洋时区是几区?
  20. Vue页面偶尔样式错乱,刷新即恢复

热门文章

  1. 删除远程桌面登陆痕迹
  2. Linux Command Line 解析
  3. 我的新书,《人人都是产品经理》自序
  4. Accoridion折叠面板
  5. 线上问题随笔记录数据库连接池问题
  6. 详解T-SQL的联接机制
  7. IT行业 侃侃富士康
  8. SQL 中的unicode字符
  9. 发布软件之前,怎样告诉用户怎么用
  10. 隐藏文件始终不能显示的完美解决方法