文档详情

C#基础知识点

时间****91
实名认证
店铺
DOC
200KB
约21页
文档ID:155277362
C#基础知识点_第1页
1/21

C# 基础知识点1、 数据类型1.1、 值类型、引用类型1.2、 预定义类型1.3、 类型转换1.4、 装箱和拆箱2、 变量、常量2.1、变量2.2、常量3、 运算符和表达式3.1、运算符、表达式3.2、特殊运算符3.3、优先级别4、 流程控制4.1、条件语句4.2、循环语句4.3、跳转语句4.4、异常处理5、 程序结构5.1、类5.2、命名空间5.3、Main方法6、程序例子7、作业一 数据类型1.1 值类型、引用类型C# 的数据类型可以分成两大部分:值类型和引用类型值类型的变量总是直接包含着自身的数据,而引用类型的变量是指向实际数据的地址C# 值类型包括:整型、布尔型、实型、十进制型、结构和枚举、接口和数组从概念上看,其区别是值类型直接存储其值,而引用类型存储对值的引用这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上注意区分某个类型是值类型还是引用类型,因为这种存储位置的不同会有不同的影响例如,int是值类型,这表示下面的语句会在内存的两个地方存储值20: // i 和j都是整型变量i = 20;j = i;但考虑下面的代码这段代码假定已经定义了一个类class1,class1是一个引用类型,它有一个int类型的成员变量Value: class1 x, y x = new class1 ();x.Value = 30; y = x;Console.WriteLine(y.Value);//输出30y.Value = 50;Console.WriteLine(x.Value);//输出50要理解的重要一点是在执行这段代码后,只有一个class1对象。

x和y都指向包含该对象的内存位置因为x和y是引用类型的变量,声明这两个变量只是保留了一个引用——而不会实例化给定类型的对象因为x和y引用同一个对象,所以对x的修改会影响y,反之亦然因此上面的代码会显式30和50 如果变量是一个引用,就可以把其值设置为null,确定它不引用任何对象: y = null;在C#中,基本数据类型如bool和long都是值类型如果声明一个bool变量,并给它赋予另一个bool变量的值,在内存中就会有两个bool值如果以后修改第一个bool变量的值,第二个bool变量的值也不会改变这些类型是通过值来复制的相反,大多数更复杂的C#数据类型,包括我们自己声明的类都是引用类型它们分配在堆中,其生存期可以跨多个函数调用,可以通过一个或几个别名来访问CLR(Common Language Runtime公共语言运行库指.NET的运行时支持,包括一个面向对象类型系统和一些运行时服务)执行一种精细的算法来跟踪哪些引用变量仍是可以访问的,哪些引用变量已经不能访问了CLR会定期进行清理,删除不能访问的对象,把它们占用的内存返回给操作系统这是通过垃圾收集器实现的1.2 预定义类型C#认可的基本预定义类型并没有内置于语言中,而是内置于.NET Framework中。

例如,在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例C#支持两个预定义的引用类型,如下表:CTS:公共类型系统名 称CTS 类说 明ObjectSystem.Object根类型,其他类型都是从它派生而来的(包括值类型) StringSystem.StringUnicode字符串1. object类型在C#中,object类型就是最终的父类型,所有内在和用户定义的类型都从它派生而来这是C#的一个重要特性, object类型就可以用于两个目的:● 可以使用object引用绑定任何特定子类型的对象● object类型执行许多基本的一般用途的方法,包括Equals()、GetHashCode()、GetType()和ToString()用户定义的类可能需要使用一种面向对象技术—— 重写,提供其中一些方法的替代执行方法例如,重写ToString()时,要给类提供一个方法,该方法可以提供类本身的字符串表示如果类中没有提供这些方法的实现,编译器就会在对象中选择这些实现,它们在类中的执行不一定正确2. string类型C#有string关键字,在翻译为.NET类时,它就是System.string。

