一.数组的使用:
与C++中数组变量存在于连续的栈区域中不同, C#中的数组是引用型的变量,实际的值并不存在与栈中,因此在使用的时候需要先进性new操作,否则编译器会报错。在声明数组的时候只需告知数组类型而无需指定数组长度,在使用该数组前需要对其进行new操作并赋予初始值,如果不赋初值则系统会根据不同类型为数组成员赋初值。声明数组的格式为:
object [] MyObjects;
MyObjects=new object[10]{........}; //注意:没有"="
二维数组不再用“[ N ][ M ]”来表示,而是改用了“[ N , M ]”来表示,声明格式为:
object [ , ] MyObjects; 注意“,”
MyObjects=new object[M,N]{{N1,N2},{M1,M2}};
C#中提供了一个传递无需知道参数个数就可以声明函数的关键字params,例如:
private void TestParam(params object [] MyParam) {
int nMin = 999;
foreach (int i in MyParam) {
if (i < nMin) nMin = i;
}
MessageBox.Show(nMin.ToString());
return;
}
函数可以实现从任意类型(可比较大小的类型)任意个参数中取最小值的功能,调用方法可以
TestParam(1,2);
TestParam(1,2,3);
或 TestParam(1,2,3,.......,n);
params声明的参数在参数表中只能有一个,如果还存在其他类型的参数,则params参数必须写在参数的最后。
二.继承
从新出现的各种语言来看,都不再支持多继承这种方式, C#中也只支持单继承。与C++不同的是,C#中的继承方式被强制成了public,取消了private和protected两种方式,提到这三种继承方式突然发现把这三种继承方式的区别忘了,破记性~~~温习一下吧
/****************************************************************************/
public继承:派生类可以访问基类中private和protected型数据,派生类生成的对象可以访问基类中public属性的成员
private、protected继承:派生类可以访问基类中private和protected型数据,但派生类的对象不能访问基类中的成员。
/***************************************************************************/
C#中不直接支持private和protected方式,会不会对类的封装造成影响呢?
派生类在被声明的时候会调用基类的构造函数,如果不对派生类的构造函数作任何操作,则派生类创建对象时要调用基类的默认构造函数,如果想调用基类非默认构造函数,可以如下形式声明。
注意:C#的结构以类来组织,System.Object是最高层次的基类,所有类(包括系统定义的类和用户自定义的类)都继承System.Object类,因此,object型变量可以容纳任何类型(基类声明的对象可以被赋值成派生类的对象)。
class BaseClass
{
public BaseClass() {
MessageBox.Show("基类的默认构造函数被调用!");
}
public BaseClass(string sStr) {
MessageBox.Show("基类的string型构造函数被调用!");
}
}
class MyClass:BaseClass{
public MyClass():base("haha"){ //注意这里base的使用,系统会根据()中参数的类型确定调用基类的那个构造函数。
MessageBox.Show("派生类的默认构造函数被调用!");
}
override public void Print()
{
MessageBox.Show("派生类的Print()函数被调用!");
}
三. C#中的虚函数:
C++中一句virtual就能声明虚函数的方法被C#改的麻烦了一些,在C#中要是需要使用虚函数首先需要对基类中的函数做virtual声明,然后再派生类中对重载的函数再进行override(覆盖)的声明,否则会报告类似于基类的函数将覆盖派生类中同名函数的警告,当派生类中没有使用override关键字时,多态调用该函数时始终调用基类中同名函数,多态性将不能被实现。如果有意让覆盖基类中的函数覆盖派生类中的同名函数,可以使用new 关键字来让编译器的警告窗口闭嘴!
四.接口
接口是C#所有而C++没有的概念,今天第一次接触,感觉概念比较抽象。就我的理解,接口是将实现与声明独立出来的一种结构,主要目的是保证方法的调用与方法的实现之间的独立性,即当所实现的类发生改变的时候不需要改变程序中的调用语句只需要改变类的实现就可以了。似乎在同一种语言别写的程序中这个接口有些多余,但是.Net环境的一个重要的特点就是多种语言可以同时使用在这一个框架中,这样接口的作用就体现出来了,只要接口给定,任你使用什么语言编写接口的实现都无所谓,程序都可以通过接口来调用这个方法,实现这个方法的功能。在只有一种语言编写的程序中,可以把接口看成是一个虚基类,仅仅是对类的更高层次的抽象而已。不知道我的认识队还是不对。
接口的定义
inte***ce I接口名(){
方法,属性,时间,索引器列表
}
class 实现类名(): I接口名{
返回值类型 I接口名.方法名(){
方法的实现
}
}
调用方法:
接口名 变量名=new 实现类名();
这样就可以使用接口中定义的方法了。接口可以被多继承,但不能有嵌套的结构体或类,不能用public等关键字修饰。
五.抽象类
抽象类的声明方法基本与C++中的相同,同样需要使用abstract关键字。
有一点不同的是,抽象类中可以实现方法,例如:
abstract class AbstractClass{
public int Methods() {
int a;
a = 1;
return a;
}
}
与C++中数组变量存在于连续的栈区域中不同, C#中的数组是引用型的变量,实际的值并不存在与栈中,因此在使用的时候需要先进性new操作,否则编译器会报错。在声明数组的时候只需告知数组类型而无需指定数组长度,在使用该数组前需要对其进行new操作并赋予初始值,如果不赋初值则系统会根据不同类型为数组成员赋初值。声明数组的格式为:
object [] MyObjects;
MyObjects=new object[10]{........}; //注意:没有"="
二维数组不再用“[ N ][ M ]”来表示,而是改用了“[ N , M ]”来表示,声明格式为:
object [ , ] MyObjects; 注意“,”
MyObjects=new object[M,N]{{N1,N2},{M1,M2}};
C#中提供了一个传递无需知道参数个数就可以声明函数的关键字params,例如:
private void TestParam(params object [] MyParam) {
int nMin = 999;
foreach (int i in MyParam) {
if (i < nMin) nMin = i;
}
MessageBox.Show(nMin.ToString());
return;
}
函数可以实现从任意类型(可比较大小的类型)任意个参数中取最小值的功能,调用方法可以
TestParam(1,2);
TestParam(1,2,3);
或 TestParam(1,2,3,.......,n);
params声明的参数在参数表中只能有一个,如果还存在其他类型的参数,则params参数必须写在参数的最后。
二.继承
从新出现的各种语言来看,都不再支持多继承这种方式, C#中也只支持单继承。与C++不同的是,C#中的继承方式被强制成了public,取消了private和protected两种方式,提到这三种继承方式突然发现把这三种继承方式的区别忘了,破记性~~~温习一下吧
/****************************************************************************/
public继承:派生类可以访问基类中private和protected型数据,派生类生成的对象可以访问基类中public属性的成员
private、protected继承:派生类可以访问基类中private和protected型数据,但派生类的对象不能访问基类中的成员。
/***************************************************************************/
C#中不直接支持private和protected方式,会不会对类的封装造成影响呢?
派生类在被声明的时候会调用基类的构造函数,如果不对派生类的构造函数作任何操作,则派生类创建对象时要调用基类的默认构造函数,如果想调用基类非默认构造函数,可以如下形式声明。
注意:C#的结构以类来组织,System.Object是最高层次的基类,所有类(包括系统定义的类和用户自定义的类)都继承System.Object类,因此,object型变量可以容纳任何类型(基类声明的对象可以被赋值成派生类的对象)。
class BaseClass
{
public BaseClass() {
MessageBox.Show("基类的默认构造函数被调用!");
}
public BaseClass(string sStr) {
MessageBox.Show("基类的string型构造函数被调用!");
}
}
class MyClass:BaseClass{
public MyClass():base("haha"){ //注意这里base的使用,系统会根据()中参数的类型确定调用基类的那个构造函数。
MessageBox.Show("派生类的默认构造函数被调用!");
}
override public void Print()
{
MessageBox.Show("派生类的Print()函数被调用!");
}
三. C#中的虚函数:
C++中一句virtual就能声明虚函数的方法被C#改的麻烦了一些,在C#中要是需要使用虚函数首先需要对基类中的函数做virtual声明,然后再派生类中对重载的函数再进行override(覆盖)的声明,否则会报告类似于基类的函数将覆盖派生类中同名函数的警告,当派生类中没有使用override关键字时,多态调用该函数时始终调用基类中同名函数,多态性将不能被实现。如果有意让覆盖基类中的函数覆盖派生类中的同名函数,可以使用new 关键字来让编译器的警告窗口闭嘴!
四.接口
接口是C#所有而C++没有的概念,今天第一次接触,感觉概念比较抽象。就我的理解,接口是将实现与声明独立出来的一种结构,主要目的是保证方法的调用与方法的实现之间的独立性,即当所实现的类发生改变的时候不需要改变程序中的调用语句只需要改变类的实现就可以了。似乎在同一种语言别写的程序中这个接口有些多余,但是.Net环境的一个重要的特点就是多种语言可以同时使用在这一个框架中,这样接口的作用就体现出来了,只要接口给定,任你使用什么语言编写接口的实现都无所谓,程序都可以通过接口来调用这个方法,实现这个方法的功能。在只有一种语言编写的程序中,可以把接口看成是一个虚基类,仅仅是对类的更高层次的抽象而已。不知道我的认识队还是不对。
接口的定义
inte***ce I接口名(){
方法,属性,时间,索引器列表
}
class 实现类名(): I接口名{
返回值类型 I接口名.方法名(){
方法的实现
}
}
调用方法:
接口名 变量名=new 实现类名();
这样就可以使用接口中定义的方法了。接口可以被多继承,但不能有嵌套的结构体或类,不能用public等关键字修饰。
五.抽象类
抽象类的声明方法基本与C++中的相同,同样需要使用abstract关键字。
有一点不同的是,抽象类中可以实现方法,例如:
abstract class AbstractClass{
public int Methods() {
int a;
a = 1;
return a;
}
}