参数修饰符的作用

参数修饰符 作用
如果一个参数没有用参数修饰符标记,则认为它将按值传递(pass by value),这意味着被调用的方法收到原始数据的一份副本
out 输出参数由被调用的方法赋值,因此它按引用传奇(pass by reference)。如果被调用的方法没有给输出参数赋值,就会出现编译报错
ref 调用者赋初值,并且可以由被调用的方法可选地重新赋值(因为数据是按引用传递的)。如果被调用的方法未能给ref赋值,也不会有编译错误
params 这个参数修饰符允许将一组可变数量额参数作为单独的逻辑参数进行传递。方法只能有一个parms修饰符,而且必须是方法的最后一个参数。事实上,你不会经常使用params修饰符。但要知道的是,基础类库中的许多方法都使用了C#语言特性

参数修饰符用法

out的主要作用

可以通过函数为多个参数进行赋值,这样在只有一次ruturn的前提下,可以进行对多个变量进行赋值操作。

void FillTheseParams(out int a, out string b, out SomeClass c)
{
a = 1;
b = "some string";
c = new SomeClass();
}

ref的作用

以java来说,参数其实传的都是值,只能改变其状态是不能改变其引用,.net为什么会多出来一个ref参数修饰符呢,因为.net默认是只能修改引用的内部的值,但是引用的值是不能修改的

// c# code
void Modify(SomeClass a)
{
a.SomeStringFiled = "1" // ok
a = new SomeClass() {
SomeStringFiled = "2"
}; // not ok
} void Modify(ref SomeClass a)
{
a = new SomeClass() {
SomeStringFiled = "2"
}; // ok
}

实际上,执行上述的代码是不会生效的。其实上面的代码也就相当于下面的代码

// java code
void modify(final SomeClass a) {
a.someStringField = "1"; // ok
a = new SomeClass(); // not ok,编译报错
a.setSomeStringField("2");
}
void modify(SomeClass a) {
a.someStringField = "1"; // ok
a = new SomeClass(); // not ok, 不会报错,但是也不起任何作用
a.setSomeStringField("2");
}

为了对引用值更方便的修改,.net引入了ref关键字(我猜的),毕竟java只能在方法外对变量进行引用修改,在重构等方面跟.net比起来还是差了一些。

.net 参数修饰符的更多相关文章

  1. C#的参数修饰符out,params,ref

    using System; namespace ParamsProgram { class TestParams { public static void Main(string[] args)//s ...

  2. C#中方法的参数修饰符

    做项目久了,有的时候真的需要静下心来认真的总结一下自己所用到的技术,而不是每天依葫芦画瓢,每天忙忙碌碌,到头来不知道自己忙了个啥,学了什么,自己到底掌握了多少知识.所以我想回顾一下C#的基础知识,把重 ...

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

    参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...

  4. C#中ref和out关键字的应用以及区别(参数修饰符)

    ref ref的定义 ref是reference的缩写,通过引用来传递参数的地址,ref基本上是服务于值类型的 ref的使用 //不使用 ref; void Method(int myRefInt) ...

  5. C#原始类型扩展方法—this参数修饰符

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

  6. c#参数修饰符-params

    先来理解一下理论知识 params可以设置使用长度可变的参数. 使用要求: 1.在一个方法声明的参数中,只能有一个params修饰符,且被修饰的参数之后不能有其他参数(这一点就像“可选参数必须在必选参 ...

  7. 新年在家学java之基础篇-参数&修饰符&构造器

    可变参数 不知道可能给方法传递多少个参数时使用这个方法 public void printInfo (String[] args) --可以定义一个数组,在调用这个方法适合赋值给一个数组 public ...

  8. C# 基础之参数修饰符

    参数传参的时候一共有四种传递方式: 一.无修饰符传参 也就是说没有传参修饰符,这种情况传过去的是一个副本,本体是不会被改变的 二.out传参修饰符 在传参的参数全面加一个out: public voi ...

  9. C# in 参数修饰符

    in 修饰符记录: 新版C# 新增加的 in 修饰符:保证发送到方法当中的数据不被更改(值类型),当in 修饰符用于引用类型时,可以改变变量的内容,单不能更改变量本身. 个人理解:in 修饰符传递的数 ...

随机推荐

  1. selenium+java处理鼠标悬停

    1.元素比较明确(可视) 2.元素隐藏,需要鼠标移动到一定地方才显现(下图为某论坛列表,需要将鼠标移动到列表才显示操作按钮)

  2. Tensorflow MNIST 数据集测试代码入门

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50614444 测试代码已上传至GitH ...

  3. Windows下通过FTP自动上传和下载动态文件名

    某个项目中每天会生成一个以文件名+日期.rar文件,如bcpdata2012-08-31.rar文件,动态的部分为日期部分,在windows环境变量中用 %date:~0,10% 表示,这个文件生成后 ...

  4. HDU 3709

    真是跪了,一看范围就不会往枚举的方向想,没想到真用枚举加剪枝了...->——-> 解释一下代码中的上限: 例如4567,当枚举最高位时,很明显不能超过4,所以有上限,但当最高位为3以下时, ...

  5. 【jQuery】对于复选框操作的attr与prop

    这个是在jQuery1.6版本号之后出现的鬼东西.受影响的主要有下拉列表select与复选框checkbox.众所周知.在jQuery中能够用attr()取出节点的属性,然而对于checkbox却不是 ...

  6. poj 2396 Budget 边容量有上下界的最大流

    题意: 给一个矩阵的每行和及每列和,在给一些行列或点的限制条件.求一个满足的矩阵. 分析: 转化为有上下界的网络流,注意等于也是一种上下界关系,然后用dinic算法. 代码: //poj 2396 / ...

  7. iOS开发之autoLayout constraint

    前言 ios设备的尺寸越来越多,针对一款app可能要适配到多种设备.多种尺寸.所以.我们期望我们的app可以autoLayout.本文主要介绍在Xcode中使用constraint.未来会不定期对此文 ...

  8. nyoj--16--矩形嵌套(动态规划)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  9. NSURLSession简介

    NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...

  10. 常用相关linux命令

    查看进程netstat -tnlp | egrep "(9097)" lsof -i:9097 ps -ef | grep kafka 观察句柄变化lsof -p $pid | w ...