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. 应用安全测试技术DAST、SAST、IAST对比分析【转】

    转自:https://blog.csdn.net/qq_29277155/article/details/92411079 一.全球面临软件安全危机 2010年,大型社交网站rockyou.com被曝 ...

  2. web api 2.0 上传文件超过4M时,出现404错误

    客户端代码 string path = "C:\\text.txt"; WebClient client = new WebClient(); Uri _address = new ...

  3. LeetCode 818. Race Car

    原题链接在这里:https://leetcode.com/problems/race-car/ 题目: Your car starts at position 0 and speed +1 on an ...

  4. zeebe 0.20.0 集群部署试用

    zeebe 0.20.0 是生产可用的第一个版本,同时也有好多变动,以下是一个简单集群的运行以及一个简单 的运行说明 环境准备 docker-compose 文件   version: "3 ...

  5. Linux 系统管理——服务器RAID及配置实战

    RAID称为廉价磁盘冗余阵列.RAID的基本想法是把多个便宜的小磁盘组合在一起.成为一个磁盘组,使性能达到或超过一个容量巨大.价格昂贵的磁盘. 2.级别介绍 RAID 0连续以位或字节为单位分割数据, ...

  6. UOJ269【清华集训2016】如何优雅地求和【数论,多项式】

    题目描述:求 $$\sum_{k=0}^nf(k)\binom{n}{k}x^k(1-x)^{n-k}$$ 输入$n$,$f(x)$的次数上界$m$,$x$,$f(0,1,\ldots,m)$,对$9 ...

  7. 洛谷P1270 访问美术馆

    题目 树形DP,首先考虑递归建图,类似于线段树的中序遍历.然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: \(dp[now][nwt] = max(dp[now][nwt], ...

  8. RocketMQ4.5.1环境搭建及示例

    一.Windows环境搭建RocketMQ 1. 下载RocketMQ Binary压缩包,并解压缩,我的安装目录为E:\programs\rocketmq\rocketmq-all-4.5.1 2. ...

  9. 【洛谷】P1449 后缀表达式

    P1449 后缀表达式 分析: 简单的模拟题. 熟练容器stack的话很容易解决. stack,栈,有先进后出的特性. 比如你有一个箱子,你每放进第一个数时,就往箱底放,放第二个数时就在第一个数的上面 ...

  10. CF1221F Choose a Square(二维偏序)

    由于y=x,我们可以将点对称过来,以便(x,y)(x<y) 考虑选取正方形(a,a,b,b),点集则为\((a\le x\le y\le b)\),相当于二维数点 将点按x降序,y升序排列,线段 ...