• 面向对象(基础oop)之结构与数组高级


          大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开始讲一下面向对象的一点知识,请你们多多点评和讨论!!


               1. 结构体与我们之前学的类特别的相似.
               
               2. 定义结构体的语法
                  struct 结构体的名字
                  {
                 
              
                  }

              

     1     struct Point
     2     {
     3         public int x; 
     4         public int y;
     5         public Person p;
     6 
     7         public Point(int x,int y)
     8         {
     9             this.y = y;
    10             this.x = x;
    11             p = new Person();
    12         }


               3. 定义的位置:
                  和类一样,定义在命名空间的下面.
               4. 结构体中可以定义字段、方法、属性、构造函数.
                  结构体的使用与类一样. 也需要创建对象 然后调用对象的成员.
                1 Yuan y = new Yuan(12.56); 2 Console.WriteLine(y.GetZhouChang()); 3 Console.WriteLine(y.GetArea());   
               5. 结构体与类的区别:
                  a. 从语法上的区别.
                     1).类使用class关键字声明,结构体使用struct关键字声明
                     2).可以为结构体声明字段,但是在声明字段的同时不能为其赋默认值,因为结构体可以用结构体名 变量名的方式(Direction d1;)来声明变量,这样的话就会跳过构造函数,导致字段在使用前就没有值。为什么类可以呢,其实类也不行,只是编译的时候会把赋值的执行代码写在构造函数里面去,而类只能通过new关键字来创建变量,所以一定会执行构造函数(就算没有赋值,执行构造函数也会赋默认值),所以用字段之前,一定会有值得。
                    
                     3).属性与类中的属性一样,用来保护字段的,这个和类中的属性没有区别.
                     4).方法同样的表示1个功能,与类中的方法没有任何区别.
                    
                     5).无参数的构造函数无论如何都会被C#编译器自动生成,所以不允许程序员为结构体写1个无参数的构造函数,并且反编译我们是看不到这个无参的构造函数的,只能new的时候在括号里面看到重载的构造函数。

                    
                     6).要求在结构体的构造函数中,必须要为当前结构体对象的每1个字段赋值.
                  b. 创建对象
                     在创建结构体对象的时候,可以像类那样使用new关键字来创建. 也可以不使用new关键字创建.
                     通过new关键字创建对象以后,这个对象的每1个字段就已经有值(默认值)了.那么我们就可以直接的使用.
                     因为通过new关键字创建对象,调用了构造函数.而在构造函数中又必须要为每1个字段赋值.
                     我们可以猜出,无参数的构造函数中做的事情: 为值类型的字段赋值0 为引用类型的字段赋值null
                    
                     如果不使用new关键字来创建对象,那么这个结构体对象的字段是没有值的,要求在使用字段的值之前必须为字段赋值.
                     因为这种方式创建结构体对象没有调用构造函数,而在声明字段的时候又不允许赋值. 所以这样创建对象字段是没有值的.
                    
               6. 结构体与类本质上的区别
                  a. 结构体是1个值类型,类是引用类型

                 
                  b. 结构体的变量本身就是1个对象,其中不像类那样存储地址. 真正的结构体对象直接存储在这个结构体的变量中.
                     结构体对象的成员直接存在结构体变量中,
                     在声明结构体变量的时候, 其实就已经在结构体变量中创建好对象了.
                     new关键字仅仅调用构造函数.
                  c. 结构体相互赋值的时候,是逐个拷贝字段的值. 

                       
               
               7. 什么时候使用结构体.
                  a. 栈空间比较小,但是访问速度较快; 堆空间比较大,但是访问速度较慢
                  b. 结构体对象是分配在栈空间中,所以结构体对象的访问速度比堆空间中的类的对象要块.
                  c. 当我们要表示1个轻量级对象的时候,其中的成员较少.就可以将其声明为结构体,
                     这个时候访问速度较块.
                     重量级对象当成员比较多的时候,就声明为类,让对象分配在堆空间中.


    1. 二维数组: 它表示1个表格数据. 有行有列.
                     与数组的特点一样: 所有的数据的类型相同. 存储的个数固定.
                  2. 创建1个二维数组呢? 二维数组的特点在于有行有列.
                     元素的类型[,] 数组的名称 = new 元素的类型[行数,列数];
                    

    1   int[, ,] arr = new int[3, 5, 4];
    2             Console.WriteLine(arr.Length); 
    3             arr[0, 0, 0] = 12;
    4             arr[2, 4, 3] = 19;


                     表示声明了1个指定行数,每1行有指定列数的1个表结构.
                     二维数组的元素的个数: 行数列数
                    
                  3. 为二维数组中的元素赋值.
                     二维数组中的元素必须通过行列两个坐标来确定.确定这个元素在第几行的第几列.
                     二维数组中的行列坐标从0开始.
                    
                     在索引器中写上行坐标和列坐标就可以定位到指定的元素.
                     arr[行坐标,列坐标]=值;
                    
                  4. 取值:
                     仍然通过行列坐标去取值.
                     
                  5. 一维数组表示1条线. 确定线上的1点只要1个坐标.
                     二维表示表示1个面. 确定面上的1点要2个坐标.
                    
                  6. 数组的Rank属性 可以得到数组的维度.
                 
                  7. 遍历:
                     Length属性代表数组中元素的个数,而 二维数组中的Length指的是行列
                     a. 使用foreach可以简单快速的遍历.
                        foreach(int item in arr)
                        {
                            cw(item);
                        }
                     b. 数组的GetLength()方法可以得到指定维度的长度.
                        传入0 可以得到行数,
                        传入1 可以得到列数
                        for(int i=0;i<arr.GetLength(0);i++)
                        {
                           for(int j =0;j<arr.GetLength(1);j++)
                           {
                                arr[i,j];
                           }
                        }
                 

     1   for (int i = 0; i < arr.GetLength(0); i++)
     2             {
     3                 for (int j = 0; j < arr.GetLength(1); j++)
     4                 {
     5                     for (int k = 0; k < arr.GetLength(2); k++)
     6                     {
     7                         Console.WriteLine(arr[i,j,k]);
     8                     }
     9                 }
    10             }

                 
                  8. 当我有1个表格数据的时候.
                     这些数据有行有列的存储.  我们就可以使用二维数组.
                    
                  9. 使用数组初始化器初始化二维数组中的每1个元素,
                     int[,] arr = { { 10, 20, 30 }, { 40, 50, 60 }, { 60, 70,80} };
                
                 
                 
                  10.三维数组.int[, ,] arr = new int[3, 5, 4];


    1. 在类中只能定义字段、属性、方法、构造函数.
                     语法上允许在定义字段的同时为字段赋值.
                 
                 
                  2. 交错数组的本质是1个一维数组,只不过这个1维数组的元素的类型是1个数组.
                     元素的类型[][] 数组的名称 = new 元素的类型[交错数组的长度][]
                     在声明交错数组的时候,只需要指定1维数组的长度。
                    

    1    int[][] arr = new int[4][];
    2             arr[0] = new int[4];
    3             arr[1] = new int[3];
    4             arr[2] = new int[5];
    5             arr[3] = new int[9];


                  3. 赋值.
                     给交错数组的元素赋值,一定要是1个数组,因为交错数组的元素是1个数组类型的
                    
                     为交错数组的元素的元素赋值
                     先通过索引器确定交错数组的元素 这个元素的类型是1个数组  再通过1个索引器确定交错数组的元素的元素  int[][] arr = { new int[] { 1, 2, 3, }, new int[] { 4, 5, 667, 8, 9 } };
                     arr[0][0]=12;
                    
                 
                  4. 取值:
                    
                    
                  5. 遍历.
                     使用foreach遍历,因为交错数组的元素的类型是1个数组,所以迭代变量的类型也应该是1个数组.
                     然后再遍历这个迭代变量.
                     foreach (int[] item in arr)
                     {
                        foreach(int i in item)
                        {
                            cw(i);
                        }
                     }
                     使用for循环来遍历交错数组,
                     for (int i = 0; i < arr.Length; i++)
                     {
                         arr[i]是交错数的元素,这个元素是1个数组 还得遍历这个arr[i]
                         for(int j=0;j<arr[i].Length;j++)
                         {
                             cw(arr[i][j]);
                         }
                     }
                 
                  

    1    foreach (int[] item in arr)
    2             {
    3                 foreach (int i in item)
    4                 {
    5                     Console.Write(i+"	");
    6                 }
    7                 Console.WriteLine();
    8             }

      
                  6. 表示1个表格数据,行确定m,但是每1个行的列数不相同. 这个时候就可以使用交错数组.


  • 相关阅读:
    Android应用安全之外部动态加载DEX文件风险
    Android应用安全之Android APP通用型拒绝服务漏洞
    利用Cydia Substrate进行Android HOOK(二)
    Apk去签名校验详解
    nginx部署前端项目的一些配置【刚入门】
    java 日期格式化 将String日期重新格式化成String型【转】
    idea导入maven项目时需要注意
    element 'dependency' cannot have character [children], because the type's content type is element-only.
    腾讯云centos7执行 systemctl status postfix.service 启动postfix服务时出现 /usr/sbin/postconf: fatal: parameter inet_interfaces: no local interface found for ::1
    redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted
  • 原文地址:https://www.cnblogs.com/lijingyang/p/3764842.html
Copyright © 2020-2023  润新知