• 回忆那些我们曾今铭记过的.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);

      

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

  • 相关阅读:
    积少成多Flash(8) ActionScript 3.0 网页之获取参数,JavaScript与ActionScript之间的相互调用
    积少成多Flash(11) Flex 3.0 动画效果(effect)
    积少成多Flash(9) Flex 3.0 布局控件, 样式(css), 皮肤(skin)
    系出名门Android(8) 控件(View)之TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList
    系出名门Android(9) 数据库支持(SQLite), 内容提供器(ContentProvider)
    积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引
    系出名门Android(5) 控件(View)之TextView, Button, ImageButton, ImageView, CheckBox, RadioButton, AnalogClock, DigitalClock
    系出名门Android(1) 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序
    小程序webview组件 nothing
    Python3的bytes/str之别
  • 原文地址:https://www.cnblogs.com/bdpsc/p/5387423.html
Copyright © 2020-2023  润新知