C#程序设计教程笔记(二)

本文介绍了面向对象编程的基础概念,包括类、封装、多态、继承等,并详细解释了类成员的声明方式,如常数、字段、构造函数、析构函数、方法、属性等。此外还探讨了抽象类、密封类、接口、枚举等高级主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三章 面向对象编程基础

类:
类也是一种数据类型,将类用作数据成员。类可以嵌套类,  类型嵌套。类的修饰符有:public private protected internal new abstract sealed.

封装:指的是建立类包,其中包含所需的所有的东西。

多态:指的是能够呈现多种形式的功能,即程序能够使用偿发送给它的东西进行工作。
继承:在一个类是另一个类的扩展时发生。

重用:创建类后,可以重复使用它来创建大量的对象。

类只是一种用于创建对象的定义,只是用于声明对象的。类本身,不能存储信息或执行例程。

类只是一种定义,它不存储任何东西,对象需要存储信息,需要为它预留内存,new 用于预留内存。

类成员:两种,数据成员和函数成员。

类的声明包括类头和类体,类头主要是类名的定义;类体主要是类成员的定义。

类成员的声明:

1、常数声明:const修饰,不能用static来修饰,但是他和静态成员一样,不属于任何对象,必须由类来访问。

2、字段(变量)声明:修饰符有,new public private protected internal static readonly volatile。静态变量:同一个类声明的对象可以共享一个值。在同一个类的对象之间共享数据,可以使用 static 限定符.类中被声明的静态变量属于这个类,而不是实例化的各个对象。
静态数据成员的一种常见用途是用作计数器,每当某个对象执行某种操作时,使可以将所有对象的计数器加1Readonly为只读字段,在声明的同时进行赋值,也可以通过类的实例构造函数或静态构造函数进行赋值。其它的情况下只能读不能写。3、构造函数声明:

1)实例构造函数。

修饰符:public private protected internal extern。一般的构造函数是public类型的,如果是private类型的就不能被外部类实例化

标识符:即构造函数名,和class同名,不声明返回类型,如:public class Area

构造函数重载:可以有多个同名的构造函数,但参数的个数或类型不同

2)静态构造函数

  修饰符:static extern 如果是extern修饰,说明这是一个外部静态构造函数,和类同名且无参数。

  作用:对静态字段进行初始化,不能对非静态成员进行初始化。

4、析构函数:释放对象时调用,(由系统自动调用)执行的顺序与构造函数相反,析构函数用~表示,有可能永远不会被调用。

 5、方法(函数)声明:表示类中所进行的各种操作,方法名一般和实际的操作挂钩,已达到顾名思义的效果。如用 public sort()表示排序。

    方法的参数传递:值传递(默认的情况下),引用参数(ref),输出参数(out),参数数组(数组本身就是引用)

静态方法:(static)只对静态成员操作,不访问实例字段

实例方法:可访问静态和实例字段。与特定对像关联,因此需要一个对象存在。

方法的重载与覆盖:方法因方法名,修饰符,参数数量和类型不同构成不同的签名方法。

6、属性声明:修饰符:new static virtual abstract override

   属性存取器方法:get{}  set{} ;

除此之外还有:事件声明,索引声明,运算符声明。C#中,类的外面不能创建方法,不允许方法的参数的有默认值。

第四章 面向对象编程进阶

类的继承与多态:

继承:实现代码重用

多态:同一方法用不同的对象可以产生不同的结果,通过在基类中使用虚方法,在派生类中使用重载实现。

抽象类与抽象方法:

抽象类:不能被实例化,只能作为其他类的基类,用abstract修饰。如:public abstract class Shape

抽象方法:本身不需要实现,而是在派生类中重载实现。如:

public abstract double class GetArea();  //形状类,求面积本身就没有意义

但是以他为基类派生成circle类,再求面积就有意义:

Public override double GetArea();

密封类和密封方法:

密封类:不能被继承的类,用seal修饰

public virtual double class GetArea(); shape中的方法

Public seal override double GetArea();circle类中的方法

操作符重载:在类中定义操作符

操作符分为 一元操作符  只有一个参数  二元操作符  两个参数

类型转换:

System.Convert.ToStringa

声明结构  struct 关键字,类和结构的区别如下:

结构

值类型

引用数据类型

可以不使用new关键字

必须使用new关键字

构造函数时,必须包含参数

有默认构造函数,没有任何参数

没有析构函数

有析构函数

没有abstract protected seal 修饰符

可用abstract protected seal 修饰

结构是隐式密封的!不能继承!

枚举:
枚举只能创建有限的几个值的变量,每周七天,
枚举名.值名
注意:默认的情况下,在枚举变量被声明时,其值被设置为0;
修改枚举的默认值;默认为0, 你可以改为1开始
.
修改枚举的底层类型:

枚举的底层类型是int ,实际也可以包含其他的数值数据类型,枚举也是对象。存在一些可用于枚举的内置方法。

重载方法:
多态指的是即使提供不同的选项,也能得到相同的结果。重载是多态的形式之一;
重载函数:方法重载指的是创建多个名称相同的方法。其中的每个方法在某些方面具备只唯一性,编译器能够区别它们。
使用重载函数,应该保证它们最后执行的结果应该是类似的。不要实现其他的功能。
构造函数重载:
理解方法的特征标: 方法的特征标,由参数个数和类型构成。
int  myint (int)
int myint(int[]) 
数组做参数,将出错,这不是重载。
每个方法必须有独特的特征标;

