C#知识点--点记
2018-01-12 16:15
197 查看
用例:
知识的一些常见的应用场景点记(后续补充):
类的静态成员加载时机:代码中初次访问该类前加载.内部类实现线程安全的懒汉单例模式.public class SingleTon { public static SingleTon Instance { get { Console.WriteLine("访问单例模式实例"); return InnerSingleTon.Instance; } } static SingleTon() { Console.WriteLine("SingleTon加载"); } private SingleTon() { } private class InnerSingleTon { //利用内部类实现线程安全的懒汉单例模式 public static readonly SingleTon Instance = new SingleTon(); static InnerSingleTon() { Console.WriteLine("InnerSingleTon加载"); } } } class Program { static void Main(string[] args) { Console.WriteLine("进入Main方法"); var singleTon = SingleTon.Instance; Console.Read(); /*输出结果: * 进入Main方法 * SingleTon加载 * 访问单例模式实例 * InnerSingleTon加载*/ } }
值类型存储在声明的地方,引用类型存储在托管堆中.类中的值类型成员在托管堆中.
函数中声明的值类型局部变量在栈中.
显式、隐式实现接口的区别:显式实现的接口成员只有强制转换成接口类型后才能访问解决成员名称冲突问题
访问控制
运算符优先级问题:“int i =0; i += i > 0 ? i++ : i--;” 在C#中,i的结果为0;但在C/C++中i的结果为-1。C#中结果为0的解释见 通过IL了解.Net中表达式计算过程
继承中的new和override:new关键字指示子类成员隐藏继承自父类的同名成员,override重写父类虚成员.new:子类隐藏父类成员时,只有在父类内部或子类对象作为父类时才能访问父类同名成员;其他时候都访问子类同名成员。
override:子类重写父类成员时,子类对象不管作为什么身份,都访问重写后的成员,除非在子类内部用base关键字访问.
class Inheritance { public static void Test() { Base b = new Grandson(); Console.WriteLine("作为base再介绍一次"); b.Introduce(); b.Say(); Son s = (Son)b; Console.WriteLine("作为son再介绍一次"); s.Introduce(); s.Say(); Grandson g = (Grandson)b; Console.WriteLine("作为grandson再介绍一次"); g.Introduce(); g.Say(); /* Base初始化 Son:"I`m Son"//Grandson的实例继承Son的Introduce方法,Son重写Base的Introduce方法,所以访问Son.Introduce Base:"Hello!"//Son隐藏Base的Say方法,所以在Base内部访问Base.Say() Son初始化 Son:"I`m Son" Grandson:"Hello!"//Grandson重写Son的Say方法,所以访问Grandson.Say();此处若是base.Say()则访问Base.Say(); Grandson初始化 Son:"I`m Son"//继承自Son Grandson:"Hello!"//此处若是base.Say(),则访问Son.Say(); 作为base再介绍一次 Son:"I`m Son" Base:"Hello!"//son隐藏base的say方法,所以作为base时可以访问base.say() 作为son再介绍一次 Son:"I`m Son" Grandson:"Hello!" 作为grandson再介绍一次 Son:"I`m Son" Grandson:"Hello!" */ } } namespace InheritanceTest { class Base { public Base() { Console.WriteLine("Base初始化"); Introduce(); Say(); } public virtual void Say() { Console.WriteLine("Base:\"Hello!\""); } public virtual void Introduce() { Console.WriteLine("Base:\"I`m Base!\""); } } class Son:Base { public Son() { Console.WriteLine("Son初始化"); Introduce(); Say(); } public new virtual void Say() { Console.WriteLine("Son:\"Hello!\""); } public override void Introduce() { Console.WriteLine("Son:\"I`m Son\""); } } class Grandson:Son { public Grandson() { Console.WriteLine("Grandson初始化"); Introduce(); Say(); } public override void Say() { Console.WriteLine("Grandson:\"Hello!\""); } } }
托管模块、程序集
大(端)字节序:在内存中,高位存储在低地址,低位存储在高地址;小(端)字节序与大字节序刚好相反假设有一个int32型的数字0x12345678,则它由4个字节组成,在内存中表示成4个byte:0x12,0x34,0x56,0x78;字节序就是这4个byte在内存中的顺序问题。
若内存地址从左到右递增,则大字节序表示为:0x12,0x34,0x56,0x78;可以看到大字节序很符合人的认知顺序。
小字节序表示为:0x78,0x56,0x34,0x12;数字的低位存储在低内存地址,符合内存地址顺序。
相关文章推荐