一、分类

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。

C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

二。参数传递

  对于引用类型,不管是将其作为值参数传递还是引用参数传递,都可以在方法成员内部修改其内容。而值类型则不能修改。首先举一个简单的例子

(1)引用类型和值类型作为参数传递的区别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 引用类型问题
{
class Program
{
static void test1(ref int val1,int val2)
{
val1 = ;
val2 = ;
Console.WriteLine("val1={0},val2={1}", val1, val2);
} static void Main(string[] args)
{
myclass mc = new myclass();
test1(ref mc.val1, mc.val2);
Console.WriteLine("函数调用后:val1={0},val2={1}", mc.val1, mc.val2);
Console.ReadKey();
}
} class myclass
{
public int val1 = ;
public int val2 = ;
}
}

输出结果是:  val1=10,val2=20
        函数调用后:val1=10,val2=0

  

  引用类型中,如果在方法内创建新对象并赋值给形参会产生什么结果呢?

(1)引用类型作为值参数传递时,如果在方法内创建对象并赋值给形参,将切断形参与实参之间的联系,并在方法调用结束后,新对象也不复存在

class myclass
{
public int val1 = ;
} class Program
{
static void test1(myclass f1)
{
f1.val1 = ;
Console.WriteLine("创建新对象前:val1={0}", f1.val1);
f1 = new myclass();
Console.WriteLine("创建新对象后:val1={0}", f1.val1); } static void Main(string[] args)
{
myclass mc = new myclass();
Console.WriteLine("函数调用...");
test1(mc);
Console.WriteLine("函数调用后:val1={0}", mc.val1);
Console.ReadKey();
}
}

输出结果为:  函数调用...
        创建新对象前:val1=60
        创建新对象后:val1=10
        函数调用后:val1=60

值得注意的是,函数调用结束后并没有改变val1的值,因为在方法调用结束后新对象已经不存在了。

(2)引用类型对象作为引用参数传递时,如果在方法内创建对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值

class myclass
{
public int val1 = ;
} class Program
{
static void test1(ref myclass f1)
{
f1.val1 = ;
Console.WriteLine("创建新对象前:val1={0}", f1.val1);
f1 = new myclass();
Console.WriteLine("创建新对象后:val1={0}", f1.val1); } static void Main(string[] args)
{
myclass mc = new myclass();
Console.WriteLine("函数调用...");
test1(ref mc);
Console.WriteLine("函数调用后:val1={0}", mc.val1);
Console.ReadKey();
}
}

这段代码和上面几乎没区别,只是在引用参数调用的时候添加了ref关键字,但结果却不一样

输出结果为:  函数调用...
        创建新对象前:val1=60
        创建新对象后:val1=10
        函数调用后:val1=10

函数调用后val1的值也变成了10.

c#中引用类型作为值参数和引用参数问题的更多相关文章

  1. C#值参数和引用参数

    一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...

  2. C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数

    方法的参数有六种,分别是值参数.引用参数.输出参数.参数数组.命名参数.可选参数. 值参数 值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作: 在栈中 ...

  3. C#_delegate - 值参数和引用参数

    值参数不能加,引用参数可以. 引用参数是共享的 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  4. C#的值参数与引用参数

    值参数:在使用值参数时,是把变量的值传给函数,函数中对此变量的任何修改都不影响该变量本身的值. 引用参数:使用引用参数时,在函数中对此变量的修改会影响变量的值. 说简单点,值参数,就是我把身份证复印件 ...

  5. 传入值参数&传入引用参数的区别

    传值&传引用 1.传值 是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 2.传地址 是传值的一种特殊方式,只是他传递的是地址 那么传地址以后,实参和行参都指向同一个对象 3.传引用 ...

  6. [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...

  7. python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面

    如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argum ...

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

    Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...

  9. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

随机推荐

  1. oracle只导出触发器

    只要触发器,其他都不要 方法1:plsql develop调用exp:tools->export object—>trigger 方法2:select dbms_metadata.get_ ...

  2. java 发架包

    // 完整发布流程 clean compile deploy install -U -DskipTests // 把架包安装到本地,跳过测试 install -Dmaven.test.skip=tru ...

  3. keil小技能随用随定义

    大家都知道在C语言编程时一般都是先定义再使用这个变量的,不允许在语句的后面再定义,但是有时候我们会在KEIL中发现有些人使用变量就在语句后定义,这时我们自己去尝试却发现总是失败,这是为何呢? 原来是我 ...

  4. 程序媛计划——python数据库

    #实例:用数据库存储日记,实现日记本功能 #流程 #创建数据库 #coding:utf-8 import sqlite3 connect=sqlite3.connect('test.db') conn ...

  5. OSX - libc++究竟是啥?

    libc++是什么?  libc++是C++标准库的实现! libc++ is an implementation of the C++ standard library, targeting C++ ...

  6. day57作业(包含data内容)

    day57作业 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&quo ...

  7. javaWeb登录注册页面

    简单的登陆注册页面 1.配置JDBC驱动连接数据库 2. 配置struts2框架 3. 利用1 2完成登录页面, 注意做到不耦合,即servlet Api和控制器完全脱离) 4. 利用1 2 制作注册 ...

  8. 【qboi冲刺NOIP2017复赛试题4】 全套题目+题解+程序

    作为一个好人(验题人),我给大家奉上下这套题的题解,并且预祝大家这套题能够AK: T1题面:Alice现在有n根木棍,他们长度为1,2,3....n,Bob想把某一些木棍去掉,使得Alice剩下的木棍 ...

  9. POJ 2260

    #include <iostream> #define MAXN 100 using namespace std; int _m[MAXN][MAXN]; int main() { //f ...

  10. 使用R进行分组统计

    分组统计数据集是很常见的需求,R中也有相应的包支持数据集的分组统计.自己尝试了写了段R代码来完成分组统计数据集,支持公式,感觉用起来还算方便.代码分享在文章最后. 使用方式: step 1: sour ...