二:对象和类型
类和结构
- 类是存在在堆上,结构是存储在栈上
- 类可以继承,结构不能继承
- 类的定义是class,结构是struct
- 结构的性能要比类好,类的用处要比结构大
类
类的成员可访问符public,protected,internal,internal protected,private
类的成员:
- 数据成员:字段,常量,事件
- 函数成员:提供了操作类的数据的功能,包括方法,属性,构造器,终接器,运算符和索引器。
静态构造函数
特征:只执行一次,构造函数执行的时间不确定,不同的静态构造函数顺序也就不确定。静态构造函数没有修饰符,因为C#代码不调用它,而是又.NET运行库调用。
使用静态构造函数的原因:类的一些静态字段或属性,需要在第一次使用之前,从外部初始化。
静态构造函数使用的示例
using System; namespace TestStaticConstructer { class Program { static void Main(string[] args) { Console.WriteLine(UserInterface.BackColor); Console.ReadLine(); } } class UserInterface { public static readonly Color BackColor; static UserInterface() { DateTime dt = DateTime.Now; if ((dt.DayOfWeek == DayOfWeek.Sunday) || (dt.DayOfWeek == DayOfWeek.Saturday)) BackColor = Color.Green; else BackColor = Color.Red; } } enum Color { Green, Red, Yellow } }
只读字段
只读字段readonly和const的区别,readonly在类初始化之前不知道值,二const在一开始就已经确定了值。如pi的定义使用const。
匿名类型
var v1 = new { Name = "N1", Address = "A1" }; var v2 = new { Name = "N2", Address = "A2" }; var v3 = new { Name = "N3", address = "A3" }; Console.WriteLine(v1.Name + "-" + v1.Address); Console.WriteLine(v1.GetType() == v2.GetType()); Console.WriteLine(v1.GetType() == v3.GetType());
运行的结果如下
结构
先定义一个结构
struct Student { public string Name; }
测试结构
static void TestStruct() { Student s1 = new Student(); s1.Name = "Test"; Student s2; s2 = s1; Console.WriteLine(s1.Name+"-"+s2.Name); s2.Name = "New Name"; Console.WriteLine(s1.Name + "-" + s2.Name); }
这个示例可以看出类和结构的差别,如果是类,s2=s1这句话就意味着两个类是同一个类,地址相同,修改任何一个变量的值另外一个也会跟着一起改变。
总结:结构是值类型,类是引用类型。
结构没有继承,唯一的例外是基类是System.Object,这意味着可以用Object类接收一个结构
弱引用
相对于正常的类,主要在作用域内内存就不会被回收。弱类型是只要运行垃圾回收器,就会被释放内存。用处是在占用内存很大,又不经常用的情况。
(个人感觉没啥用)
部分类
partial关键字允许把类的定义放在多个文件中。partial可以修饰类,接口,结构。
partial class PartClass { public string FirstName; public void FirstFunction() { } }
partial class PartClass { public string LastName; }
只要引用了这两个部分类的命名空间,两个部分类中定义的成员都可以使用。
静态类
static的类,不能实例化,直接使用
Object类
所有的类的最终基类都是Sytem.Object。
该类的方法有ToString(),GetHashCode(),Equals(),Finalize(),GetType(),MemberwiseClone();
拓展方法
如果一个类已经封闭,或者是一个外部组件的类不能修改。添加方法的方法是使用拓展方法。