命名空间下的类型可以为:Class、interface、delegate、struct、enum,不可以直接写变量和方法。
除了一下差异,C#中的变量几乎和C++中一样:
1、C#中的变量,总是需要你在访问前进行初始化,否则编译出错。
2、不能在C#中访问一个“挂起”指针。
3、超出数组边界的表达式索引值同样不可访问。
4、C#中没有全局变量或全局函数,取而代之的是通过静态函数和静态变量完成。
所有C#的类型都是从object类继承的。
bool仅接受真、假而非任意整数。
值类型:
(在堆栈中分配的数据类型)
1、除了字符串的所有基本和内建类型。
2、结构。
3、枚举。
引用类型:
(在堆中分配的数据类型,不再使用时,将自动进行垃圾清理。)
1、类
2、接口
3、集合类型 如数组
4、字符串
枚举类型:
enum Week { Monday, Tuesday, Wednesday}; namespace test { using cs = Console; class Program { static void Main(string[] args) { Week week = Week.Monday; cs.WriteLine(week.ToString()); cs.WriteLine((int)week); cs.WriteLine((Week)1); //获取字符串对应的枚举值 cs.WriteLine((Enum.Parse(typeof(Week), "Wednesday", true)));//第三个参数表示是否忽略大小写 } } }
类与结构:
1、类的对象在堆中分配,并使用关键字new创建。而结构在栈中进行分配。
readonly:
1、readonly仅用于修饰类的数据成员,改成员有了值后将不可再做修改,和const数据成员不同之处在于const要求声明时就初始化。
sealed:
1、sealed修饰的类不允许你从它继承任何类。sealed class name{}
unsafe:
1、你可以使用unsafe修饰符在C#中定义一个不安全上下文。在不安全上下文中,你可以插入不安全代码,如C++的指针等。
public unsafe MyFun(int *pInt, double* pDou)
{
int* p = new int;...
函数的参数
输出参数:必须在方法的声明和调用中都使用out修饰符。
1.在方法内部,输出参数在被读取之前必须被赋值。这意味着参数的初始化是无关的,而且没有必要在方法调用前为其赋值。
2.每个输出参数在方法返回前必须被赋值。
引用参数:必须在方法的声明和调用中都使用ref修饰符。
实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或NULL值。
参数数组:必须在方法的声明中使用params修饰符。
1.在一个参数列表中只能有一个参数数组。
2.参数数组必须是列表中的最后一个
声明参数数组:a.在数据类型前使用params修饰符。
b.在数据类型后放置一组空的方括号。
eg: void ListInts(params int[] inVals)
函数的重载
● 两个方法不能仅在返回类型上有区别。
● 两个方法不能仅根据参数是声明为ref还是out来区分。
栈帧
当一个方法被调用时,在栈顶分配了一块内存用于保存一定数量与方法相关的数据项,这块内存叫方法的栈帧。
栈帧保存的内容:
1.返回地址--方法退出时在哪儿继续执行。
2.分配内存的参数--就是方法的值参数
3.与方法调用相关的其他各种管理数据项。
方法被调用时,整个栈帧被压入栈中。
方法退出时,它的整个栈帧被从栈中弹出。弹出一个栈帧有时也称为释放栈。
接口:
1、接口是只包含函数签名而在子类中实现的抽象基类。子类可实现多重接口(C#不允许对类进行多重继承,由此可实现多重继承)
索引器:
1、参数化成员属性:包含set、get方法。
2、与成员属性不同:它可以接受1个或多个参数;使用this作为索引器的名字。
3、语法:[访问修饰符] 数据类型 this[数据类型 标识符]
4、索引器用于书写一个可以通过使用[]像数组一样直接访问集合元素的方法。CollectionBase是用于创建集合的类库。List是CollectionBase中用于存放集合列表的受保护成员。
class Shape:CollectionBase
{
public void add(Shape sp)
{
List.Add(sp);
}
public Shape this[int idx]
{
get
{
return (Shape)List[idx];
}
set
{
List[idx] = value;
}
}
}
装箱、拆箱
装箱的思想在C#中是创新的。正如前面提到的,所有的数据类型,无论是内建的还是用户定义的,都是从System命名空间的基类object继承的。所以基础的或是原始的类型打包为一个对象称为装箱,相反的处理称为拆箱。
运算符
is运算符:用于检查对象是否是给定类型,或是否可以转换成给定类型,返回布尔值。if(val is ClassA)...
as运算符:功能如is,但返回null或已经转换的对象。
语句
foreach: 用于迭代数组等集合
lock: 在线程中使代码块称为重点部分。lock关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放改锁。
checked/unchecked:用于数字操作中的溢出检查。
Switch:执行一条case语句后,程序流不能跳转到下一个case语句。
委托(delegate):
让我们可以把函数引用保存在变量中。这就好比C++使用typedef保存函数指针一样。
虚函数:
需要使用ovverride关键字在子类中实现虚函数。
使用new隐藏父类函数
常用命名空间:
System.Drawing 处理图形和绘图,
System.Data 处理数据存储和管理,在定义ADO.NET技术中扮演重要 角色
System.IO 管理对文件和流的同步和异步访问
System.Windows 处理基于窗体的窗口的创建
System.Reflection 包含从程序集读取元数据的类
System.Threading 包含用于多线程编程的类
System.Collections 包含定义各种对象集的接口和类
重载运算符
可重载运算符:
1.一元运算符:+, -, !, ~, ++,--, true, false
2.二元运算符:+, -,*,/,%,|,^,<<,>>
3.比较运算符:==,!=,<,>,<=,>=
如果重载了true和false运算符,就可以在布尔表达式中使用类,例如,if(opl){}。