zoukankan      html  css  js  c++  java
  • 回忆那些我们曾今铭记过的.NET重点知识

         正如标题所说的那样,到底是那些.NET的知识点呢?

        接下来就让我带着你们去了解这些知识点吧!

         1.接口

         2.索引器

         3.FOREACH的本质

         4.匿名内部类

         5.运算符的重载

        一.什么是接口?接口的作用又是什么呢?如果不是太清楚或者是其他什么的,那就请在认真、完整的浏览几遍吧!我想对你以后应该有很大的帮助。

         解析:接口是组件之间的协议,描述了组件对外提供的服务。从技术上讲接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。接口可以从父接口中继承。接口的继承首先是说明性继承,不是实现性继承,它的实现需要通过类或结构来实现;其次接口继承可以是多继承。

       作用:

        01.接口就是为了约束方法的格式(参数和返回值类型)而存在的

        02.接口可以实现多继承,弥补单继承的缺陷。

       03.接口可以看成是一个特殊的抽象类,通过反编译看源码可知

        04.接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体

        05.如果一个类实现了某个接口,就得实现该接口中所有的方法

        06.接口要谨慎使用,防止出现接口污染!

        07.接口仅仅代表一种能力,实现该接口的类和接口没有继承关系

        08.接口是用来实现的,类是用来继承的。

        09.其实很多时候,看似可以不用接口,因为接口就是一个方法的约定,

           表明你这个类必须要有某些方法,但是不写接口也可以有这些方法,用了接口,

           就可以使用接口变量,统一调用,实现多态

       1.创建接口并让一个类去实现这个接口

      

     public class Person:IFly
        {
            public string Say(string name)
            {
                return "";
            }
        }
    
    
     public class Plane:IFly
        {
            public string Say(string name)
            {
                Console.WriteLine("大飞机在天上飞啊");
                return "飞翔着";
            }
    }

       2.定义一个一接口IFly类型的数组实例化各个实现IFly接口的类

     IFly[] ifly = 
                {
                  new Plane(),
                  new Person()
                };
                foreach (IFly item in ifly)
                {
                    string name = item.Say("会飞的所有东西");
                    Console.WriteLine(name);
                }

         3.接口也可以继承接口

     public interface IPlay:IFly
        {
             void Play();
        }

       

         

         二.接下来再说说让我们编码更方便的索引器吧!

          1.属性的本质是方法,索引器的本质是属性。(可能会更好了解索引器)

             2.索引器

             01.C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作。

              02.定义索引器的方式与定义属性有些类似,其一般形式如下:

                  [修饰符] 数据类型 this[索引类型 index]

                   {

                      get{//获得属性的代码}                                              

                      set{ //设置属性的代码}

                 }

             03.索引器的本质还可说是类(看源码)

          

            04.创建索引器代码

       

    public class Student
        {
            private string[] name = new string[2];
            public string this[int index]
            {
                get { return name[index];}
                set { name[index]=value;}
            }
        }
    
    
    static void Main(string[] args)
            {
    
                #region 02.索引器
    
                Student stu = new Student();
                stu[0] = "董泽文";
                stu[1] = "张一铭";
                Console.WriteLine(stu[0] + "
    " + stu[1]);
              
                  #region

      三.你们都应该会特别感兴趣的Foreach原理

     本质:实现了一个IEnumerable接口,

    01.为什么数组和集合可以使用foreach遍历?

    解析:因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerator()

    02.数组是一种数据结构,它包含若干相同类型的变量。数组是使用类型声明的:type[] arrayName;

    03.数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable ,因此可以对 C# 中的所有数组使用 foreach 迭代。 

    04.面试题:

    001.C#中能用foreach遍历访问的对象需要实现______接口或声明______方法的类型。

    解析:IEnumerable ,GetEnumerator()

       05.实现IEnumerable接口的类MyConnection

     public class MyConnection:IEnumerable
        {
            ArrayList list = new ArrayList();
            public void AddList(object o)
            {
                list.Add(o);
            }
            public IEnumerator GetEnumerator()
            {
                return new MyIenumerator(list);
            }
        }

      06.实现IEnumerator接口的类MyIEnumerator

      public class MyIenumerator:IEnumerator
        {
            public ArrayList list = new ArrayList();
            private int i = -1;
            public MyIenumerator(ArrayList mylist)
            {
                list = mylist;
            }
            public object Current
            {
                get { return list[i]; }
            }
            public bool MoveNext()
            {
                bool flag = false;
                if (i<list.Count-1)
                {
                    i++;
                    flag = true;
                }
                return flag;
            }
    
            public void Reset()
            {
                throw new NotImplementedException();
            }
        }

       07.实例化MyIEnumertor  即可用FOREACH来循环

    MyConnection mycon = new MyConnection();
     mycon.AddList("董泽文");
     mycon.AddList("张一铭");
     foreach (object item in mycon)
       {
           Console.WriteLine(item);
        }

     四.匿名内部类

    02.匿名类在底层还会被CLR编译成一个有名字的类

    03.匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。

    可通过使用 new 运算符和对象初始值创建匿名类型

     

     #region 04.匿名内部类
                var num = 1;
                var names= "1";
                var falg=  false;
                var stu =new {name="董泽文",age=12 };
                if (num==1&&names.Equals("1"))
                {
                    num++;
                    names += "10";
                    falg = true;
                }
                Console.WriteLine(num + "	" + names + "	" + falg);
                Console.WriteLine(stu.name + "	" + stu.age);
                #endregion

     五.运算符重载

      01.C# 允许用户定义的类型通过使用 operator 关键字定义静态成员函数来重载运算符。

       02.重写运算符方法的类

    public class Personers
        {
            public string PName { get; set; }
            public int PAge { get; set; }
            //重写了加法运算
            public static int operator +(Personers p1,Personers p2)
            {
                return p1.PAge + p2.PAge;
            }
            //重写了减法运算
            public static int operator -(Personers p1, Personers p2)
            {
                return p1.PAge - p2.PAge;
            }
            //重写了乘法运算
            public static int operator *(Personers p1, Personers p2)
            {
                return p1.PAge * p2.PAge;
            }
            //重写了除法运算
            public static double operator /(Personers p1, Personers p2)
            {
                return p1.PAge / p2.PAge;
            }
            //重写了恒等运算(必须与不等方法同时书写)
            public static bool operator ==(Personers p1, Personers p2)
            {
                return p1.PAge == p2.PAge;
            }
            //重写了不等运算(必须与恒等方法同时书写)
     public static bool operator !=(Personers p1, Personers p2) { return p1.PAge != p2.PAge; } }

    03.实例化

     Personers p1 = new Personers();
                Personers p2 = new Personers();
                p1.PAge = 25;
                p2.PAge = 12;
                Console.WriteLine(p1 + p2);
                Console.WriteLine(p1 - p2);
                Console.WriteLine(p1 * p2);
                Console.WriteLine(p1 / p2);
                Console.WriteLine(p1 == p2);

      

        目前学习的内容就到这了,如果觉得对你有帮助的话,就请等待我的更新吧!如果有什么知识点还不足的,请多多的提点建议!

  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/bdpsc/p/5387423.html
Copyright © 2011-2022 走看看