最近在写项目中有同事碰到这样的传值问题,可能很多对这个参数的传递还有点疑惑,自己也是对这个基础知识做一个回顾和巩固。

首先什么是值类型和引用类型可以去园里看一下相关的资料,都有介绍。

常用值类型包括:int ,long ,bool,decimal,char,float 等

常用的引用类型包括:string,arry,delegate, interface,class 等

一。传递值类型参数

向方法传递值类型变量意味着向方法传递变量的一个副本。方法内发生的对参数的更改对该变量中存储的原始数据无任何影响。如果希望所调用的方法更改参数的值,必须使用 ref 或 out 关键字通过引用传递该参数。

   static void SquareInt(int x)
{
x *= x;
System.Console.WriteLine("步骤二: {0}", x);
}
static void Main()
{
int n = ;
System.Console.WriteLine("步骤一: {0}", n); SquareInt(n);
System.Console.WriteLine("步骤三: {0}", n);
}

以上通过值传递值类型,输出:步骤一:5  步骤二:25  步骤三:5

        static void SquareInt(ref int x)
{
x *= x;
System.Console.WriteLine("步骤二: {0}", x);
} static void Main()
{
int n = ;
System.Console.WriteLine("步骤一: {0}", n); SquareInt(ref n);
System.Console.WriteLine("步骤三: {0}", n);
}

以上通过引用传递值类型,输出:步骤一:5  步骤二:25  步骤三:25

二。传递引用类型参数

引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用 ref 或 out 关键字传递参数。

        public class People
{
public string name { get; set; } public int age { get; set; }
} static void Main()
{
People model = new People();
model.name = "张三";
model.age = ;
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
Change(model);
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
} private void Change(People model)
{
model.name = "李四";
model = new People() { name = "王五", age = };
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
}

以上通过值传递引用类型,输出:姓名:张三,年龄:18         姓名:王五,年龄:20        姓名:李四,年龄:18

        public class People
{
public string name { get; set; } public int age { get; set; }
} static void Main()
{
People model = new People();
model.name = "张三";
model.age = ;
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
Change(ref model);
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
} private void Change(ref People model)
{
model.name = "李四";
model = new People() { name = "王五", age = };
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
}

以上通过引用传递引用类型,输出:姓名:张三,年龄:18         姓名:王五,年龄:20        姓名:王五,年龄:20

二。传递特殊的引用类型参数string

string是引用类型,没错,但它的很多操作是与值类型看齐的,下面直接代码演示

        static void Main()
{
string str1 = "张三";
StringBuilder str2 = new StringBuilder();
str2.Append("李四");
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(str1, str2);
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
} private void SwapStrings(string s1,StringBuilder s2)
{
s1 = "张三疯";
s2.Append("李四疯");
s2 = new StringBuilder();
s2.Append("王五");
System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
}

以上通过值传递引用类型string,输出:str1是张三str2是李四               str1是张三疯str2是王五            str1是张三str2是李四李四疯

        static void Main()
{
string str1 = "张三";
StringBuilder str2 = new StringBuilder();
str2.Append("李四");
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(ref str1, ref str2);
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
} private void SwapStrings(ref string s1,ref StringBuilder s2)
{
s1 = "张三疯";
s2.Append("李四疯");
s2 = new StringBuilder();
s2.Append("王五");
System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
}

以上通过引用传递引用类型string,输出:str1是张三str2是李四               str1是张三疯str2是王五           str1是张三疯str2是王五

 

C#中的引用传递和值传递。的更多相关文章

  1. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  2. (转载)理解Java中的引用传递和值传递

      关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...

  3. Java中的引用传递和值传递

    Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...

  4. Java中没有引用传递只有值传递(在函数中)

    ◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下 ...

  5. effective c++:引用传递与值传递,成员函数与非成员函数

    以pass-by-reference-to-const 替换pass-by-value 考虑以下class继承体系 class Person { public: Person(); // parame ...

  6. (转载)PHP数组传递是值传递而非引用传递

    (转载)http://www.fengfly.com/plus/view-212127-1.html 在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身. 说明此过程中的 ...

  7. Java Object 引用传递和值传递

    Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...

  8. java到底是引用传递还是值传递?

    今天我们来讲讲一个在学习中容易误解的问题,面试中也偶尔问到,java方法调用时到底是值传递还是引用传递? 首先,请大家来做一个判断题,下面的3个问题是否描述正确 1. java基本数据类型传递是值传递 ...

  9. Java千百问_05面向对象(011)_引用传递和值传递有什么差别

    点击进入_很多其它_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给还有一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 比如: //定义 ...

  10. java引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

随机推荐

  1. Vue解决跨域之反向代理

    目录 : config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'static', assetsPublicPa ...

  2. @dalao help!!!

  3. TFS代码迁移Git

    描述 将TFS上的代码迁移到Git做版本控制. 参考地址 tfs-git下载:https://github.com/git-tfs/git-tfs/releases chocolatey安装:http ...

  4. js中writeln()方法

    writeln( ) 方法与 write( ) 方法几乎一样,差别仅在于是前者将在所提供的任何字符串后添加一个换行符.在 HTML 中,这通常只会在后面产生一个空格:不过如果使用了 <PRE&g ...

  5. BZOJ 2956 模积和 (数学推导+数论分块)

    手动博客搬家: 本文发表于20170223 16:47:26, 原地址https://blog.csdn.net/suncongbo/article/details/79354835 题目链接: ht ...

  6. CentOS6.2上安装Oracle10g报ins_emdb.mk错误处理方法

    oracle安装过程报ins_emdb.mk错误,此时继续点击“continue”即可,待Oracle完成安装后,再手工执行相应脚本完成链接即可 在CentOS6.2操作系统上,安装Oracle10g ...

  7. qsort快速排序

    C库函数qsort七种使用方法示例 七种qsort排序方法<本文中排序都是采用的从小到大排序> 一.对int类型数组排序C++ / C 代码 int num[100]; Sample: i ...

  8. CentOS6.3安装Mysql-5.5.29

    转自:http://www.cnblogs.com/zhoulf/archive/2013/01/25/zhoulf.html 安装方式分为rpm和源码编译安装两种,本文是采用mysql源码编译方式, ...

  9. [Cypress] Get started with Cypress

    Adding Cypress to a project is a simple npm install away. We won’t need any global dependencies beyo ...

  10. linux下Oracle11g RAC搭建(七)

    linux下Oracle11g RAC搭建(七) 六.安装Grid 启动GRID安装界面 方式一:redhat下调整分辨率 [root@node1 ~]# xhost +       //授权 [ro ...