有了它,像字符串连接和字符串复制这样的操作就很简单了: string str1 = "Hello ";string str2 = "World";string str3 = str1 + str2; // 字符串连接尽管这是一个值类型的赋值,但string是一个引用类型String对象保留在堆上,而不是堆栈上因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用但是,string与引用类型在常见的操作上有一些区别例如,修改其中一个字符串,注意这会创建一个全新的string对象,而另一个字符串没有改变考虑下面的代码: using System;class StringExample{ public static int Main() { string s1 = "a string"; string s2 = s1; Console.WriteLine("s1 is " + s1); Console.WriteLine("s2 is " + s2); s1 = "another string"; Console.WriteLine("s1 is now " + s1); Console.WriteLine("s2 is now " + s2); return 0; }}其输出结果为:s1 is a strings2 is a strings1 is now another strings2 is now a string换言之,改变s1的值对s2没有影响,这与我们期待的引用类型正好相反。

1.3类型转换1.隐式转换隐式转换就是系统默认的、不需要加以声明就可以进行的转换 隐式转换一般不会失败,转换过程中也不会导致信息丢失隐式转换包括下面几种:2.显式转换显式类型转换,就是强制类型转换与隐式转换正好相反,显式转换需要用户明确指定转换的类型,不如看下面例子: long l = 5000; int I = (int)l;显式转换可以发生在表达式的计算过程中它并不是总能成功,而且常常可能引起信息丢失显式转换包括所有的隐式转换显式转换包括下面几种:1.4 装箱和拆箱装箱和拆箱使我们可以把一个值类型当作一个引用类型看待装箱转换是指将一个值类型隐式的转换成一个Object类型,拆箱转换是指将一个Object类型显式地转换成一个值类型,他们互为逆过程装箱(boxing)装箱转换是指将一个值类型隐式转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型把一个值类型的值装箱,也就是创建一个object实例并将这个值给这个objet.不如: Int i = 10; Object obj = i;拆箱(unboxing)拆箱转换是指将一个对象类型显式转换成一个值类型,或是将一个接口类型显示地转换成一个执行该接口的值类型。

拆箱的过程分为两步:首先,检查这个对象的实例,看它是否为给定的值类型的装箱值然后,把这个实例的值拷贝给值类型的变量如: Int i = 10; Object obj = i; Int j = (int)obj;二 变量、常量2.1、变量在C#中声明变量使用下述语法:datatype identifier;例如: int i; 一旦它被声明之后,就可以使用赋值运算符(=)给它分配一个值: i = 10;还可以在一行代码中声明变量,并初始化它的值: int i = 10; 如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型: int x = 10, y =20;要声明类型不同的变量,需要使用单独的语句在多个变量的声明中,不能指定不同的数据类型: int x = 10;bool y = true; int x = 10, bool y = true; // 这样编译报错1.变量的初始化变量的初始化是C#强调安全性的另一个例子简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。

大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值C#有两个方法可确保变量在使用前进行了初始化:● 变量是类或结构中的字段,如果没有显式进行初始化,在默认状态下当创建这些变量时,其值就是0● 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误同样的规则也适用于引用类型考虑下面的语句: Something objSomething;在C#中,这行代码仅会为Something对象创建一个引用,但这个引用还没有指向任何对象对该变量调用方法或属性会导致错误在C#中实例化一个引用对象需要使用new关键字如上所述,创建一个引用,使用new关键字把该引用指向存储在堆上的一个对象: objSomething = new Something(); // This creates a Something on the heap2.变量的作用域变量的作用域是可以访问该变量的代码区域。

一般情况下,确定作用域有以下规则:● 只要字段所属的类在某个作用域内,其字段(也称为成员变量)也在该作用域内局部变量存在于表示声明该变量的块语句或方法结束的封闭花括号之前的作用域内● 在for、while或类似语句中声明的局部变量存在于该循环体内 局部变量的作用域冲突大型程序在不同部分为不同的变量使用相同的变量名是很常见的只要变量的作用域是程序的不同部分,就不会有问题,也不会产生模糊性但要注意,同名的局部变量不能在同一作用域内声明两次,所以不能使用下面的代码: int x = 20;// 其它代码int x = 30;字段和局部变量的作用域冲突在某些环境下,可以区分名称相同(尽管不是经过完全限定的名称)、作用域相同的两个标识符此时编译器允许声明第二个变量原因是C#使得变量之间有一个基本的区分,它把声明为类型级的变量看作是字段,而把在方法中声明的变量看作局部变量2.2、常量在声明和初始化变量时,在变量的前面加上关键字const,就可以把该变量指定为一个常量顾名思义,常量是其值在使用过程中不会发生变化的变量: const int a = 100; //变量的值不能改变C#中只能把局部变量和字段声明为常量。

