zoukankan      html  css  js  c++  java
  • C#中的类,结构体课堂笔记

    C#中的类

    C#是一门面向对象的语言,类是C#中一种复杂的数据类型。

     

     

    c#中定义一个类的基本格式:

    class 类名

    {

    //类成员定义

    }

    默认情况下,如果class之前没有显示指定访问修饰符,则类的访问修饰符为internal,表示仅在当前项目内可以访问。

    除了internal,C#中的修饰符还有private, protected, public, abstract, sealed等修饰符,以及这几个修饰符的组合。

     修饰符 访问权限

    无或者internal 只能在同一程序集访问类

    public 同一程序集或者引用该程序集的其它程序集都可以访问

    abstract或internal abstract 只能在同一程序集访问类,该类不能被实例化,只能被继承

    public abstract 同一程序集或者引用该程序集的其它程序集都可以访问类,不能被实 例化,只能被继承

    sealed或internal sealed 只能在同一程序集访问类,该类不能被继承,只能实例化

    public sealed 同一程序集或者引用该程序集的其它程序集都可以访问类,该类不能 被继承,只能实例化。

    类的成员:

    修饰符 访问权限

    public 同一程序集或者引用该程序集的其它程序集都可以访问

    private 只能在同一类中访问

    protected 只能在同一类或者派生类中访问

    internal 只有同一程序集可以访问

    protected internal 同一程序集,该类和派生类中可以访问。

     

    字段:

    可以使用关键字readonly或const来定义字段。readonly:表示该字段是只读的(不需要在定义的时候初始化,可以在构造函数里完成初始化) const:表示该字段是不可变的(如果没有在定义字段时初始化,就会产生编译 错误)。

    也可以使用static关键字来声明静态字段。静态字段与实例字段的区别是静态字段必须通过类来访问,而实例字段则需要通过类的对象实例进行访问。

    属性:

    属性是对字段的扩展。根据面向对象的基本思想,字段最好设置为private,因为这样可以防止客户端字节对字段进行修改,从而保证内部成员的完整性。为了访问类的私有字段,c#中提供了属性机制

    eg:

    public class Person

    {

    private string name;

    public string Name

    {

                 //get访问器

    get{

     

    return name;

    }

                  //set访问器

    set{

     

    //value是隐形参数

    name = value;

    }

    }

    }

    通过属性来访问字段,避免了调用方法。

    当属性仅含有get访问器,或者set访问器为private级别时,这 样的属性称之为只读属性;当属性仅包含set访问器,或者get访问器 为private级别时,称之为只写属性。 

    和静态字段类似,属性也可以通过static关键字声明为静态属性,不能再静态属性中使用非静态成员

    方法重载

    方法重载指在类中可以定义多个名称相同但是类型参数顺序,参数类型,参数个数不同,返回类型不属于方法重载的一部分。

     

    构造函数

    构造函数用来创建类的实例对象

     

    构造函数分为静态构造函数和实例构造函数两种

    1.实例构造函数:用于创建 和初始化类的实例

    构造函数有以下特点:

    1)构造函数可以进行方法重载

    2)如果没有定义的化,会默认产生一个空的构造函数

    3)构造函数的函数名必须和类名相同

    4)不允许有返回值

    2.静态构造函数(静态构造函数只执行一次):用于初始化类中的静态成员,在创建第一个实例或者引用任何静态成员之前,clr都会自动调用静态构造函数

    静态构造函数有以下特点:

    1)静态构造函数不能使用任何访问修饰符

    2)静态构造函数不能带有任何参数

    3)静态构造函数只会执行一次

    4)不能直接调用静态构造函数

    5)程序员无法直接控制静态构造函数的调用时机

     

    析构函数:

    用于在类销毁之前释放类实例所使用的托管和非托管资源。析构函数隐式的调用了基类的object的Finalize方法

    try{}catch{}是c#的异常处理机制,

    析构函数需要注意:

    1)不能再结构体中定义析构函数,只能在类中

    2)一个类只能有一个

    3)无法继承或重载析构函数

    4)无法显示调用析构函数,由垃圾回收器自动调用

    5)析构函数没有修饰符也没有参数

     

    索引器:便于访问类中的数组成员的访问

    当一个类包含数组成员时,索引器的使用将大大简化对类中数组成员的访问,定义类似于属性,也有get,set访问器,具体定义如下:

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

    {

    get{ }

    set{ }

    }

     

    结构体:

    结构类型和类类型语法上相似,都是一种数据结构,都可以包含数据成员和方法成员。

    对于类两个变量指向同一对象的情况是存在的。

    结构是值类型,直接包含它自己的数据,每个结构都包含自己的一份数据。修改一个结构的数据不会对其它结构的数据造成影响。

    结构体总有一个默认无参的构造函数

     

    在继承中,在派生类中写的与父类函数名相同的方法,会出现父类方法隐藏警告,消除警告使用在派生类方法前添加new关键字,那如何调用父类的同名方法呢?通过强转,把派生类强转成父类。

     

    结构和类的对比

    数据类型 结构                                                                         类

    是否必须使用new运算符实例化                否                                                                       引用类型

    是否可以声明无参的构造函数                   否                                                                           是

    数据成员可否在声明的同时初始化            声明为const或static可以,数据成员不可以                     可以

    直接派生自什么类型                               System.ValueType                                                     有

    是否有析构函数                                      无                                                                           有

    可否从类派生                                         否                                                                           可以

    可否实现接口                                         可以                                                                        可以

    实例化时在栈还是在堆分配内存                 栈                                                                           堆, 栈中保存引用

    该类型的变量可否被赋值为null                  否                                                                            可以

    可否定义私有的无参构造函数                   否                                                                             可以

    是否总有一个默认的无参构造函数               是                                                                           否

    类和结构体的区别

    1:类定义使用class,结构体使用struct 

    2:结构体中不可对声明的字段进行初始化,类可以 

    3:结构体中,无论我们有没有定义构造函数,隐式的构造函数一直存 在 

    4:结构体不能显式的定义无参数的构造函数 

    5:结构体构造函数必须为所有的字段赋值 

    6:创建结构体对象可以不使用new,类必须得使用 

    7:结构体不能继承结构或者类,但可以实现接口;类可以继承类但不 能继承结构,可以实现接口 

    8:类是引用类型,结构体是值类型 

    9:结构体不能定义析构函数,类可以
    10:不能用 abstract或者sealed修饰结构体,而类可以。

    C#是面向对象的语言,所有面向对象的语言都具有三个基本的 特征,它们是: 

    封装:把客观事物封装成类,并将类内部实现隐藏,以保证数

    据的完整性。

    继承:通过继承可以复用父类的代码。

    多态:允许将子对象赋值给父对象的一种能力。 

    密封类:

    密封类是指不能被继承的类,强行继承会产生编译错误lC#中使用sealed关键字来定义密封类。

     

    子类的初始化顺序:

    1)初始化类的实例字段

    2)调用基类的构造函数,若没有基类,调用System.Object的构造函数

    3)调用子类的构造函数

     

    多态

    多态即相同类型的对象调用相同的方法却表现出不同行为的现象。

    使用virtual 和override关键字实现方法重写

     

    使用新成员隐藏基类成员

    如果想在派生类中定义和基类同名的成员则可以使用new关键字把基类成员隐藏起来。如果不使用new关键字,在派生类中定义一个与基类同名的成员编译器会产生警告。

    C#不支持多继承

     

     

  • 相关阅读:
    数据结构 队列
    数据结构 堆栈
    UNP学习 广播
    UNP学习 路由套接口
    QTcpSocket发送结构体
    线性表及实现
    [转]理解WSRF之一 使用WS-ResourceProperties (整理自IBM网站)
    详解x86、IA-32、IA-64等CPU系列
    gsoap框架下的onvif程序流程分析
    【LeetCode】从contest-21开始。(一般是10个contest写一篇文章)
  • 原文地址:https://www.cnblogs.com/about-zj-blog/p/5409155.html
Copyright © 2011-2022 走看看