16种预定义类型
11种数值类型
整型:
- sbyte 8
- byte 8
- short 16
- ushort 16
- int 32
- uint 32
- log 64
- ulong 64
浮点:decimal、float、double
unicode字符类型char
bool
3种非简单类型
string,它是0个或多个Unicode字符所组成的序列(字符数组)。
object,它是所有其他类型的基类(包括简单类型)
dynamic,使用动态语言编写的程序集时使用。
用户自定义的类型
类类型 class
结构类型 struct
数组类型 array
枚举类型 enum
委托类型 delegate
接口类型 interface
程序运行时数据保存在内存中,保存数据的内存区域为:栈 和 堆
栈:内存数组,后进先出
堆:内存区域,在堆里分配大块的内存用于存储某种类型的数据对象。
值类型:byte/short/int/long/bool/struct/enum
引用类型:float/double/char/decimal/object/string/dynamic/class/interface/delegate/array
int a=1,b=2,c=3;
访问修饰符
- private
- public
- protected
- internal
- protected internal
常量 const
const int a = 1;
const double PI = 3.1416;
引用参数 ref
必须在形参和实参中都使用ref修饰符
实参必须是变量,且在作用实参前必须被赋值
void func1(ref int val){...}
int y = 1;
func1(ref y); // 必须是变量
输出参数 out
void func1(out int val){...}
int y = 1;
func1(out y); // 必须是变量
参数数组
void func1(int a, params int[] b){...}
func1(22, 10, 11, 33);
方法重载
一个类中可以有多个同名方法;
条件:必须有一个和其他方法不同的签名;
fun1(int a, int b) 这就是签名
命名参数
func1(int a, int b, int c){...}
func1(c:2, a:5, b: 3);
静态字段
class A{
int b; // 实例字段
static int c; // 静态字段
}
A.c;
或者 using static mynamespace;
静态字段被类的所有实例共享,所有实例都访问同一内存位置。因此,如果该内存位置的值被一个实例改变了,这种改变堆所有的示例都可见。
即使不存在类实例,静态成员也存在;
静态函数成员不能访问实例成员,但能访问其他静态成员。
成员常量 与 局部常量 的不同是:
void Main()
{
Console.WriteLine(A.PI); // 可以使用
}
class A{
public const double PI = 3.1416; // 成员常量
}
对象初始化语句
public class Point{
public int x { get; set; } = 1;
public int y = 1;
}
new Point{x=5, y=6};
析构函数
执行在类的实例被销毁之前需要的清理或释放非托管资源的行为。非托管资源是指通过Win32API获得的文件句柄,或非托管内存块。使用.NET资源是无法得到它们的,因此如果坚持使用.NET类,就不需要为类编写析构函数。因此,等到第27章再介绍析构函数。
字段readonly
类似const
class A{
readonly double PI = 3.1416;
readonly int a;
public A(){
a = 5;
}
}
this关键字
class A{
int b = 10;
public int fun1(int b){
return this.b;
}
}
索引器
索引器是一组 get和 set 访问器,与属性类似。
索引器和属性在很多方面是相似的。
和属性一样,索引器不用分配内存来存储。
索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问。
属性通常表示单个数据成员。而索引器通常表示多个数据成员
class A{
public string aa;
public string bb;
public string cc;
public string this[int index]{
set{
switch(index){
case 0: aa = value; break;
case 1: bb = value; break;
case 2: cc = value; break;
default: throw new ArgumentOutOfRangeException("index");
}
}
get{
switch(index){
case 0: return aa;
case 1: return bb;
case 2: return cc;
default: throw new ArgumentOutOfRangeException("index");
}
}
}
// 索引器的重载
public string this[int index, int index2]{
...
}
}
var a = new A();
Console.WriteLine(a[0]);