DotNET知识点总结三(笔记整合)

  1. 使用接口的注意事项:
    • 接口中的成员不能加访问修饰符
    • 接口中的成员不能有任何实现
    • 实现接口的子类必须实现接口的全部成员
    • 一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么在语法上A必须写在IA的前面,因为类是单继承的,而而接口可以多实现
    • 显式实现接口和隐式实现接口时需要注意的问题(我们通常是隐式实现的)
      • 类实现接口,可以显式实现接口里的方法,但是注意:一旦使用显式实现接口里的方法,那么该方法只能被接口变量调用

        IFlyable fly = new Bird();
        fly.Fly();    //正确
        
        Bird fly = new Bird();
        fly.Fly();    //错误
    • 向上转型
    • 单一职责原则(避免定义体积庞大的接口,因为这样会造成“接口污染”,只把相关联的一组成员定义到一个接口中)
  2. 接口与抽象类的区别:
    • 相同点:

      • 接口和抽象类都不能被实例化
    • 不同点:
      • 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件和方法
      • 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。MicroSoft的自定义接口总是狗带able字段,证明其是表述一类“我能做……”
      • 接口可以被多重实现,抽象类只能被单一继承
      • 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
      • 抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口时为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性
      • 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法
      • 接口可以用于支持回调,而继承并不具备这个特点
      • 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
      • 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而抽象类的子类中实现接口中方法

3.  类型转换

    • 转换分类

      //隐式转换
      int num = 1;
      string str = num.toString();
      
      //强制转换
      int a = 5;
      (double) b = a;
    • 转换条件
      • ToString()方法

        • 它是Object对象的一个虚方法,可以自己去重写该方法。如果不重写就返回类型名
      • Parse()和TryParse()方法
        • 相同点:都是针对于字符串进行的值类型转换
        • 不同点:
          1. 返回值不一样:Parse()是返回要转换的类型,而TryParse()返回一个转换是否成功的bool值
          2. Parse()转换失败会抛异常,而TryParse()转换失败返回false,不会抛异常
          3. Parse()直接传入要转换的类型的值,而TryParse()需要一个out输出参数输出转换的结果

4.静态成员

    • 加载时机(什么时候加载静态成员?)

      • 在该静态成员第一次被调用的时候加载
    • 适用情形(什么时候用静态成员)
      • 在整个程序内部共享的数据才定义为静态的。通常被作为工具类使用。比如DBSqlHelper
    • 在普通类和静态类中的区别
      • 静态类需要用static,静态类不能被实例化
      • 静态诶中只能包含静态成员
      • 在实例方法中可以直接调用静态成员,但在静态方法中不能直接调用实例方法
      • 静态类和静态变量创建后始终使用同一块内存,而使用实例的方法会创建多个内存空间
      • 惊天构造函数不能有参数,也不能与访问修饰符(默认是private)

5.静态类的继承

    • 从子类的角度:静态类不能被任何类继承
    • 从父类的角度:静态类只能继承Object类,不能继承其他类

6.类和成员的访问修饰符

    • 类的默认访问修饰符是internal
    • 类的成员的默认访问修饰符是private
    • 类的访问修饰符只有两种:public,internal(默认)
    • 类的成员的访问修饰符有:public,protected,private(默认)

7.结构

    • 本质是值类型
    • 值类型和引用类型的选择
      • 值类型:主要是用来封装一组数据,并为数据提供一种简单的处理方式
      • 引用类型:
        1. 主要用来封装数据和行为
        2. 使用面向对象的特征
        3. 当类型中的成员比较多的时候用结构(存在堆里)
    • new关键字的作用
      • 在使用new关键字创建对象后,所有的成员变量都已经存在,并有默认值(值类型)
      • 如果没有用new关键字,则需要程序员手动为所有的用到了的成员变量赋值,之后才能调用结构对象里的方法属性
      • 结构不new也可以使用,但是必须给使用的结构成员赋值才能使用

