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

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

常用值类型包括: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. PAT_A1137#Final Grading

    Source: PAT A1137 Final Grading (25 分) Description: For a student taking the online course "Dat ...

  2. 【双系统】windows 和 Ubuntu 双系统安装

      本博客主要讲述如何在已安装windows系统的计算机上安装Ubuntu双系统,涉及系统安装和相应磁盘空间分配等问题. 所需环境: 电脑已安装windows系统 下载Ubuntu16.04系统镜像 ...

  3. php第四节课

    对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  4. Centos7.5虚拟机无法ping通网关、外网IP地址

    问题:前两天Centos7.5虚拟机关机,第二天重启后使用Xshell发现无法连接虚拟机,经检测发现虚拟机无法ping通192.168.1.1.无法ping通192.168.1.118(客户机)和ww ...

  5. Codeforces 879A/B

    A. Borya's Diagnosis 传送门:http://codeforces.com/contest/879/problem/A 本题是一个模拟问题. 依次访问n个元素,第i个元素首次出现于s ...

  6. 【Codeforces Round #519 by Botan Investments E】Train Hard, Win Easy

    [链接] 我是链接,点我呀:) [题意] [题解] 设每个人做第一题.第二题的分数分别为x,y 我们先假设没有仇视关系. 即每两个人都能进行一次训练. 那么 对于第i个人. 考虑第j个人对它的贡献 如 ...

  7. 【例题4-6 uva12412】A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 训练编程的题. 原题中没有除0的数据,所以别担心你的代码是因为除0错了. 多半跟我一样. 也是因为没有+eps 就是比如你要算tot ...

  8. css sprites拼合

    一.什么是css sprites css sprites直译过来就是CSS精灵.通常被解释为“CSS图像拼合”或“CSS贴图定位”.就是把网页中一些背景图片整合拼合成一张图片中,再利用DIV CSS的 ...

  9. FZU - 2062 - Suneast & Yayamao

    先上题目: Problem 2062 Suneast & Yayamao Accept: 146    Submit: 319Time Limit: 1000 mSec    Memory L ...

  10. UVA 10159

    http://blog.csdn.net/metaphysis/article/details/6926997 先向作者表达一下敬佩吧,十分巧妙地利用了状态压缩. 这道题有点组合数学的味道,当一个格子 ...