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 ...
随机推荐
- 应用安全测试技术DAST、SAST、IAST对比分析【转】
转自:https://blog.csdn.net/qq_29277155/article/details/92411079 一.全球面临软件安全危机 2010年,大型社交网站rockyou.com被曝 ...
- web api 2.0 上传文件超过4M时,出现404错误
客户端代码 string path = "C:\\text.txt"; WebClient client = new WebClient(); Uri _address = new ...
- LeetCode 818. Race Car
原题链接在这里:https://leetcode.com/problems/race-car/ 题目: Your car starts at position 0 and speed +1 on an ...
- zeebe 0.20.0 集群部署试用
zeebe 0.20.0 是生产可用的第一个版本,同时也有好多变动,以下是一个简单集群的运行以及一个简单 的运行说明 环境准备 docker-compose 文件 version: "3 ...
- Linux 系统管理——服务器RAID及配置实战
RAID称为廉价磁盘冗余阵列.RAID的基本想法是把多个便宜的小磁盘组合在一起.成为一个磁盘组,使性能达到或超过一个容量巨大.价格昂贵的磁盘. 2.级别介绍 RAID 0连续以位或字节为单位分割数据, ...
- 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 ...
- 洛谷P1270 访问美术馆
题目 树形DP,首先考虑递归建图,类似于线段树的中序遍历.然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: \(dp[now][nwt] = max(dp[now][nwt], ...
- RocketMQ4.5.1环境搭建及示例
一.Windows环境搭建RocketMQ 1. 下载RocketMQ Binary压缩包,并解压缩,我的安装目录为E:\programs\rocketmq\rocketmq-all-4.5.1 2. ...
- 【洛谷】P1449 后缀表达式
P1449 后缀表达式 分析: 简单的模拟题. 熟练容器stack的话很容易解决. stack,栈,有先进后出的特性. 比如你有一个箱子,你每放进第一个数时,就往箱底放,放第二个数时就在第一个数的上面 ...
- CF1221F Choose a Square(二维偏序)
由于y=x,我们可以将点对称过来,以便(x,y)(x<y) 考虑选取正方形(a,a,b,b),点集则为\((a\le x\le y\le b)\),相当于二维数点 将点按x降序,y升序排列,线段 ...