8.类和结构的区别

    • 结构是值类型,是分配在内存的栈上的,而类是引用类型,是分配在内存的堆上的
    • 结构不能被继承,因为结构是值类型,隐式继承自System.ValueType
    • 结构是是值传递的(赋值传递),而类是引用传递的

9.访问级别的约束

    • 子类的访问级别不能比父类高
    • 方法参数的访问级别   >=   方法的访问级别(比如当方法的参数传递的是一个类的对象时,那么此时这个类对象的访问级别要高于当前方法的访问级别)

10.析构函数

    • 一个类只能有一个析构函数
    • 无法继承或重载析构函数
    • 无法手动去调用析构函数,因为它是被GC(垃圾回收机制)自动调用的
    • 析构函数不能有访问修饰符,也不能有参数
    • 不能在结构体中定义析构函数,因为结构是值类型,而值类型是存储在栈中,栈中的数据用完之后就立即销毁了,而析构函数的目的就是用来释放资源的,一般存储在堆中的引用类型才需要GC去释放,而因结构体中不能定义析构函数,所以只能对类使用析构函数

      //析构函数语法
      
      class MyDispose
      {
            ~MyDisPose()
          {
                ……//释放资源的代码
          }
      }

11.字符串

    • 属性:length
    • 静态方法
      • 常用:

        1. (Last)IndexOf:用来查找某个字符或字符串,在一个特定字符串对象里的下标
        2. SubString 截取
        3. Split() 根据特定字符来分割字符串,并返回分割后的字符串的数组,可以用foreach读取
        4. Join静态方法
        5. Format() 静态方法
        6. Replace(),替换完要接收,产生一个新的字符串
        7. Replace().Replace()链式编程
        8. Trim()去首尾空格

12.“==”运算符好 “Equals()”方法的区别

    • “==”比较时:

      • 如果比较是值类型,则比较两个对象的值
      • 如果比较的是引用类型,则比较两个对象的引用地址是否相同(比较堆地址)
    • “Equals()”比较时:
      • 此方法是Object类里的一个虚方法,默认就是用的“==”及进行比较,是对“==”进行的一个封装,但是,大部分MicroSoft的类及用户自定义的类,都重写了该虚方法,也就是MicroSoft和用户各自为自己编写的Object的子类定义了相等比较规则

    注意:这里有一个特例,因为string是一个引用类型,所以按理说string.Equals("……")方法比较的是地址,而这里比较的是字符串的值

13.字符串的恒定性:

    当字符串在内存中已经被创建后,程序员再次创建相同值的字符串对象时,CLR做了优化,直接把第一个字符串的引用赋给了第二个变量,也就是说,前后两个字符串变脸保存了相同的字符串对象应用

14.StringBuilder对象

    String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不 会 。 所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder , 不要使用 String。如果要操作一个不断增长的字符串,尽量不用 String 类 , 改用 StringBuilder 类。

    两个类的工作原理不同 :String 类是一种传统的修改字符串的方式 , 它确实可以完成把一个字符串添加到另一个字符串上的工作没错 , 但是在 .NET 框架下 , 这个操作实在是划不来 。 因为系统先是把两个字符串写入内存 , 接着删除原来的 String 对象 , 然后创建一个 String 对象 , 并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用 System.Text 命名空间下面的StringBuilder 类就不是这样了,它提供的 Append 方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然 , 一般情况下觉察不到这二者效率的差异 , 但如果你要对某个字符串进行大量的添加操作,那么 StringBuilder 类所耗费的时间和 String 类简直不是一个数量级的。

时间: 2024-10-20 05:25:25

DotNET知识点总结三(笔记整合)的相关文章

.NET知识点总结二(笔记整合)

19.什么是类型? 用来定义某一种数据在内存里开辟空间的大小,还可以预置操作此种类型数据的相关方法 20.this关键字在方法中使用时所代表的含义 this指的是当前类的对象,或者父类的类的对象(base只能指向父类的对象) 21.里氏替换原则 子类替换父类所在的位置 22.C#中的数据类型 值类型 简单类型(数字类型(int,short,long,float,double),字符(char),逻辑值(bool)),结构体(struct),枚举(enum) 引用类型 字符串(string),数组

