void 无返回值
命名空间:using语句 只能用于命名空间
C# 命名方法:
变量名----Camel方法 someVariableName
类,命名空间,函数 ------Pascal方法,SomeFunction
C# static用法:
静态类不能实例化
不能使用new 关键字创建静态类类型的变量
因为没有实例变量,所以要使用类名本身访问静态类的成员。
new一个int时,new运算符用于初始化其值为0。不管是重写还是覆盖都不会影响父类自身的功能。只在子类上生效。
VS2008快捷键操作:
F9:调试断点设置
F10:单步执行
F11:单步进入
F12:跳转到函数定义处
C# 是一个强类型语言,区分大小写
C#中的深拷贝与浅拷贝
深拷贝:又称深度克隆,它完全是新对象的产生,不仅复制所有的非静态值类型成员,而且复制所有引用类型成员的实际对象。(即栈上和堆上的成员均进行复制)
浅拷贝:又称影子克隆,只复制原始对象中的所有的非静态的值类型成员和所有引用类型成员的引用,就是说,原始对象和新对象共享所有引用类型成员的对象实例。(即只复制栈上的成员)
常见转义字符:
\0 null
\b 退格
\f 走纸换页
\n 换行
\r 回车
\t 横向跳到下一制表位置
\v 竖向跳到下一制表位置
字符串表示:
” 包裹字符串
’ 包裹单个字符
多条语句放在一行,需用分号进行分割。
用于条件编译或划分代码块。
如:#if #else #define #region #endregion
@ 符号的两种用法:
1、常用在字符串开头,它可以告诉编译器忽略转义符;
2、当给变量或属性取名时,变量名(或属性名)与.net中的关键字相同冲突,可以使用“@变量名”来绕过限制。
如:int @int = 123;
//这里@int变量用Reflector查看IL变量时,看到的是int,而不是@int。
隐式转换的要求:
数值类型小范围转大范围可以,大范围转小范围需要强制转换。
值类型:
基于值类型的变量直接包含值。 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自 [System.ValueType]与引用类型不同,不能从值类型派生出新的类型。 但与引用类型相同的是,结构也可以实现接口。与引用类型不同,值类型无法包含 null值。 但是,[可以为 null 的类型]功能允许值类型分配给 null。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 有关值类型的默认值的信息。
enum枚举用法语句分号结尾,空白可以忽略
C#关键字统统为小写,关键字与标识符之间的空白不多余,C#语句必须以分号; 分隔
switch(){case 1: ;break;}break在每个case后面
do...while语句至少会执行一次for(初始化语句;表达式;递增语句)语句
C# continue与break
continue 跳过此次判断,但不跳出for循环
break 直接跳出for循环
一个变量使用前缀或后缀方式增1的结果是一样的。但,如果涉及到增1后的赋值,前缀增1会把增1后的值赋值给其它变量,而后缀增1会把增1前的值赋值给其它变量。自增减1与自增增1类似。
短路测试:and 左半部分为假,则不需检查后半部分,or左半部分为真,则不需检查右半部分操作符优先级表预处理指令是怎样的?
访问修饰符:
public:完全公开
private:完全私有
protected:当前class与继承class
internal:同一程序集
protected internal: 同一程序集或继承的子类可访问
sealed:只能用来修饰class,表示class不能被继承
C#中 this的相关用法
1、限定被相似的名称隐藏的成员
2、将对象作为参数传递到其他方法
3、声明索引器
4、扩展对象的方法
C#构造函数: 函数名与类名相同
构造函数的作用:
1、当一个类在new实例化对象时,可调用构造函数进行初始化对象。
2、不带参数的构造函数称为“默认构造函数”。 无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是static的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
3、通过将构造函数设置为私有构造函数可以阻止类被实例化。
4、结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将struct中的每个字段初始化为默认值。只有当 struct 用 new 实例化时,才会调用此默认构造函数。
构造方法与类名相同,构造方法没有返回值类型,构造方法通常申明为public,在结构中不允许用户定义无参数构造函数
在类中允许用户定义无参数的构造函数
结构中必须给所有的字段赋值
枚举类型是值类型,不能够定义字段属性和方法
抽象类仅供派生,无法实例化
声明类以实现接口,类似于从基类派生------要实现的接口和基类名称以逗号分隔(基类在前,接口顺序任意)
类可以实现多个接口,但只能从一个基类派生
接口的重要特征是不能够实例化,不能使用new创建接口
函数在重载时,利用函数签名的不同(即参数个数与类型的不同)来区别调用者到底调用的是那个方法
C#中的char 和 string
char字符类型,值类型,固定长度
string字符串类型,引用类型
C# 结构体与类 的不同
在C#中结构体和类似乎就是一样的, 结构与类共享大多数相同的语法,但结构比类受到的限制更多。
首先,C#中结构体和类的最大区别就是结构体是值类型,而类是引用类型。也就是说当实例化结构体的时候是在栈上拷贝了结构体的一个副本,而类实例化的时候是在栈上分配一个指针指向了堆中分配的空间。
其次,在结构体中,除非字段被声明为const或static,否则是无法初始化的。
结构体不能声明默认构造函数(没有参数的构造函数)或析构函数。这里能细说下,细心的网友可能发现我上面定义的结构体和类中各自的构造函数是稍微有点不同的,在结构体的构造函数后面还加了个:this()。
C#在中 只有单继承,但是可以用接口实现类似多继承的效果
结尾return;含义: 跳出方法体,结束此方法
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同
在C#中,string是System.String 的别名
C#引用类型有六种:class、interface、delegate、object、string、Array(string也是引用类型)
装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型
C# 需方法接口定义的格式,在调用的是一定要遵循抽象方法,没有方法体。也不能实例化、选择使用虚方法实现多态还是抽象类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象.(虚方法可以实例化,抽象方法不能够实例化!)
接口无访问修饰符,隐含public多接口,扩展接口C# ,接口不允许多重继承,通过接口进行实现如果两个接口有相同的方法,则必须显示实现至少一个方法。
重载:允许你以相同的名称不同的参数来调用多个方法
重写:是指子类对父类中虚函数或抽象函数的“覆盖”。重写的父类中的方法必须用 virtual、abstract 或 override 修饰,且不能重写非虚方法或静态方法。override的方法和virtual的方法必须具有相同的访问级别修饰符。
隐藏:在子类中写一个和基类一样名字(参数不同也算)的非虚方法,会让基类中的函数被隐藏,编译后会提示要求使用New关键字来显示的隐藏基类的方法。
句柄是什么东西?
句柄就是个数字,一般和当前系统下的整数的位数一样,比如32bit系统下就是4个字节。这个数字是一个对象的唯一标示,和对象一一对应。这个对象可以是一个块内存,一个资源,或者一个服务的context(如 socket,thread)等等。
这个数字的来源可以有很多中,只要能保证和它代表的对象保持唯一对应就可以,比如可以用内存地址,也可以用句柄表的序号,或者干脆用一个自增ID,再或者用以上的值去异或一个常数。
传统上操作系统内核和系统服务API都是 C 语言接口的,但是其内部设计理念上又是OO的,所以有对象概念却没有对应的语言语法支持。句柄的作用就是在 C 语言环境下代替 C++ 的对象指针来用的。创建句柄就是构造,销毁句柄就是析构,用句柄调用函数相当于传入this指针。
如果有系统API是 C++ 接口的,那么就没有句柄了,而是某个接口指针,IXXXPtr之类的,比如Windows的com ptr。
类不得继承构造方法,派生类必须实现自己的构造方法,只能通过显示调用来使用基类构造方法
正则表达式使用时需要引用相应的命名空间:using System.Text.RegularExpressions;
重写ToString方法:默认返回对象的hashcode,重写的话可以显示用户需要的显示效果。返回人员能够看得懂的内容。
for循环中的参数用分号;进行分隔如: for (int i = 1; i <= 5; i++)
执行顺序:对于单个的类,它的静态构造函数将先于普通构造函数执行。静态构造函数只能执行一次。
基类构造函数的执行要早于子类构造函数。基类构造函数中对于虚方法的调用,实际调用的是子类中重写的虚方法。
我们在初始化一个对象时,总是会先执行基类的构造函数,然后再执行子类的构造函数。
异常的类型有: System.DivideByZeroException 、System.ArithmeticException 、Exception e 、e.ToString()打印出错误的信息
C# 文件主体Main M大写,C++/Java中是小写的
/// XML类型注释
我们不要在非封闭类型的构造函数内调用虚方法或虚属性
命名空间: System.Text.RegularExpressions 处理正则表达式类型
命名空间:System.Data 数据库相关
Console.read()只读一个字符,返回该字符的ascII码
Console.read()输入类型需要为int类型
Console.readline()读一行字符,ReadLine()是读取一行,返回值是string类型
list特殊状态的数组,list.add, list.count,list.sort,list.reverse
在子类中重写方法,new需要放在类型之前 new bool DoSomething
静态构造函数是一个特殊的构造函数,它在该类型的所有成员(包括实例构造函数)第一次被访问之前执行
而与实例的初始化器会在实例构造函数之前执行类似,静态初始化器会在静态构造函数之前执行
string.compare(,,[true]) 比较两者是否相同(忽略大小写)
string.concat(a,b)合并两个字符串
string.conpy(a) 拷贝 a
s.indexof('somestring',[],[])
s.insert(序号,‘somestring’)
C#语言是编译型语言,但其“编译”过程比较特殊,具体说明如下:
C#程序在第一次运行的时候,会依赖其.NET Frameworker平台,编译成IL中间码),然后由JIT compiler翻译成本地的机器码执行。从第二次在运行相同的程序,则不需要再执行以上编译和翻译过程,而是直接运行第一次翻译成的机器码。所以对于C#来说,通常第一次运行时间会很长,但从第二次开始,程序的执行时间会快很多。
字符串是不可变的,如果需要改变,则需要重新赋值。
类如果没有显示定义构造器,系统会生成一个默认构造器
String 对象是不可改变的。每次使用 String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。而 StringBuilder 则不会,在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类;例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
值类型与引用类型:值类型存储的数据本身,引用类型存储的是对数据存储位置的引用
引用类型不像值类型那样要求创建数据的内存副本,所以赋值引用类型的实例比复制值类型的实例更加高效。
string[] languages = new string[3]{“hello”,"world","你好!" } 指定数组大小
int[,] cells = int[2,3]
Getlength()是获得数组长度的方法
System.Array.Reverse(temp)
const为静态常量编译期确定,static readonly为动态常量运行时确定。
异常处理的代价很高,需要调用系统底层的资源
可空修饰符 int? name = null
空接合操作符:expression1 ?? expression2 如果1为空,则使用2的值
C# 不支持布尔隐式转换成数字
字段只有类的实例可以访问,类不可以直接访问(静态类除外)
所有类型都能够隐式转换为object类型