zoukankan      html  css  js  c++  java
  • 深入C#数据类型

    Stack(栈)

      所有值类型和引用类型的引用都存储在栈上

      值类型赋值原理:在栈上复制的真实值

    Heap(堆)

      堆上存储的真实对象本身真实对象的属性

    1.值类型和引用类型

      值类型源于System.ValueType家族,每个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型数据所在的内存区域成为栈.

      值类型主要包括基本数据类型和枚举类型

      

     值类型的赋值原理:

          在栈上复制的真实值

        实例代码:

    //张浩和李明去年身高都是170cm,今年李明长到了180cm,张浩没有变化,
                //输出去年和今年两人身高
                int zhheight = 170;
                int lmheigt = zhheight;
                Console.WriteLine("去年张浩身高是{0}	李明的身高是{1}", zhheight, lmheigt);
                lmheigt = 180;
                Console.WriteLine("今年张浩身高是{0}	李明的身高是{1}", zhheight, lmheigt);          
    

      

     2.引用类型

        命名空间:System.Onject

        引用类型主要包括数组,类和接口,字符串等

        储存在栈和堆中

        堆上储存的真实对象本身真实对象的属性

        示例代码:

    int[] zhArray={170,60};
               int[] lmArray = zhArray;
                Console.WriteLine("去年张浩身高是{0},体重是{1}	李明的身高是{2},体重是{3}", zhArray[0],zhArray[1], lmArray[0],lmArray[1]);
                Console.WriteLine("================我是高贵的分割线====================");
                lmArray[0] = 180;
               lmArray[1] = 70;
                Console.WriteLine("今年张浩身高是{0},体重是{1}	李明的身高是{2},体重是{3}", zhArray[0], zhArray[1], lmArray[0], lmArray[1]);
    //解决:
    
            int[] zhArray = { 170, 60 };
                int[] lmArray = new int[2];
                for (int i = 0; i < zhArray.Length; i++)
                {
                    lmArray[i] = zhArray[i];
                }
                Console.WriteLine("去年张浩身高是{0},体重是{1}	李明的身高是{2},体重是{3}", zhArray[0], zhArray[1], lmArray[0], lmArray[1]);
                Console.WriteLine("================我是高贵的分割线======================");
               
                lmArray[0] = 180;
                lmArray[1] = 70;
                Console.WriteLine("今年张浩身高是{0},体重是{1}	李明的身高是{2},体重是{3}", zhArray[0], zhArray[1], lmArray[0], lmArray[1]);

    3.细分值类型和引用类型

    二.结构

      1.定义:

        语法:

         

             访问修饰符 struct 结构名
          {
            //结构体
          }                

          特点:

          结构中可以有字段,也可以有方法

          定义时,结构中的字段不能被赋初值

        示例代码:

        

    复制代码
     //定一个自己的结构体
        public struct MyPointer
        {
    
            //成员 属性   结构体的成员变量不能有初值
            private int age;
    
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
            //结构体中可以定义方法
            public void show() 
            {
               
            }
    
        }
    复制代码

      2.使用

        可以不用new。直接定义结构的对象即可

          

        声明结构的对象后,必须给结构的成员赋初值

        示例代码:

          

    复制代码
         static void Main(string[] args)
            {
                //使用结构体
                MyPointer pointer=new MyPointer();
                pointer.Age = 20;
                pointer.show();
            }
    复制代码

      3.使用经验

        不推荐使用(结构用得越多所消耗的存储空间也越多)

    4.构造函数

      

       示例代码:

    复制代码
      public  class Player
        {
       //无参
            private Player() 
            { 
                //归类:方法(方法)/函数 (面向过程)
            }
            //有参
            public Player(string name)
            {
    
                //归类:方法(方法)/函数 (面向过程)
            }
        }    

    5.装箱和拆箱

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

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

        原因:

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

      示例代码:

        

    复制代码
           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}	num2的值{1}", num1, num2);
             //最简单的两个变量交换
             //借助第三方
             Change(num1, num2);
             Console.WriteLine("交换后:num1的值{0}	num2的值{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}	num2的值{1}", num1, num2);
             //最简单的两个变量交换
             //借助第三方
             Changeref num1,ref num2);
             Console.WriteLine("交换后:num1的值{0}	num2的值{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;
        }        
  • 相关阅读:
    C++ 容器元素的存储和获取
    【C++沉思录】代理类
    mysql 编码测试
    理解字符编码
    linux mount
    mysql delimiter
    mysql 求时间段平均值
    mysql Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
    PostgreSQL体系架构与内存结构
    PostgreSQL中的The Oversized-Attribute Storage Technique(TOAST:超大属性存储技术)
  • 原文地址:https://www.cnblogs.com/fl72/p/8166090.html
Copyright © 2011-2022 走看看