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参数复习的更多相关文章

  1. [C#]浅析ref、out参数

    转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...

  2. Ref和Out参数的区别(转帖)

    首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System;   class Test   {   static void Swap(ref int x, ref int ...

  3. 利用反射调用方法时,处理ref,out参数需要注意的问题(转)

    转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...

  4. 基于params,ref,out的参数问题详解

    http://www.jb51.net/article/37967.htm 最近在写程序时遇到params,ref,out 参数问题.回头有自习看了看MSDN,才巩固了基础.现在和大家分享一下.par ...

  5. ref out 方法参数

    ref out 相似 ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别. 两者的行为相似到连编译器都认为这两者不能被重载:public void SampleMethod(out ...

  6. C#中的ref与out参数(本文仅作为个人笔记)

    假如一个方法的参数(形参)是引用类型,那么使用那个参数来进行的任何修改都会改变参数引用的数据.但这里的关键在于,虽然引用的数据发生了变化,但参数本生没有改变——它仍然引用的是一个对象.换句话说,虽然可 ...

  7. 【又长见识了】函数传参,params参数,ref和out参数详解

    一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...

  8. 【05】C#特有的ref、out参数

    java和C#非常相似,它们大部分的语法是一样的,但尽管如此,也有一些地方是不同的. 为了更好地学习java或C#,有必要分清它们两者到底在哪里不同. 我们这次要来探讨C#特有的ref.out参数. ...

  9. php中的int参数

    PHP的函数有很多都会有一个int参数,这些参数基本都是定义为一个常量,虽然不知道有啥用,先记录一下 他们对应的数字 1. htmlspecialchars(),htmlentities() http ...

随机推荐

  1. linux 查看某个目录下文件的数量

    今日思语:时间是个庸医,却自称能包治百病~ 在linux环境下,经常需要查看某个文件目录下的文件数有多少,除了进入当前目录下查看,还可以使用命令: ls -l | grep "^-" ...

  2. SQL Server 中PAGELATCH_x和PAGEIOLATCH_x解析

    0.参考文献 Microsoft SQL Server企业级平台管理实践 第11章 Buffer Latch Timeout的解析 什么是PAGELATCH和PAGEIOLATCH 1.PAGELAT ...

  3. S1_搭建分布式OpenStack集群_09 cinder 控制节点配置

    一.创建数据库创建数据库以及用户:# mysql -uroot -p12345678MariaDB [(none)]> CREATE DATABASE cinder;MariaDB [(none ...

  4. pgloader 学习(三)快速使用

    pgloader 支持多种数据源数据的加载,以下列出简单的操作命令,后边会有详细的使用说明 csv 格式内容加载 预备说明 需要先在pg 数据库创建表 create table districts_l ...

  5. Xamarin 自定义OnKeyDown 再按一次退出程序的实现

    private DateTime? lastBackKeyDownTime; public override bool OnKeyDown(Keycode keyCode, KeyEvent e) { ...

  6. Web前端开发(高级)下册-目录

    多媒体与绘图 多媒体音频格式视频格式 HTML5多媒体支持 <audio>和<video> htmlaudioElement和htmlVideoElement <audi ...

  7. centos 7 下安装 redis

    一.安装redis服务 第一步:下载redis安装包 命令:wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@chenzh ...

  8. Android App专项测试

    https://www.jianshu.com/p/141b84f14505 http://www.cnblogs.com/finer/p/9601140.html 专项 概念 adb命令 App启动 ...

  9. Beta冲刺(5/5)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 验收了小程序的主要功能 制作Beta展示所需要用到的视频 制作Beta展示PPT 准备Beta答辩 提交记录(全组共用) ...

  10. ZooKeeper和ZAB协议

    前言 ZooKeeper是一个提供高可用,一致性,高性能的保证读写顺序的存储系统.ZAB协议为ZooKeeper专门设计的一种支持数据一致性的原子广播协议. 演示环境 $ uname -a Darwi ...