⿊马程序员-C#学习笔记(⼆)
-
C# 学习笔记
⼀、变量与表达式
1.变量第⼀个字母必须是字符、下划线或@,其后就可以字符、数字、下划线。
2.字⾯值
(1)double为浮点默认字⾯值,在给float或decimal浮点型赋值时要加f/F或m/M。
3。表达式
Char变量实际存储的是数字,所以把两个char变量加在⼀起会得到⼀个数字。
⼆、流程控制
2.Switch
在C#中,执⾏完⼀个Case语句后,不能进⼊下⼀个Case语句,⽽就加个break或return 或goto语句,如若不然会报错!但是有个例外,如果把多个Case语句放在⼀起,但是前⾯的Case语句没有执⾏体,只有最后⼀个Case语句有执⾏体,实际是⼀次检查多个条件。也即只要其中有⼀个符合,那么最后⼀个Case语句的执⾏体就会执⾏!
例:
Case <comparison X>:
Case <compareson Y>:
<code>
Break;
这⾥的X或Y必须是常量(字⾯值或字符常量)。
3.foreach语句
可以⽤foreach来查string,可以⽤索引访问其字符。
Froeach(char c in mStrings){}
三、变量的更多内容
1.显式转换
(1)⽤Checked和uncheked检测表达式的溢出,也就是将数据类型转换为另⼀种数据类型时,可以知道是否有数据丢失。
(2)Convert命令显⽰转换时,它总是检测溢出的。
(3)⽐Int类型低的整数类型(char,byte,shor等),进⾏运算后提升为int类型,所以必须⽤int或Long等长整数类型来保存结果(当然⽤浮点也可以的)。⽽针对float和double不会出现这种情况,float运算可以⽤float类型存值。
(4)变量在赋值后,这个变量才拥有内存空间,如果这种占据内存空间插座在循环中发⽣,该值实际上定义了⼀个局部值。在循环外部会超出作⽤域。⼀般情况下,最好在声明和初始化所有的变量后,再在代码中使⽤它们。
四、数组
1.数组声明和初始化
由于数组是引⽤类型,所以应该⽤new来初始化数组。
(1)⼀维
Int[] a={1,2};//这样也可以的。
Int[] a=new int[2]{1,2};//定⼤⼩(元素个数与数组⼤⼩必须匹配)
Int[] a=new int[]{2,3,3};//由值定义⼤⼩
Int[] a=new int[size];//常量定义
Const int size=3;
(2)多维
Int[,] a=new int[2,2];
Int[,] a={{1,2},{2,3}};//
与C不同的是⽤数组初始化器(⽤字⾯值初始化)时,必须指定每个元素的值,不能遗漏。针对⼀维数组可以⽤foreach来循环访问每个元素。
Foreach(int I in myInt){}
(3)变长数组
注意:⼦数组是不能指定的,⽽必须分开指定。
例:Int[][] a;
a=new int[2][];
a[0]=new int[4];
a[1]=new int[5];
或 a=new int[2][]{new int[]{1,2},new int[]{3,4}};
例:int[][] a={new int[]{1,2,3},new int[]{3,3,3}};
2Array类
此类是作为所有数组的虚基类,当⽤C#语法声明了数组,实际上就继承了它的⽅法和属性。
属性说明
Length 返回元素个数,返回int型,如果多维数组,返回所有阶的元素个数
Longlength 返回元素个数,只是⽤Long型返回的。
Rank 返回数组的维数
常⽤⽅法
CreateInstance(),SetValue(),Sort()
3.迭代器
迭代器的定义是,它是⼀个代码块,按顺序提供了要在foreach循环中使⽤的所有值,⼀般情况下,这个代码块是⽅法,但也可以使⽤属性访问器和其代码块作为迭代器。
(1)如果要迭代⼀个类,使⽤⽅法GetEnumerator(),其返回类型是IEnumerator就可以了。
(2)如果要迭代⼀个类成员,例如⽅法,则返回类型IEnumerable。
上海传智播客黑马程序员在迭代器块中,使⽤yeild关键字选择要在foreach循环中使⽤的值。可以使⽤yield return;来中⽌返回值。
Public static IEnumerable SimpleList()//迭代⼀个类成员
{
Yield return “str1”;
Yield return “str2”;
}
Foreach(string item in SimpleList){}
Public IEnumerator GetEnumerator()//如果类中存在这个⽅法并且返回相应接⼝就可以迭代⼀个类。⼀般类重写IEnumerable接⼝来实现,泛型和⾮泛型都实现
{
Yield return “ok”;
}
五、类
1.定义类
(1)类型访问修饰符只能是public、internal(只是程序集中可以访问),如果没有加可访问性修饰符,默认为internal。
(2)类的抽象(abstract)或密封(sealed)
(3)不允许派⽣类的可访性⽐基类更⾼,也即,内部类可以继承公共类,公共类不能继承内部类。
(4)当类既要继承基类也实现接⼝时,必须把基类写在前,接⼝放在后。
例如public class AClass:BClass,Itest
2.构造函数
(1)普通构造函数可以有访问修饰符。若有把构造函数设置为私有的,它在以下两种情况下有⽤的:
类仅为某些静态成员或属性的容器,因此永远不会实例化。
希望类仅通过调⽤某个静态成员函数来实例化。
(2)若定义了带有参数的构造函数,编译器不会⾃动创建默认的⽆参构造函数,只有没有显⽰定义任何构造函数时,编译器才提供⽆参构造函数。
(3)静态构造函数
作⽤:给类中静态成员执⾏更复杂的初始化。
⼀个类中只能有⼀个静态构造函数,该构造函数不能有参数,不能有访问修饰符,它不能直接调⽤,只能访问静态类型成员,只能下述情况调⽤:
1)创建包含该静态构造函数的类实例时。
2)访问包含静态构造函数的类的静态成员时。
这两种情况都会先调⽤静态构造函数,然后执⾏其它的。⽆论创建了多了该类型实例,其静态构造函数只调⽤⼀次。
(4)构造函数执⾏序列
1)⽆论使⽤什么构造函数实例化⼀个类,总是先调⽤System.object.object()
2)除⾮明确指定,否则就使⽤基类默认构造函数。
3)显⽰调⽤基类的构造函数⽤base关键字,例:
Public MyClass(int I,int j):base(2){}
或public MyClass(int I,int j):base(i){}
4)本类构造函数调⽤本类另⼀个构造函数。
Public MyClass():this(6,7){}
Pulibc MyClass(int I,int j):base(i){}
当使⽤MyClass()构造函数时,先执⾏System.object.object(),接着执⾏基类带⼀个参数的构造函数,再执⾏本类型带两个参数的MyClass(int I,int j),最后执⾏MyClass()。
3.成员定义
类中的数据成员有默认值。如果没有显⽰声明成员的可访问性,编译器通常默认选择private(限制最⼤的那个)
(1)访问修饰符public,private,interal,protected适⽤于⽅法、字段、属性、事件.
(2)字段、属性、⽅法、事件都能⽤static声明。
(3)字段若加上readonly关键字,表⽰它只能由初始化语句或只能在⾮静态构造函数中赋值。(只加readonly属于实例字段)(4)⽤const声明字段后,static就不能再加,否则报错。它们都是类级别,都是静态的存储
private static string connectionString;可以在构造函数(静态和⾮静态)或属性或初始化语句中赋值!
private const string connectionString;只能⽤初始化语句赋值!
private static readonly string connectionString;这样的字段也只能在初始化语句中或静态构造函数中赋值,不能在⾮静态构造函数或属性中赋值!
(5)静态⽅法只能访问静态⽅法、静态属性、静态字段,返过来⾮静态成员是可以访问静态成员的。
(6)以下关键字不能⽤于静态⽅法或静态属性,想想就知道了为什么!
virtual-⽅法可重写。
Abstrct-⽅法必须在⾮抽象类中重写(只能⽤于抽象类中)
Override-⽅法重写了⼀个基类⽅法(⽅法被重写,必须使⽤)
Extern-⽅法定义放在其它地⽅
NEW-显⽰说明隐藏基类⽅法
其中virtual Abstrct Override可以⽤在属性中(不是属性块)。
(7)如果重写了⼀个⽅法,可以⽤sealed指定派⽣类中不能对这个⽅法作进⼀步的修改。也即孙⼦类不能再重写此⽅法,本来是可以重写的。
(8)显⽰的调⽤基类的⽅法使⽤base关键字。
例:
Public override void DoSomething()
{
Base.Dosomething();
}
由于base关键字是对象的实例,不能在静态⽅法中使⽤,同样也经常使⽤this关键字在⽅法中传递调⽤对象实例。
(9) protected internal:在同⼀个Assembly中,他的访问级别和public⼀样,⽽跨Assembly访问时,他的访问级别同protected⼀样。即protected的范围 + internal的范围。
(10)⼀个派⽣类型重写在它的基类中定义的⼀个成员时,C#编译器要求原始成员和重写成员具有相同的可访问性。也即,如果基类中的成员是protected的,派⽣类是的重写成员也必须是protected的。
4.⽅法
(1)引⽤参数(ref和out)
⽤ref时,在⽅法调⽤和⽅法声明中都要指定reft,并且传递的变量必须是初始化后来变量,否则出错。
⽤out时,⾸先,传递的变量可以事先没有赋值,其次,在⽅法中,该参数被看作没有赋值的,因此,在⽅法中必须对此参数赋值,否则出错(⽽ref不必须赋值)。
(2)参数数组
这个参数必须是函数定义听最后⼀个参数,它可以使⽤个数不定要参数调⽤函数,⽤params关键字定义。
例:void fun(params <type>[] <name>)
注意:如果给参数数组传个数组,那么就不能再传递任何参数了,否则报错,当然调⽤此函数时也可以不传递任何参数。
5.属性
(1)⾃动实现属性
这种属性会⾃动实现基础成员变量。如
Public stirng ForeName(get;set;)
不需要声明private string forename,编译器会⾃动实现它。⽽且这两个访问器(get,set)必须成对出现,缺⼀个不可。
(2)属性中的get或set块⼉可以使⽤protected或private修饰符,public不可以,因为这两个访问器修饰符必须⽐属性具有更强的限制。
6.结构
(1)结构和类的区别
类和结构的区别是它们在内存中的存储⽅式不同(类是存储在堆上的引⽤类型,⽽结构是存储在栈⾥的值类型)
结构不⽀持继承
构造函数的⼯作⽅式有⼀些区别。尤其是编译器总是提供⼀个⽆参的默认构造函数,这是不允许替换的。
使⽤结构,可以指定如何在内存中布局。
(2)结构是值类型
结构是值类型那么就有值类型的特征
例
Struct Test{pubic int width;public int height;}
Test t;
T.width=2;
T.height=3;
如果Test是个类,这种声明后没有分配空间就为其数据成员赋值是会出错的,但对结构是值类型,在声明时就已经在栈⾥分配了空间,因此可以为其成员赋值了。
如果结构作为了类的数据成员,那么结构变量的数据成员就具有默认值。和其它的预定义类型是⼀样的。
(3)结构和继承
结构不能继承的,但是每个结构派⽣于System.valueType,System.ValueType派⽣于于System.object.因此可以重写object的⽅法.
(4)我们不能像类那样显⽰去为结构定义⽆参构造函数,那是编译器提供的。
(5)
class是引⽤类型,继承⾃System.Object类;struct是值类型,继承⾃System.ValueType类,因此不具多态性。但是注
意,System.ValueType是个引⽤类型。
从职能观点来看,class表现为⾏为;⽽struct常⽤于存储数据。
class⽀持继承,可以继承⾃类和接⼝;⽽struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct⽀持接⼝继承(记得吗,《》也做过讨论)
class可以声明⽆参构造函数,可以声明析构函数;⽽struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有⾃定义的默认⽆参构造函数,默认⽆参构造器只是简单地把所有值初始化为它们的0等价值
实例化时,class要使⽤new关键字;⽽struct可以不使⽤new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引⽤未赋值的字段会导致编译错误。
class可以实抽象类(abstract),可以声明抽象函数;⽽struct为抽象,也不能声明抽象函数。
class可以声明protected成员、virtual成员、sealed成员和override成员;⽽struct不可以,但是值得注意的是,struct可以重载System.Object的3个虚⽅法,Equals()、ToString()和 GetHashTable()。
class的对象复制分为浅拷贝和深拷贝(该主题我们在本系列以后的主题中将重点讲述,本⽂不作详述),必须经过特别的⽅法来完成复制;⽽struct创建的对象复制简单,可以直接以等号连接即可。
class实例由垃圾回收机制来保证内存的回收处理;⽽struct变量使⽤完后⽴即⾃动解除内存分配。
作为参数传递时,class变量是以按址⽅式传递;⽽struct变量是以按值⽅式传递的。
7.静态类
只能包含静态成员。可以有静态构造函数。
六、接⼝
1.定义接⼝
(1)类型访问修饰符只能是public、internal(只是项⽬中的代码可以访问)或没有。
(2)关键字abstract或sealed不能使⽤。
2.接⼝实现
(1)⼀个接⼝要隐藏基接⼝的成员,可以使⽤new来实现。
(2)接⼝中可以定义属性(相当于⽅法)。
(3)接⼝成员定义:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论