通用类型系统
C#中,变量是值还是引用仅取决于数据类型
所有的数据类型都是对象。因为它们具有自己ide方法和属性
int int_value = 101;
//调用*int_value*的比较方法与整型*2*进行进行比较int_value.CompareTo(2);//在控制台输出Console.WriteLine(int_value.ToString());
值类型
内置值类型
整型
sbyte(System.SByte)
short(System.Int16)
int(System.Int32)
long(System.Int64)
byte(System.Byte)
ushort(System.UInt16)
uint(System.UInt32)
ulong(System.UInt64)
char(System.Char)
浮点型
float (System.Single)
double(System.Double)
高精度类型
decimal(System.Decimal)
bool(System.Boolean)
用户定义的值类型
结构体类型(派生于System.ValueType)
枚举类型结构体类型(派生于System.Enum)
可空类型结构体类型(派生于System.Nullable泛型结构体)
C#的所有值类型均隐式派生自System.ValueType;
判断是否为值类型
Type.IsValueType
引用类型
数组(派生于System.Array)
用户可以自定义的引用类型
类:class(派生于System.Object)
接口:interface
委托类型:delegate(派生于System.Delegate)
字符串:string(System.String的别名)
Lambda表达式
数组类型
值类型数组
int[] int_array = new int[10];
在堆内存中一次初始化10个int类型的存储空间
自动初始化这10个元素
将10个元素存储到刚刚分配的内存空间内
引用类型数组
object[] obj_array = new object[10];
在堆内存中分配一次空间
不会自动初始化任何元素
obj_array[i]都是null
当有代码初始化某个元素时,对应元素的存储空间会分配在堆内存上
obj_arr[i]=new object();
内存部署
堆内存上存储了所有的引用类型
object item = new objct();
new关键字在堆内存中分配内存空间,并且返回该内存空间的地址
item存储分配后返回的内存地址
语法
结构体
关键字struct定义
publicstructLORect {privatefloatx;privatefloaty;privatefloatwidth;privatefloatheight; }
构造函数
publicLORect(floatx,floaty,floatwidth,floatheight){this.x = x;this.y = y;this.width = width;this.height = height; }
不允许重载无参构造函数
属性
publicfloatX{set{this.x =value; }get{returnthis.x; } }
定义变量
LORect frame = new LORect(0f,0f,100f,100f);
枚举
关键字enum定义
publicenumLOControlType{LOControlTypeNormal=0,LOControlTypeHighlight=1,LOControlTypeDisable=2, }
定义变量
LOControlType type = LOControlType.LOControlTypeNormal;
类
父类
关键字class定义
public class LOPerson { private string name; private int age; }
构造函数
public LOPerson(){}
public LOPerson(string name){this.name = name;}
public LOPerson(string age){this.age = age;}
多个参数的构造函数
public LOPerson(string name,int age) { this.name = name; this.age = age; }
自定义函数
publicvoidSayHi(){ Console.WriteLine (this.name + “: Hello”); }
析构函数
~LOPerson() {this.name =null;this.age =0; }
在析构函数中,将引用类型成员变量置为null,内存处理
在析构函数中,将值类型成员变量置为默认值,程序逻辑安全
子类
关键字class定义
publicclassLOStudent:LOPerson{privatefloatscore; }
构造函数
基于父类无参的构造函数
publicLOStudent(floatscore):base(){this.score = score; }
public LOStudent(int age):base(age){}
在构造函数的继承中,都会先调用父类的构造函数
自定义函数
publicvoidSayHello(){base.SayHi(); Console.WriteLine (“this.SayHi”); }
在自定义函数中,调用父类的某个函数要用到base关键字
析构函数
~LOStudent() {this.score =0f; }
子类和父类的析构函数的执行顺序
1.自动调用子类的析构函数
2.自动调用父类的析构函数
不需要特别语法指名
特性
关键字Attribute定义
[AttributeUsage(AttributeTargets.Property)]publicclassLOTypeAttribute:Attribute{publicstringType{set;get;} }
特性的用法
publicclassLOPeople{ [LOType(Type=“NoHealthy”)]publicstringhobby{set;get;} }
获取特性的值
PropertyInfo item = property_list[0]; LOTypeAttribute attribute = (LOTypeAttribute)Attribute.GetCustomAttribute(item,typeof(LOTypeAttribute)); Console.WriteLine (attribute.Type);
反射
命名空间
using System.Reflection;
获取Type
LOPeople people =newLOPeople(); people.hobby = “Smoke”; Type p_type = people.GetType();
属性(PropertyInfo)
获取属性列表
PropertyInfo[] property_list = p_type.GetProperties();
获取指定属性
PropertyInfo property = p_type.GetProperty(“hobby”);
方法
获取people对象的属性值 .GetValue()
property.GetValue(people,null);
设置people对象的属性值 .SetValue()
property.SetValue(people,”Drink”,null);
方法(MethodInfo)
获取方法列表
MethodInfo[] method_list = p_type.GetMethods();
获取指定方法
MethodInfo method = p_type.GetMethod(“SayHi”);
方法调用
Invoke()
方法的参数列表
method.GetParameters();
方法的返回值
method.ReturnType;
成员(MemberInfo)
获取成员列表
MemberInfo member_list = p_type.GetMembers();
获取指定成员
MemberInfo[] member= p_type.GetMember(“name”);
构造函数(ConstructorInfo)
获取构造函数列表
ConstructorInfo[] constructor_list = p_type.GetConstructors();
获取指定构造函数
ConstructorInfo constructor = p_type.GetConstructor(new Type[]{typeof(int)});
委托
关键字delegate
public delegate void LODataSource(List data_list);
定义委托类型变量
LODataSource dataSource;
委托类型变量赋值
Lambda表达式赋值
dataSource = (List data_list)=>{foreach(intitemindata_list) { Console.WriteLine (item.ToString()); } } ;
函数地址赋值
voidProcessData(List data_list){foreach(intitemindata_list) { Console.WriteLine (item.ToString()); } }
dataSource = new LODataSource(ProcessData);
dataSource = ProcessData;
接口
关键字interface
publicinterfaceLOInterface{voidSayNice(); }
接口中只能声明函数,不能实现函数
接口的用法
publicclassLOTeacher:LOInterface{privatestringname;publicvoidSayNice(){ Console.WriteLine (this.name + “: Nice”); } }
publicclassLOManager:LOInterface{privatestringname;publicvoidSayNice(){ Console.WriteLine (this.name + “: Nice”); } }
接口的好处
为多个不同的类提供相同名称的方法接口,提供不同的实现过程