常量具有如下特征:● 常量必须在声明时初始化指定了其值后,就不能再修改了● 常量的值必须能在编译时用于计算因此,不能用从一个变量中提取的值来初始化常量如果需要这么做,应使用只读字段● 常量用易于理解的清楚的名称替代了“含义不明确的数字或字符串”,使程序更易于阅读● 常量使程序更易于修改例如,在C#程序中有一个SalesTax常量,该常量的值为6%如果以后销售税率发生变化,可以把新值赋给这个常量,就可以修改所有的税款计算,而不必查找整个程序,修改税率为0.06的每个项● 常量更容易避免程序出现错误如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误三 运算符和表达式3.1、运算符、表达式算术操作符和算术表达式 + 加法操作符 - 减法操作符 * 乘法操作符 / 除法操作符 % 求余法操作符例:加法表达式 Enum Weekday{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};Weekday day1 = weekday.Sunday;Weekday day2 = day1+2;Console.WriteLine(day2);结果是: Tuesday 赋值运算符 = += -= *= /= &= ^= <<= >>= =是最简单的赋值运算符,其它的是复合赋值 ,X +=5 等价于X = X+5; 关系运算符 == 等于 !=不等于 < 小于 > 大于 <= 小于等于 >= 大于等于 Is运算符 Is元算符被用于动态的检查运行时对象类型是否和给定的类型兼容。

运算“ e is T”的结果,其中,e 是一个表达式,T是一个类型,返回值是一个布尔值它表示,e是否能通过引用转换,装箱转换,成功的转换于 T类型 如:1 is int 结果是: true As 操作符 As 操作符通过引用转换或装箱转换将一个值显式地转换成指定的引用类型不像显式类型转换,as 不会产生任何异常如果转换不可以进行,那么结果值为null 形如“e as T”的运算,e 是一个表达式,T是一个引用类型返回值的类型总是T的类型,并且结果总是一个值如: ? as string;虽然,字符型不能转换为字符串类型,程序可以通过,不过有一个警告 位运算 & 与| 或^ 异或~ 取补<< 左移>> 右移3.2、特殊运算符 三元操作符 ?: 条件表达式 b ? x : y ,先计算条件b ,然后进行判断 如果 b 的值为true,计算 x 的值,运算结果为 x 的值;否则,计算y,运算结果为 y 值一个表达式,从不会即计算 x 值,又计算y 值条件表达式是向右关联,例如: a ? b : c ? d: e 将按 a ? b: (c ? d : e)的形式执行。

