美文网首页.Net流水账
C#参数传递,ref、out和params

C#参数传递,ref、out和params

作者: 飞了个鸽_figo | 来源:发表于2018-10-11 14:50 被阅读0次

    最近换工作面试,遇到了一个基础的坑,是关于C#参数传递的问题。

    参数传递主要分两种,值传递和引用传递。实际C#还提供的out输出传递和params数组传递,ref和out这两个关键字都能够提供相似的功效,都能实现引用传递。

I. 使用ref传递参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

II. 使用ref和out时,在方法声明的参数和调用方法时,都要加ref或out关键字。

III. out适用于return多个返回值,而ref用来改变调用者的引用。

params数组传递,提供同一种类型的多参数传递的方案。

1、值传递

(1)值类型

示例代码

---------------Main-----------------

int a=1;

circle(a);

---------------circle-----------------

void circle(int r)

{

r=10;

}

    如下图,值类型存储在栈内存空间上,在被调用方法里修改的是另外一块内存空间的值。

值类型值传递

(2)引用类型

示例代码

---------------Test-----------------

class Test

{

    public int A {get; set;}

}

---------------Main-----------------

var test=new Test();

test.A=1;

Set(test);

---------------Set1-----------------

void Set(Test t)

{

    t.A=10;

}

    如下图,test和t两个变量指向的是同一个实例,所以当t去修改A属性的时候,实际上是修改了test指向的实例。

引用类型值传递

---------------Set2-----------------

void Set(Test t)

{

    t=new Test();

    t.A=10;

}

    这种情况需要注意,一开始test和t都指向同一个实例。在Set方法内部对t重新分配另外一块内存空间,接下来t的任何操作都在另外一块内存空间上,跟test没有关系。

引用类型值传递

2、引用传递

(1)值类型

示例代码

---------------Main-----------------

int a=1;

circle(ref a);

---------------circle-----------------

void circle(ref int r)

{

    r=10;

}

    实际上,a和r指向的是同一块内存空间,r修改了,实际上就是修改了a。

值类型的引用传递

(2)引用类型

示例代码

---------------Test-----------------

class Test

{

public int A {get; set;}

}

---------------Main-----------------

var test=new Test();

test.A=1;

Set(ref test);

---------------Set1-----------------

void Set(ref Test t)

{

    t=new Test();

    t.A=10;

}

    test传入的是指针,所以当指针指向另外一个实例时,t和test指向的就是该指针指向的实例,它们操作的都是这个实例对应的内存。

引用类型引用传递

总结

(1)C#的值类型存储在栈上,引用类型却存储在CLR托管堆中。

(2)ref传递的是参数的引用。

相关文章

  • C#参数传递,ref、out和params

    最近换工作面试,遇到了一个基础的坑,是关于C#参数传递的问题。 参数传递主要分两种,值传递和引用传递。实际C#还提...

  • C# ref & out

    1. What is ref & out ? 参数传递时按引用传递参数 2.Why need ref & out ...

  • C# 方法参数(params、in、ref、out)

    参考转载文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/lan...

  • C#—参数传递之 Ref 和 Out

    ref 和 out 声明的参数 1.两者都是按地址传递的,使用后都将改变原来参数的数值。 2.ref 可以把参数的...

  • C#中out和ref之间的区别

    在本文,你将学会C#中 out 和 ref各自的区别,依旧具体使用场景。 共同点out、ref都是传递引用(内存地...

  • 关于C#参数传递

    一、参数的一般传递方式在c#中,除非使用ref或者out前缀,所有参数都通过值来传递。变量的栈数据会完整复制到目标...

  • ref 和 out

    ref:如果有ref修饰的参数那么该参数需要在传递之前初始化。 out:如果有out修饰的参数,那么该参数可以不需...

  • ref关键字和out关键字

    1.怎么用: ref关键字主要用来传递参数,而out关键字用来返回结果 相同点:ref和out都是按地址传递(值类...

  • 细讲C#中的ref与out的区别

    很多时候参数按地址传递时加有OUT关键字,到底他和REF有什么区别呢? 好,我们直奔主题,ref是传递参数的地址,...

  • Out And Ref

    在C#中Out和Ref使用方法基本一样。Out使用时其实参数可以不赋值,在使用时在实参数前面加上Out,如下:Ou...

网友评论

    本文标题:C#参数传递,ref、out和params

    本文链接:https://www.haomeiwen.com/subject/taqbaftx.html