.NET知识点总结一(笔记整合)

1.   .net framework原理简介,C#程序的两次编译 .NET源代码——>语言编译器(第一次编译)——>MSIL+元数据(exe文件)——>CLR(公共语言运行时——类似于jre)——>机器代码(第二次编译)——>代码被执行 2.Main函数是什么?在程序中使用Main函数有什么需要注意的地方? 程序的入口函数!函数名字不能改变:一个程序中有且只有一个Main函数. 3.CLR是什么?程序集是什么?当运行一个程序集的时候,CLR做了什么事情? Common La

Docker学习教程笔记整合(完整)

Docker学习教程笔记整合(完整) 本文主要是整理了DockerOne组织翻译的Flux7的Docker入门教程,通过markdown记录,方便离线学习.原文地址,http://dockone.io/article/101. 文中一些链接可能会跳转国外的网站,如果没有插件或开VPN的朋友,可以尝试修改一下Hosts文件,如何修改Hosts文件.或者使用XXNet插件,如何使用XXnet 介绍 Docker是一个新的容器化的技术,它轻巧,且易移植,号称"build once, configure

学习IOS开发UI篇--UI知识点总结(三) UIScrollView/UIPageControl/NSTimer

UIScrollView:常用属性 @property(nonatomic)   UIEdgeInsets     contentInset;               // default UIEdgeInsetsZero. add additional scroll area around content @property(nonatomic,getter=isPagingEnabled) BOOL   pagingEnabled;     // default NO. if YES,

Spring之ORM(spring 与mybatis的三种整合实例)

我们知道spring没有提供orm框架但是,提供了很好的和orm框架这个的代沟,我们可以和流行的orm框架进行整合,本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可以通过连接下载http://download.csdn.net/detail/qh_java/8431455 :  1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1).Spr

DotNET知识点总结四(笔记整合)

1.枚举:本质是类 如果为第一个枚举赋了一个int值,那么后面的枚举项依次递增 可以将枚举强转成他所代表的int值 C#的枚举项都是常量(可以用Reflector查看literal的IL源码) 因为枚举项都有对应的int值,所以Switch把他当成int看 不能定义方法.属性.事件 多个枚举有相同数值时,数值强转时,会返回其中最后一个枚举项 2.IEnumerable接口 只要实现了该接口,就可以使用foreach进行遍历.foreach循环的本质就是调用这个接口返回一个迭代器,调用迭代器的Mo

DotNET知识点总结五(笔记整合)

1.委托:通常指的是 多播委托 通常的说,委托就是一个存放方法指针的容器,是一个安全的函数指针,供程序员安全调用.委托的本质就是一个类,继承于MulticastDelegate——>Delegate,在Delegate类中有一个IntPtr类型的变量来指向该方法的指针. 通常当方法传递的参数为一个方法时,就用委托. 委托能够将方法作为参数传递,(多播委托)调用一个委托,执行N个方法 2.集合排序 1.Reverse()方法直接反转排序 2.冒泡排序 int temp = 0; for(int i

java中字符流的知识点---IO学习笔记(三)

字符流: 文本和文本文件的区别: 文本: java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件: 文件是byte byte byte-的数据序列. 文本文件: 文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果. 字符流(Reader,Writer) 操作的是文本文件.对于mp3,二进制文件是字节文件不适合用字符流读取,因为读取出来的是char,没有意义. 字符的处理,一次处理一个字符 字符的

iOS 常见知识点(三):Lock

iOS 常见知识点(一):Runtime iOS 常见知识点(二):RunLoop 锁是最常用的同步工具.一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单的互斥锁,另一个线程 B 就无法访问,只有等待前一个线程 A 执行完被保护的代码后解锁,B 线程才能访问被保护代码. iOS 中的八大锁 NSLock @protocol NSLocking - (void)lock; - (void)unlock; @end @interface NSLock :