自增和自减操作符 ++ ――就是对变量自身加一或者减一,注意,自增和自减运算符必须是对一个变量, 一个属性访问器,一个索引访问器,而不能是常量或其表达式, 如:5++,(x+y)++ 都是非法的 自增和自减操作符有前缀和后缀之分,前缀遵循“先增减,后使用”,后缀遵循“先使用后增减” New 操作符 一般用于创建一个新的类型实例, 如: class A{} A a = new A();改运算符还有其它更多的用法,具体如下:在 C# 中,new 关键字可用作运算符、修饰符或约束1)new 运算符:用于创建对象和调用构造函数这种大家都比较熟悉,没什么好说的了2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型  关于第二种用法看下例:using System;namespace ConsoleApplication1{    public class BaseA    {        public int x = 1;        public void Invoke()        {            Console.WriteLine(x.ToString());        }        public int TrueValue        {            get { return x; }            set { x = value; }        }    }    public class DerivedB : BaseA    {        new public int x = 2;        new public void Invoke()        {            Console.WriteLine(x.ToString());        }        new public int TrueValue        {            get { return x; }            set { x = value; }        }    }     class Test    {        static void Main(string[] args)        {            DerivedB b = new DerivedB();            b.Invoke();//调用DerivedB的Invoke方法,输出:2            Console.WriteLine(b.x.ToString());//输出DerivedB的成员x值:2            BaseA a = b;            a.Invoke();//调用BaseA的Invoke方法,输出:1            a.TrueValue = 3;//调用BaseA的属性TrueValue,修改BaseA的成员x的值            Console.WriteLine(a.x.ToString());//输出BaseA的成员x的值:3            Console.WriteLine(b.TrueValue.ToString());//输出DerivedB的成员x的值,仍然是:1//可见,要想访问被隐藏的基类的成员变量、属性或方法,办法就是将子类造型为父类,然//后通过基类访问被隐藏的成员变量、属性或方法。

        }     }} new约束指定泛型类声明中的任何类型参数都必须具有公共的无参数构造函数.请看下例:using System;using System.Collections.Generic; namespace ConsoleApplication2{    public class Employee    {        private string name;        private int id;         public Employee()        {            name = "Temp";            id = 0;        }         public Employee(string s, int i)        {            name = s;            id = i;        }         public string Name        {            get { return name; }            set { name = value; }        }         public int ID        {            get { return id; }            set { id = value; }        }    }     class ItemFactory where T : new()    {        public T GetNewItem()        {            return new T();        }    }     public class Test    {        public static void Main()        {            ItemFactory EmployeeFactory = new ItemFactory();            ////此处编译器会检查Employee是否具有公有的无参构造函数。

            //若没有则会有The Employee must have a public parameterless constructor 错误            Console.WriteLine("{0}'ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID);        }    }} Typeof 操作符 用于获得系统原形对象的类型 如: typeof(int) 等于 int32. Checked 和 unchecked 操作符 Checked 和 unchecked 操作符用于整形算术运算时控制当前环境中的溢出检查 Const int x = 1000000; Const int y = 1000000; Return checked(x * y) //编译时会报溢出错误 3.3、优先级别 当一个表达式包含多个操作符时,操作符的优先级控制着单个操作符的求值顺序四 流程控制4.1、条件语句 条件语句可以根据条件是否满足或根据表达式的值控制代码的执行分支。

C#有两个分支代码的结构:if语句,测试特定条件是否满足;switch语句,它比较表达式和许多不同的值1. if语句语法都是非常直观的:if (condition) statement(s)else statement(s)还可以单独使用if语句,不加else语句也可以合并else if子句,测试多个条件2. switch语句switch...case语句适合于从一组互斥的分支中选择一个执行分支其形式是switch参数的后面跟一组case子句如果switch参数中表达式的值等于某个case子句旁边的某个值,就执行该case子句中的代码此时不需要使用花括号把语句组合到块中;只需使用break语句标记每个case代码的结尾即可也可以在switch语句中包含一个default子句,如果表达式不等于其他case子句的值,就执行default子句的代码下面的switch语句测试integerA变量的值: switch (integerA){ case 1: Console.WriteLine("integerA =1"); break; case 2: Console.WriteLine("integerA =2"); break; case 3: Console.WriteLine("integerA =3"); break; default: Console.WriteLine("integerA is not 1,2, or 3"); break;}注意case的值必须是常量表达式——不允许使用变量。

4.2、循环语句C#提供了4种不同的循环机制(for、while、do...while和foreach),在满足某个条件之前,可以重复执行代码块1. for循环C#的for循环提供的迭代循环机制是在执行下一次迭代前,测试是否满足某个条件,其语法如下:for (initializer; condition; iterator) statement(s)其中:● initializer是指在执行第一次迭代前要计算的表达式(通常初始化为一个局部变量,作为循环计数器);● condition是在每次迭代循环前要测试的表达式(它必须等于true,才能执行下一次迭代);● iterator是每次迭代完要计算的表达式(通常是递增循环计数器)当condition等于false时,迭代停止for循环是所谓的预测试循环,因为循环条件是在执行循环语句前计算的,如果循环条件为假,循环语句就根本不会执行for循环非常适合用于一个语句或语句块重复执行预定的次数下面的例子就是使用for循环的典型用法,这段代码输出从0~99的整数: for (int i = 0; i < 100; i = i+1) { Console.WriteLine(i); }2. while循环while循环与for循环一样,while也是一个预测试的循环。

其语法是类似的,但while循环只有一个表达式:while(condition) statement(s);与for循环不同的是,while循环最常用于下述情况:在循环开始前,不知道重复执行一个语句或语句块的次数通常,在某次迭代中,while循环体中的语句把布尔标记设置为false,结束循环,如下面的例子所示 int i = 10,sum = 0;while (i > 0){ i --; sum += i;}3. do…while循环do...while循环是while循环的后测试版本do...while循环适合于至少执行一次循环体的情况: int i = 10, sum = 0; do { i--; sum += i; } while (i > 0);4. for each循环foreach循环是我们讨论的最后一种C#循环机制也是非常受欢迎的一种循环从下面的代码中可以了解foreach循环的语法,其中假定arrayOfInts是一个整型数组: int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; foreach (int i in numbers) { System.Console.WriteLine(i); }其中,foreach循环一次迭代数组中的一个元素。

对于每个元素,它把该元素的值放在int型的变量temp中,然后再执行一次循环迭代如果需要迭代集合中的各项,并改变它们的值,就应使用for循环4.3、跳转语句C#提供了许多可以立即跳转到程序中另一行代码的语句,在此,先介绍goto语句1. goto语句goto语句可以直接跳转到程序中用标签指定的另一行(标签是一个标识符,后跟一个冒号): goto Label1; Console.WriteLine("This won't be executed");Label1: Console.WriteLine("Continuing execution from here");goto语句有两个限制不能跳转到像for循环这样的代码块中,也不能跳出类的范围,不能退出try...catch块后面的finally块goto语句的名声不太好,在大多数情况下不允许使用它一般情况下,使用它肯定不是面向对象编程的好方式 前面简要提到过break语句——在switch语句中使用它退出某个case语句实际上,break也可以用于退出for、foreach、while或do...while循环,循环结束后,立即执行后面的语句。

如果该语句放在嵌套的循环中,就执行最内部循环后面的语句如果break放在switch语句或循环外部,就会产生编译时错误2. continue语句continue语句类似于break,也必须用于for、foreach、while或 do...while循环中但它只从循环的当前迭代中退出,然后从循环的下一次迭代开始重新执行,而不是退出循环3. return语句return语句用于退出类的方法,把控制返回方法的调用者,如果方法有返回类型,return语句必须返回这个类型的值,如果方法没有返回类型,应使用没有表达式的return语句4.4、异常处理Try – catch(s)Try – finallyTry – catch(s) – finally五 程序结构5.1、类C#中的类是对数据结构的封装,是C#最重要的组成部分我们利用类定义各种新的数据类型,其中既包含数据内容,有包含数据操作,封装之后,类可以控制外界对它成员的访问类的静态成员属于类,非静态成员属于这个类的某个实例在一个类的实例——对象的生命周期中,最先执行的代码是类的构造函数,构造函数总是用来初始化对象的特殊类型的函数不带参数的类的构造函数对类的实例的初始化始固定的,我们也可以使用带参数的构造函数,通过向他传递参数来对类的不同实例进行不同的初始化。

构造函数同样也可以使用默认参数当这个类的实例超出了作用域的时候,或者由于其它理由被破坏时,析构函数将释放分配给该实例的任何存储区5.2、命名空间 命名空间提供了一种组织相关类和其它类型的方式与文件或组件不同,命名空间时一种逻辑组合,而不是物理组合,在C#文件中定义类时,可以把它包含在命名空间的定义中,以后在定义另一个类,在另一个文件中执行相关操作时,就可以在同一个命名空间中包含它,创建一个逻辑组合,告诉其它使用类的开发人员如何使类相关,和对他们进行使用 命名空间可以嵌套如:Namespace A{Namespace B{ Namespace C { 代码块 }}}每个命名空间名都由他所在的命名空间的名称组成,这些名称用句号隔开,首先是最外层,最后是自己的名字如:上面的例子也可以写成:Namespace A. B. C{ 代码块}不允许在另一个嵌套的命名空间中声明多部分的命名空间也不能在同一命名空间中有两个同名的类5.3、Main方法C#程序是从方法Main()开始执行的这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void。

虽然显式指定public修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该方法指定什么访问级别并不重要,即使把该方法标记为private,它也可以运行在调用程序时,可以让CLR包含一个参数,将命令行参数转送给程序这个参数是一个字符串数组,传统称为args(但C#可以接受任何名称)在启动程序时,可以使用这个数组,访问通过命令行传送过来的选项下面的例子ArgsExample.cs是在传送给Main方法的字符串数组中迭代,并把每个选项的值写入控制台窗口:using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication2{ class Program { static void Main(string[] args) { for (int i = 0; i < args.Length; i++) { Console.WriteLine(args[i]); } } }}通常使用命令行就可以编译这段代码。

在运行编译好的可执行文件时,可以在程序名的后面加上参数,例如:在dos命令行中输入 :存储目录/ConsoleApplication2/a /b /c 输出:/a/b/c六 程序例子6.1、类的定义,继承,使用,类方法的重写using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class Vehicle { public int wheels; public float weight; public void F() { wheels = 4; weight = 10; } } class Car : Vehicle { int passengers; public void F() { weight = 8; wheels = 8; Vehicle v = new Vehicle(); v.wheels = 4; v.weight = 6; passengers = 10; Console.WriteLine("{0}{1}{2}{3}{4}", v.wheels,v.weight,wheels,weight,passengers); } public override string ToString() { string Result = "继承来的weight:" + weight.ToString() + "实例化Vehicle的weight:" + weight.ToString() + "自己的属性passengers:" + passengers.ToString(); return Result; } } class Program { static void Main(string[] args) { Car s = new Car(); s.F(); Console.WriteLine(s.ToString()); } }}6.2、运算符重载运算符重载注意事项:a. 可被重载的一元操作符:+、-、!、~(取补)、++、--、true、falseb. 可被重载的二元操作符:+、-、*、/、%、!、^(异或)、<、>、<<、>>、==、!=、<=、>=c. 不允许被重载的操作符:&&、||、=、?:、+=、-=、/=、%=、|=、^=、<<=、>>=,实际上其中一些“复式操作符”在二元操作符被重载后自动生成,而不能显式定义d. 必须成对重载的操作符:(== ,!=)、(<=,>=)e. ++、- -操作符重载时不能区分其为前置或后置的//根据经验值升级的例子using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ class Player { public int neili; public int tili; public int jingyan; public int r_neili; public int r_tili; public Player() { neili = 10; tili = 50; jingyan = 0; r_neili = 50; r_tili = 50; } public static Player operator ++(Player p) { p.neili = p.neili + 50; p.tili = p.tili + 100; //p.r_neili = p.r_neili; //p.r_tili = p.r_tili; return p; } public void Show() { Console.WriteLine("Tili:{0}", tili); } class Test { public static void Main() { Player man = new Player(); man.Show(); man++; Console.WriteLine("Now upgrading..."); man.Show(); } } }}七 作业一、基础概念理解题。

红色为必做题,其余选做)1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.sealed 修饰符是干什么的?7.override 和 overload 的区别?8.什么是索引指示器?9.new 修饰符是起什么作用?10.this 关键字的含义?11.可以使用抽象函数重写基类中的虚函数吗?12.密封类可以有虚函数吗?13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?15.接口可以包含哪些成员?16.类和结构的区别?17.接口的多继承会带来哪些问题?18.抽象类和接口的区别?19.别名指示符是什么?20.如何释放非托管资源?21.P/Invoke是什么?22.StringBuilder 和 String 的区别?23.explicit 和 implicit 的含义?24.params 有什么用?25.什么是反射?二、写程序练习循环、判断语句,运算符、函数重载,类的继承,out参数。

知识点必须练完,可以在一个程序例子中完成,也可以写多个例子练习)。

下载提示
相关文档
正为您匹配相似的精品文档