• C#面向对象一(方法、封装、类、两种数据类型)


    1字段

      字段主要为类的内部做数据交互使用,字段一般为private。

      字段可以赋值,可取值。

      当字段需要为外部提供数据时,请将字段封装为属性,而不是使用公有字段,这是面向对象所提倡的。

    2属性--描述对象的静态特征

      属性其实是外界访问私有字段的入口,属性本身不保存任何数据。

      给属性赋值,其实就是给属性的私有字段赋值;读取属性,其实是获取属性指向的私有字段或其他值。

      属性一般是向外部提供数据,主要用来描述对象的静态特征,所以属性一般是public的。

      属性可以根据需要设置为只读、只写,提高数据安全性。只读属性没有set方法。

      属性内部可以添加需要的逻辑,从而避免非法数据。

    3自动属性

      不能直接操作私有字段

      不能设置只读只写

      不能添加验证逻辑

     4方法的定义

      概念:对象的动态特征就是方法(静态特征是属性),方法表示此对象可以做什么。

      类型:实例方法,静态方法,(构造方法,多态时会用到抽象方法和虚方法)

    5方法注意事项

      访问修饰符:默认private

      方法名:一般时动词或动宾短语。首字母大写。不能以数字开头。

      参数列表:根据需要添加

      成员变量==字段,相对与局部变量

    6面向对象小结

      6.1封装

        封装:将一个或若干个小对象包装在一起,然后以一个新的对象呈现

        作用:封装使得一个对象的内部特征变得隐蔽,从而更安全。

        类封装:类是最小的程序单元,是对属性、方法的封装,类中的public成员都是对外提供的数据访问接口。

        模块封装:类可以被封装成模块,组成更大的程序组件。

        从OOP理解:外界调用的时候可以不用关心内部实现细节;充分体现面向对象中的“高内聚、低耦合”特性。

        对象的重用性:依此封装,处处使用。

      6.2变量

        变量作用:指代内存地址,便于记忆。

        变量的作用范围:

          局部变量:一个方法内部交换数据,方法执行完毕,如果没有返回值,则变量很快被清理

          成员变量:多个方法内部交换数据,通过对象的属性外对提供数据,变量的清理不确定

    7方法重载

      方法重载:编译器将根据方法参数的个数和类型自动匹配类的对应方法。

      方法重载的好处:减少类的对外接口(只显示一个方法),降低类的复杂度(低耦合);

                     便于用户使用(相同功能的方法名称一样)和识别

      方法重载的条件:方法的名称必须一样

            方法的参数个数或参数类型不一样

      方法重载的无关性:方法重载与返回值无关。

    8静态方法与重载

      关键字static:可以修饰类、方法、成员变量,修时候称之为静态类、静态方法、静态字段。

      静态成员在程序运行时被调入内存中,并且在系统未关闭之前不会被GC吸收。

      类的成员使用非常频繁时,可以考虑使用static修饰,但不要使用过多。

      静态成员不能直接调用实例成员(静态方法不能直接调用实例方法)。

      静态方法也可以重载。

    9构造方法

      如果两个重载的构造方法中有代码重复,可以用“:this()”调用自身其他构造方法。

     10对象初始化器

      对象在创建时也可以通过对象初始化器完成“属性的初始化”。

    1  Student objStudent3 = new Student()
    2             {
    3                 StudentId = 10005,
    4                 Birthday = Convert.ToDateTime("1987-10-11"),
    5                 StudentName = "小红"
    6             };
    对象初始化器

      对象初始化器和构造方法的异同点

      相同点:都可以完成属性的初始化。

      不同点:1构造函数具有强制性,对象初始化器没有强制性

          2对象初始化器只能完成属性初始化,构造函数可以完成任何需要的初始化工作,如对象创建时读取文件等

          3对象初始化器是在创建对象的时候使用,构造函数写在类里面

          4对象初始化器只能在.NET3.0以后版本使用,构造函数在.NET1.0版本就有

      对象创建(new)的两种方式:构造方法和初始化器。

    11对象销毁

      对象的生命周期:对象在内存不断额“生生死死”,具有生命周期。

      对象在内存中的状态:正在引用  程序正在使用的对象

                游离状态   没有引用的对象,已经使用完毕但依然占据空间

      垃圾回收机制(GC):.NET虚拟机特有机制,自动运行,并检查对象的状态。

                  发现对象不再引用时,会将其释放所占有的空间(销毁)。

                  GC的使用大大减轻了程序员手动释放对象的操作,且程序运行稳定。

    12析构函数

      C++中新购函数的使用,当使用delete关键字删除对象时,析构函数会自动调用。

      ~类名()

      {}

      托管运行环境下对象的销毁由虚拟机负责,析构函数没多大用途。

    13对象的数据类型

      基本数据类型:int、double、bool等

      引用数据类型:数组、对象、string(string分类上属于引用数据类型,但数据的处理和基本数据类型一样)

      两个对象,对象1.Name=“王华”;  对象2=对象1;   对象2.Name=“李红”;  此时对象1.Name也是“李红”。说明===>>>对象是引用类型。

    14两种数据类型特点

      基本数据类型(值类型):值类型变量传递时,将自己复制一份赋给了新变量。

      引用数据类型(对象类型):引用类型变量传递时,将自己的内存地址赋给了新变量。

    15 ref关键字

      值类型在传递的过程中都是以副本的方式进行传递,使用ref关键字可以将值类型变量按照引用类型方式传递。

      实际开发中不建议经常使用ref关键字!

    16 out关键字

      使用out关键字可以让方法有多个返回值

      out关键字其实也是使用引用类型传递!实践开发中不建议经常使用out关键字!

      可以使用“字典集合”方式返回多个参数!

    /// <summary>
    /// 对象深拷贝
    /// </summary>
    public class CloneObject
    {
        /// <summary>
        /// 对象深拷贝
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="obj">对象</param>
        /// <returns>内存地址不同,数据相同的对象</returns>
        public static T DeepCopy<T>(T obj)
        {
            object retval;
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                //序列化成流
                bf.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                //反序列化成对象
                retval = bf.Deserialize(ms);
                ms.Close();
            }
            return (T)retval;
        }
    }
    深拷贝

    17类和对象小结

      17.1封装的概念和作用:根据需要使用private和public修饰符类修饰类的成员(字段、属性、方法等),这样能避免私有的字段和方法被外界使用,我们把这种使用特性称为封装。

        封装是一个广义概念,一个属性是对字段的封装,一个方法是对一系列具体实现方式的封装,一个类是对属性和方法的封装,一个模块组件是对类的封装。

      17.2面向对象编程好处

          封装使得开发人员可以更加关注自己的需求:类的方法实现特定的功能,其他的类可以完全不用关心它是如何实现的,只需要调用即可;团队开发中,类的编写者也可以完全不用关心别人是如何使用的。

          一个类定义以后,可多次使用,避免重复使用。

      17.3类视图

        通过视图方式展示类的组织结构。私有成员带一个“锁”标志。

        对类右键“查看类图”。

      17.4认识祖先类Object

        .NET平台规定:所有类都必须自动继承自object类。

      17.5装箱与拆箱

        装箱:将值类型转化为对象的过程  object a=20;

        拆箱:将对象类型的变量转化为值类型的过程  int b=(int)a;

        频繁的拆装箱操作会影响系统性能。

    18.protected关键字

      protected声明的字段可以被基类或基类的派生类所引用。

      请注意要么在基类中被引用(相当于private),要么是在派生类中被派生类声明的对象所引用。

      在派生类中不能被基类声明的对象所引用。

  • 相关阅读:
    [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞) HEOI
    关于微服务网关
    管理 API 时要问的关键问题
    如何构建成功的微服务架构
    后端老是不写接口文档?说自己很忙?
    Nginx配置文件详解
    Keepalived 高可用
    Jenkins 调用 Shell 脚本
    Supervisor
    Harbor高可用实现基于haproxy
  • 原文地址:https://www.cnblogs.com/yangmengke2018/p/10797680.html
Copyright © 2020-2023  润新知