接口:用来定义一种程序的协定,用interface定义,修饰符有:new public protected internal private 命名通常以I开头,如IpartAIpartB

成员:方法,属性,索引器和事件,不能有变量成员,也不能在接口中实现接口成员,不能被实例化,接口成员默认是公共的,不加修饰符。接口必须要由类或结构来实现。

集合:

索引:为了能像数组一样访问的对象

采用 set get访问,如:

class MyClass

{

   public string []data=new string [5];//索引器

   public string this [int index]     //构造函数

   {

    set  {

            data[index]=value;

           };

    get {

            return data [index];

          }

    }

}

Class MyClient

{

  public static void Main()

  {

   MyClass mc=new MyClass();     //调用索引器的set属性进行赋值

   mc[0]="Atacji";

   mc[1]="hidk";

   mc[2]="Adfgi";

   mc[3]="Adds";

   mc[4]="ssdcji";

   Console.WriteLine("{0},{1},{2},{3},{4}",mc[0],mc[1],mc[2],mc[3],mc[4],);   //依次显示这几个数

  }

}

委托与多播

预处理命令

组件与程序集

使用不同数目的参数:
public long Add(params int[] args)  //
有了params关键字,编译器会生成一个动态的数组,参数数目是可以变化的。没有这个关键不可以写参数传入,这个参数是可以变化传入的!   可变参数是int类型
{
  int  ctr=0;
  long  total=0;
  for(ctr=0;ctr<args.Lengh;ctr++)
 {
       total+=args[ctr];
  }
  return total;
}
class Test
{
 static void Main()
 {
    long Total=0;

    Total=AddEm.Add(1);
    Total=AddEm.Add(1,2);
    Total=AddEm.Add(1,2,3);
    Total=AddEm.Add(1,2,3,4);
    Total=AddEm.Add(1,4,5,22,5);

 }
}
使用Params来指定多种数据类型:

public static void Print(params  object[] args)  //
这个类型是 object 类型,可以接收任何类型传入的参数 
print(100)
print(203.44)     print()
也可以调用,但不输出任何东西

print('c')
print("abc") 
以上参数都可以传进去,object[]args  其实就是一个动态的数组,把参数放在数组里,然后再读取出来。

详谈  params
当值被传递给方法时,编译器首先查看是否有匹配的方法,如果有,就调用该方法,如果没有,就查看是否有包含参数 params 的方法,如果找到了,就使用它。编译器将这些值放到一个数组中,并并将该数组传递给方法 编译器会生成一个类型相同的数组,并作为参数传入方法。

Main方法和命令参数:
Main
是一个特殊的方法,它总是先被调用,它也可以接收不同数目的参数,但不需要在Main方法中使用关键字,params .
之所以不用,是由于命令行参数将自动加入到一个字符串数组中。这基本上与params功能相同,由于命令行参数已被加入到一个数组中,因此不需要使用关键字params

声明Main方法时,如果期望传递参数,标准的做法是使用下面的格式,
public static int Main(string[] args ) 
返回整型用int,返回其他类型则使用void ,参数列表,是名为args的字符串,可以将args改为任何名称,但几乎所有的C#程序员都使用args
"
捕获命令行参数";
c:/code/09> comand xxx  123  456
后面的都是命令行参数

作用域:
变量的寿命及其可访问性被称谓作用域,作用域有许多级别,最常用的是两个局部和全局。
全局作用域指的是整程序清单都可见,小范围内可用的变量是局部的!
最小的作用域,是代码块,简单的循环
区分类变量和局部变量;
类作用域限定符: public   private
C#
不允许在类的外面声明变量

不能用于创建对象的类:
静态方法和数据成员属于类,而不是各个对象。静态类,
私有构造函数;
加上private 可以禁止创建对象
有公有的静态成员,限定符 private 构造函数,可以禁止创建对象,因为有公有静态成员可访问。
再谈名称空间:
给名称空间命名:
任何合法的标识符,必须由标准字符和下划线组成。 描述性名称
声明名称空间:
关键字 namespace  后跟空间名称
名称空间也可以嵌套
using
和名称空间:
using
给名称空间取别名,其次  不必使用完全限定名,访问空间类型更为容易,避免使用全限定名称
使用using  提供别名,using  aa=system  aa就是sytem的别名

可以将Main()方法声明为私有的,但这样无法访问该方法,要运行程序, Main方法必须是公有的,如果不能在 Main方法所在的类的外面访问它,将无法运行程序。  无法运行程序。
处理异常:
异常是未被捕获的编程错误;
try
发送错误命令,而catch 捕获try命令发送的异常。
catch (Exception  e)  catch
语句能够将异常作为一个参数接受。
try 语句提供多人catch 语句,

理解异常的处理顺序:
总是先捕获具体的异常,后捕获通用的异常。
使用finally 添加最后执行的操作:
不管try语句中的代码是否成功执行,都需要执行一个代码块,finally  语句块的代码总是会执行。
System.IO
名称空间包含了用于发送和接收(输入和输出)信息的例程。
try-catch-finally
语句可以嵌套。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值