ref,out,int参数复习
ref
结构是值类型,按值传递。通过关键字ref,也可以通过引用传递结构。
public static void ChangeA(ref A a)
{
a.X = ;
}
//如果A是结构类型,就添加ref修饰符,修改ChangeA方法的声明,通过引用传递变量
在Main函授中执行,按照引用传递,所以结果是2。
A a1 = new A {X =};
ChangeA(ref a1);
Console.WriteLine(a1);
//给方法参数应用了ref修饰符后,在调用方法时需要添加它。
使用ref后,也可以传递对引用的引用(在C++术语中,是一个指向指针的指针),它允许分配一个新对象。
public static void ChangeA(A a)
{
a.X = ;
a = new A {X = };//这一行在堆栈上创建了一个新对象,和一个对新对象的引用。Main()方法中使用的变量a1仍然引用值为1的旧对象。ChangeA方法结束后,没有引用堆栈上的新对象,可以回收它。所以这里的Main()方法里输出结果仍然是1.
} //添加ref修饰符后,传递对引用的引用,允许分配新对象,此时Main()方法里,输出结果是3.
public static void ChangeA(ref A a)
{
a.X = ;
a = new A {X = };
}
完整代码
using System; namespace refDemo
{
class Program
{
static void Main(string[] args)
{
//Console.WriteLine("Hello World!");
A a1 = new A{X = };
//ChangeA(ref a1);
ChangeANotRef(ref a1);
System.Console.WriteLine($"{a1.X.ToString()}");
}
private static void ChangeA(ref A a)
{
a.X = ;
}
private static void ChangeANotRef(ref A a)
{
a.X = ;
a = new A{X = };
}
}
struct A
{
public int X;
}
}
out
如果方法返回一个值,该方法通常声明返回类型,并返回结果。如果方法返回多个值,可能类型还不同,这有不同的选项去处理。一个选项是声明类和结构,把应该返回的所有信息都定义为该类型的成员。另一个选项是使用元组类型。第三个选项是使用out关键字。
if(int.TryParse(Console.ReadLine(),out int num))
{
//to do;
}
//返回一个bool值,当用户输入的字符串可以转换为Int32时,返回true,反之为false.
若方法已明确定义返回类型,则也可以用关键字var代替int.
in
C#7.2向参数添加了in修饰符。out修饰符允许返回参数指定的值。in修饰符保证发送到方法中的数据不会更改(在传递值类型时)。
下面定义一个简单的可变结构体,再定义一个公共可变字段。
struct AValueType
{
public int Data;
}
此时,使用in修饰符定义一个方法时,变量就不能更改了。试图更改可变字段Data,编译器会报错,不能为只读变量的成员分配值。in修饰符使参数设置为只读变量。
static void CantChange(in AValueType a)
{
//a.Data = 43;//does not compile - readonly variable
Console.WriteLine(a.Data);
}
使用in修饰符,不仅有助于确保不更改内存,编译器还可以创建更好的优化代码。与使用方法调用来复制值类型不同,编译器可以使用引用,从而减少所需内存并提高性能。
注:in修饰符主要用于值类型,也可以对引用类型使用它。in修饰符用于引用类型时,可以更改变量的内容,但不能更改变量本身。
using System; namespace refDemo
{
class Program
{
static void Main(string[] args)
{
TestChangeStr(new TestClass());
}
private static void TestChangeStr(in TestClass test)
{
test.Str = "Str";
//test = new TestClass();//error
System.Console.WriteLine(test.Str);
}
}
class TestClass
{
public string Str;
}
}
ref,out,int参数复习的更多相关文章
- [C#]浅析ref、out参数
转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...
- Ref和Out参数的区别(转帖)
首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System; class Test { static void Swap(ref int x, ref int ...
- 利用反射调用方法时,处理ref,out参数需要注意的问题(转)
转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...
- 基于params,ref,out的参数问题详解
http://www.jb51.net/article/37967.htm 最近在写程序时遇到params,ref,out 参数问题.回头有自习看了看MSDN,才巩固了基础.现在和大家分享一下.par ...
- ref out 方法参数
ref out 相似 ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别. 两者的行为相似到连编译器都认为这两者不能被重载:public void SampleMethod(out ...
- C#中的ref与out参数(本文仅作为个人笔记)
假如一个方法的参数(形参)是引用类型,那么使用那个参数来进行的任何修改都会改变参数引用的数据.但这里的关键在于,虽然引用的数据发生了变化,但参数本生没有改变——它仍然引用的是一个对象.换句话说,虽然可 ...
- 【又长见识了】函数传参,params参数,ref和out参数详解
一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...
- 【05】C#特有的ref、out参数
java和C#非常相似,它们大部分的语法是一样的,但尽管如此,也有一些地方是不同的. 为了更好地学习java或C#,有必要分清它们两者到底在哪里不同. 我们这次要来探讨C#特有的ref.out参数. ...
- php中的int参数
PHP的函数有很多都会有一个int参数,这些参数基本都是定义为一个常量,虽然不知道有啥用,先记录一下 他们对应的数字 1. htmlspecialchars(),htmlentities() http ...
随机推荐
- linux 查看某个目录下文件的数量
今日思语:时间是个庸医,却自称能包治百病~ 在linux环境下,经常需要查看某个文件目录下的文件数有多少,除了进入当前目录下查看,还可以使用命令: ls -l | grep "^-" ...
- SQL Server 中PAGELATCH_x和PAGEIOLATCH_x解析
0.参考文献 Microsoft SQL Server企业级平台管理实践 第11章 Buffer Latch Timeout的解析 什么是PAGELATCH和PAGEIOLATCH 1.PAGELAT ...
- S1_搭建分布式OpenStack集群_09 cinder 控制节点配置
一.创建数据库创建数据库以及用户:# mysql -uroot -p12345678MariaDB [(none)]> CREATE DATABASE cinder;MariaDB [(none ...
- pgloader 学习(三)快速使用
pgloader 支持多种数据源数据的加载,以下列出简单的操作命令,后边会有详细的使用说明 csv 格式内容加载 预备说明 需要先在pg 数据库创建表 create table districts_l ...
- Xamarin 自定义OnKeyDown 再按一次退出程序的实现
private DateTime? lastBackKeyDownTime; public override bool OnKeyDown(Keycode keyCode, KeyEvent e) { ...
- Web前端开发(高级)下册-目录
多媒体与绘图 多媒体音频格式视频格式 HTML5多媒体支持 <audio>和<video> htmlaudioElement和htmlVideoElement <audi ...
- centos 7 下安装 redis
一.安装redis服务 第一步:下载redis安装包 命令:wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@chenzh ...
- Android App专项测试
https://www.jianshu.com/p/141b84f14505 http://www.cnblogs.com/finer/p/9601140.html 专项 概念 adb命令 App启动 ...
- Beta冲刺(5/5)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 验收了小程序的主要功能 制作Beta展示所需要用到的视频 制作Beta展示PPT 准备Beta答辩 提交记录(全组共用) ...
- ZooKeeper和ZAB协议
前言 ZooKeeper是一个提供高可用,一致性,高性能的保证读写顺序的存储系统.ZAB协议为ZooKeeper专门设计的一种支持数据一致性的原子广播协议. 演示环境 $ uname -a Darwi ...