结构
结构的声明方式、属性、方法、构造函数等跟类一样,只是关键字是struct,结构不支持继承。
结构是值类型,不是引用类型。它们存储在栈中或存储为内联,如果它们是存储在堆中的 另一个对象的一部分),其生存期的限制与简单的数据类型一样。
因为结构是值类型,所以new运算符与类和其他引用类型的工作方式不同。new运算符并不分配堆中的内存,而是只调用相应的构造函数,根据传送给它的参数,初始化所有的字段
结构派生自System.ValueType类,System.ValueType类又派生于System.Object类,所以结构也可以使用System.Object的方法,也可以重写。下面例子中结构的声明及赋值、重写基类ToSting()方法都是合法的。
public struct Person { public string Name; public int Age; public override string ToString() { return base.ToString(); } } Person person= new Person(); person.Name = "Liu"; person.Age = 12; Person person1; person1.Name = "Liu"; person1.Age = 12;
对于结构构造函数的工作方式的区别。编译器总是提供一个无参数的默认构造函数,而且不允许替换。默认构造函数总是给结构的字段初始化值,所以字段的的初始化值不能绕过默认构造函数。像下面的这种初始化值的方式是错误的。
public struct Person { public string Name="Liu"; public int Age=12; }
弱引用
当实例化一个类或者结构时,只要有代码引用它就形成强引用。强引用意味着GC不会清理实例使用的内存,但当实例对象很大时,又不经常访问时,此时用弱引用比较合理。
弱引用使用WeakRefernce类创建,因为对象可以在任意时刻被回收,因此使用前必须确认它存在。
因为Target返回的是 Object类型,所以不必须强制转换成需要的类型。
WeakReference weak = new WeakReference(new Person()); Person person; if (weak.IsAlive) { person = weak.Target as Person;//转换成需要的类型 person.Name = "Liu"; }
部分类
partial关键字允许把类、结构或接口放在多个文件中。一般情况下,一个类全部写在单个文件中。但有时需要多人使用到一个类,此时就需要写到多个文件中了。
语法定义:把partial放在class/struct/interface的前面即可。
如果声明类时使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分。public/private/protected/internal/abstract/sealed/new/一般约束
部分类在编译时会合并到一起,所以注释或者特性等只要在任意一个部分类上写明即可。
/// <summary> /// 测试使用 /// </summary> partial class Person { } partial class Person: IPerson { }
静态类
如果类只包含静态的方法和静态的属性,那么该类就是静态的。
Object类
Object类是所有类的基类,所以Object提供了很多的公共方法。
例如:ToString()、Equals()等。
扩展方法
如果有类的源代码,继承就是给对象添加功能的好方法。如果没有,可以使用扩展方法。
扩展方法是静态方法,对于扩展方法,第一个参数是要扩展的类型,它放在this关键字的后面。这告诉编译器,这个方法是类型的一部分。
public static class Test { public static string ToString1(this decimal x) { return "$" + x; } } decimal x = 0.123M; x.ToString1();
原文:https://www.cnblogs.com/liuxiansheng1024/p/12571055.html