深入.NET数据类型(2)

一.装箱和拆箱

  将值类型转换为引用类型的过程称为装箱,反之称为拆箱

  实际开发尽量避免 装/拆 箱

    原因:

      装/拆 箱都会降低程序性能

  示例代码:

       static void Main(string[] args)
        {

            int num = 1;
            object obj = num;  //有装箱操作
            int result = (int)obj; //拆箱操作
            //要想拆箱,先有装箱。 
        }   

二.不同类型的参数传递

  1.值方式参数传递

    1)使用值类型作为参数

      以值类型作为参数进行值方式传递参数时,不能改变值类型参数的值

        int num1 = 3;
         int num2 = 5;
         Console.WriteLine("交换前:num1的值{0}\tnum2的值{1}", num1, num2);
         //最简单的两个变量交换
         //借助第三方
         Change(num1, num2);
         Console.WriteLine("交换后:num1的值{0}\tnum2的值{1}", num1, num2);    
     static void Change( int num1, int num2) 
        {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }        

    2)使用引用类型作为参数

      以引用类型作为参数进行值方式传递参数时,能改变引用类型参数的值

    static void Main(string[] args)
        {
          Voter voter = new Voter();
            SE se = new SE();    
            se.popularity = 10;


            voter.Vote(se);

            voter.Vote(se);

            Console.WriteLine(se.popularity);

        }

      public void Vote(SE se) 
        {
            se.popularity++;
        }


 public class SE
    {
        public int popularity;
    }        

  2.引用方式参数传递(ref)

    1.使用引用类型作为参数

      以值类型作为参数进行引用方式传递参数时,能改变值类型参数的值

 int num1 = 3;
         int num2 = 5;
         Console.WriteLine("交换前:num1的值{0}\tnum2的值{1}", num1, num2);
         //最简单的两个变量交换
         //借助第三方
         Changeref num1,ref num2);
         Console.WriteLine("交换后:num1的值{0}\tnum2的值{1}", num1, num2);    
     static void Change(ref int num1,ref int num2) 
        {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }        

    2.使用引用类型作为参数

      以值引用型作为参数进行引用方式传递参数时,能改变引用类型参数的值

 static void Main(string[] args)
        {
          Voter voter = new Voter();
            SE se = new SE();    
            se.popularity = 10;


            voter.Vote(ref se);

            voter.Vote(ref se);

            Console.WriteLine(se.popularity);

        }

      public void Vote(ref SE se) 
        {
            se.popularity++;
        }


 public class SE
    {
        public int popularity;
    }        

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏blackheart的专栏

[C#1] 11-接口

接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是...

1999
来自专栏blackheart的专栏

[C#6] 4-string 插值

0. 目录 C#6 新增特性目录 1. 老版本的代码 1 internal class Person 2 { 3 public string Na...

1916
来自专栏Golang语言社区

厚土Go学习笔记 | 28. go语言没有类 却可以在结构体或任意类型定义方法

在go语言中没有类。可是,是有方法的。 给结构体定义方法,在对应的 func 和方法名之间,加上方法的接收者就可以了。 比如,我们定义了一个结构体 type V...

3788
来自专栏技术博客

设计模式之三(工厂方法模式)

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。

1562
来自专栏性能与架构

认识一下 Java 11

可能很多人现在 Java8 的新特性还没用熟呢,Java 11 就已经来了,下面一起来看下 Java 11 的几个新特性:

1162
来自专栏Road

Redis 设计 --- 高效数据结构实现剖析

即使有链表来处理键冲突,但是当节点数量远远大于 size 时,如果不扩充哈希表规模,请自行想象。这也是 rehash 的存在意义,笔者认为这也是 redis 扩...

1403
来自专栏菩提树下的杨过

再谈Silverlight中的对象序列化/反序列化

曾经发过一篇如何在Silveright中利用XmlSerializer序列化对象的文章“Silverlight中的序列化”,限于当时的认识有限,一度以为silv...

2118
来自专栏蘑菇先生的技术笔记

探索c#之递归APS和CPS

2787
来自专栏GreenLeaves

C# lambda表达式

学了N多久的委托,终于告一段落,现在可以开始lambda的学习之旅了,但是在说lambda之前必须先说下C#中的匿名方法. 1、匿名方法 下面是一个字符串拼接的...

2096
来自专栏博客园

.NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】

   前段时间在反编译代码时无意间看到在类中有一个BeforeFieldInit特性,处于好奇的心态查了查这个特性,发现这是一个关于字段初始化时间的特性【提前初...

1594

扫码关注云+社区