C#核心基础知识归纳


C#核心基础知识归纳
2010年08月13日
  Net规范与实现 品味类型    ---简单数据类型
  ---值类型与引用类型
  ---类型判等
  ---类型转换
  ---类型获取
  ---枚举
  ---String
  控件继承关系
  内存管理
  ---内存常识
  ---垃圾收集
  ---传参的艺术
  ---浅拷贝和深拷贝
  面向对象
  ---继承
  ---多态
  其他杂项
  ---using的用法
  ---装箱拆箱
  ---base,this
  ---lock,unsafe,sealed
  ---const,readonly
  ---特性
  ---is,as
  ---动静之间
  ---委托,匿名方法
  .Net规范与实现:
  规范:[CLI  [CTS,CLS,CIL]]
  实现:[.net framework  [CLR,FCL]]
  CLI:公共语言架构
  CTS:通用类型系统
  CLS:公共语言规范
  CIL:通用中间语言
  CLR:公共语言运行时
  FCL:.Net框架类库
  品味类型:
  ---简单数据类型
  sbyte 1
  byte 1
  short 2
  ushort 2
  int 4 
  uint   4
  long 8
  ulong 8
  float 4
  double 8
  decimal   16
  char 2
  bool 1
  string
  ---值类型与引用类型
  值类型:简单类型,枚举类型,结构类型
  引用类型:类类型,接口类型,数组类型,委托类型
  值类型分配在线程的堆栈上,引用类型分配在托管堆上(85000B在LOH堆),引用值本身在线程堆栈上
  Type.IsValueType判断一个类型是否为值类型 sizeof()获取值类型大小,不适用于引用类型
  引用类型在性能上欠于值类型
  值类型都继承自System.ValueType,System.ValueType又继承自System.Object,引用类型都继承自System.Object
  值类型是sealed密封的,不能作基类
  值类型有两种状态,装箱和未装箱,引用类型只有装箱
  MSDN建议以类型大小作为选择值类型和引用类型的决定因素。不表现出行为,以存储数据为目的情况下,值类型是优先选择
  ---类型判等
  主要有Equals(),ReferenceEquals(),==,!=3种方法,核心方法是Equals.
  值类型判等:
  Equals重载了System.Object的Equals方法,用于实现对实例数据判等
  ReferenceEquals对值类型永远返回False
  == 未重载的==比较两个值是否值相同
  引用类型判等:
  public virtual bool Equals(object obj);
  public static bool Equals(object objA, object objB);
  虚方法默认比较地址相等,由子类覆写
  静态方法在如下情况返回true:
  1.objA,objB是相同的实例,或两者都是空引用。
  2.虚方法返回true
  ReferenceEquals比较两对象是否指向同一地址
  ==未重载前也是比较两对象是否指向同一地址
  对于引用类型,如果已经覆写Equals,==就不要重载,保持其默认语义就是恰当的处理了
  如果x.Equals(y)==true成立,必有x.GetHashCode() == y.GetHashCode()成立。如果覆写了Equals而没有实现GetHashCode,编译器会报警
  ---类型转换 隐式转换:值向值,引用向引用,值向引用
  显式转换:
  01 static public explicit operatorMyStruct( intmyNo)
  02{
  03     return newMyStruct(myNo);
  04}
  05
  06 static public implicit operatorstring(MyClassmc)
  07{
  08     returnmc.ToString();
  09}
  10
  11MyStructMyNum=(MyStruct)i;
  12 stringstr=MyCls;
  有损转换,或可能抛异常的转换,最好用显示转换
  ---类型获取
  obj.GetType();
  typeof
  ---枚举
  默认是int, 从0开始
  enum typename : underlyingType
  可以是 sbyte,byte,short,ushort,int,uint,long,ulong ---String 字符串的恒定性(细节见你必须知道的.net) 控件继承关系:
  所有类都继承自 System.Object MarshalByRefObject Component Control ButtonBase CheckBox    
  RadioButton    
  Button    
  ListControl ListBox CheckedListBox   
  ComboBox    
  TextBoxBase MaskedTextBox    
  RichTextBox    
  TextBox    
  ScrollableControl ContainerControl Form PrintPreviewDialog  
  ToolStripDropDown ToolStripDropDownMenu ContextMenuStrip 
  MenuStrip   
  StatusStrip   
  ToolStripContainer   
  UpDownBase NumericUpDown  
  Panel FlowLayoutPanel  
  TableLayoutPanel  
  SplitContainer   
  ToolStrip    
  DateTimePicker     
  Label LinkLabel    
  TabControl     
  ListView     
  MonthCalendar     
  PictureBox     
  ProgressBar     
  TreeView     
  WebBrowserBase WebBrowser    
  GroupBox     
  PrintPreviewControl     
  NotifyIcon      
  ToolTip      
  BackgroundWorker      
  DirectoryEntry      
  DirectorySearcher      
  ErrorProvider      
  EventLog      
  FileSystemWatcher      
  HelpProvider      
  ImageList      
  MessageQueue      
  PerformanceCounter      
  Process      
  SerialPort      
  ServiceController      
  Timer      
  CommonDialog ColorDialog     
  FolderBrowserDialog     
  FontDialog     
  FileDialog OpenFileDialog    
  SaveFileDialog    
  PrintDialog      
  PrintDocument               
  内存管理:
  ---内存常识
  内存分配主要有3块:线程的堆栈,GC堆,LOH堆。GC堆会被压缩,LOH堆不会被压缩
  线程的堆栈从高地址向低地址分配,托管堆从低地址向高地址分配
  加载堆(Load Heap)包括High-Frequency Heap,Low-Frequency Heap和Stub Heap.
  加载堆上最重要信息就是元数组相关信息,Type对象。每个Type对象体现为一个Method Table.记录了基类型,静态字段,实现的接口,所有方法等。方法表不受GC控制,生命期为从创建到AppDomain卸载。
  TypeHandle类型句柄,4个字节,指向对应实例的方法表
  SyncBlockIndex 4个字节,用于线程同步
  NextObjPtr 指向托管堆下一个新地址
  ---垃圾收集
  值类型内存不受GC控制,由OS管理
  对于非托管资源,需要开发者自行清理,如数据库连接,文件句柄,COM对象,网络链接,互斥体,套接字,位图,GDI+对象
  微软强烈建议不要使用GC.Collect收集垃圾
  GC提供2种垃圾收集器。工作站垃圾收集器(单处理器)和服务器收集器(多处理器)。
  01 public classMyDispose:IDisposable
  02{
  03     privateIntPtr_handle;
  04
  05     private booldisposed= false;
  06
  07     public voidDispose()
  08     {
  09         Dispose( true);
  10         GC.SuppressFinalize( this);
  11     }
  12
  13     protected virtual voidDispose( booldisposing)
  14     {
  15         if(!disposed)
  16         {
  17             if (disposing)
  18             {
  19                 //清理托管资源
  20             }
  21
  22             if (_handle!=IntPtr.Zero)
  23             {
  24                 //清理非托管资源
  25                 _handle=IntPtr.Zero;
  26             }
  27         }
  28         disposed= true;
  29     }
  30
  31     public voidClose()
  32     {
  33         Dispose();
  34     }
  35}
  01 protected override voidDispose( booldisposing)
  02{
  03     if(!disposed)
  04     {
  05         try
  06         {
  07             //子类资源清理
  08             disposed= true;
  09         }
  10         finally
  11         {
  12             base.Dispose(disposing);
  13         }
  14     }
  15}
  ---传参的艺术
  1.C#不能设置参数默认值
  2.void Fun(string param1, params int[] param2);
  Fun("hello",1,2,3)
  params修饰的参数必须为一维数组
  params必须在参数列表最后一个,并且只能使用一次
  3.值类型参数按值传递
  引用按值
  值按引用
  引用按引用
  ---浅拷贝和深拷贝
  1 public interfaceICloneable
  2{
  3     objectClone();
  4}
  MemberwiseClone是浅拷贝
  面向对象:
  ---继承
  实现继承,接口继承 IS-A  CAN-DO
  如果父类和子类出现同名字段,认为是2个字段
  方法表是类第一次加载到AppDomain时完成的
  子类也继承父类的私有成员,只是不能访问而已
  new在虚方法继承中起阻隔作用,不用new也可以
  virtual下面跟new,无new,override 非virtual下面跟new,无new
  父类 ins = new 子类 除了virtual,所有成员都调用父类
  
  ---多态
  重载,覆写
  其他杂项:
  ---装箱拆箱
  装箱和拆箱是值类型和引用类型转换的桥梁。
  只有值类型才有这一说法,引用类型没有。
  拆箱的性能开销远小于装箱。
  1 intx=222;
  2 objecto=x;
  3 inty= ( int)o;
  装箱后的数据的类型还是原值类型。
  o is int成立 o.GetType() == int 成立
  集合操作很容易引起装箱,使用泛型就能很好避免。
  ---using的用法
  using(...)
  {}
  等价于
  try
  {}
  finally
  {xxx.Dispose();}
  using MSWord = Microsoft.Office.Interop.Word; ---base,this 构造函数时,:base("audi",300)       this()
  多重继承中,base指向可见的父类的重载复写的方法 ---lock,unsafe,sealed object obj = new object() lock(obj){} lock对象必须是引用参数类型,最好是private
  unsafe{} ; 也可以放在方法名前
  sealed   基类不能被继承,方法属性不能被覆写
  定义密封方法时,sealed和override必须一起使用 ---const,readonly const静态常量:在定义时必须初始化;不能用new,new在运行时才能确定;可以在局部常量和字段常量都使用;可读不可写;在声明时必须指定值;只能由类型直接访问;确定于编译时;不能和static同时使用;只能用于值类型和string类型上,其他引用类型定义为null;数组和结构体不能被声明为const; readonly动态常量:不能在局部变量中使用;static readonly字段的初始化,必须在定义时或静态无参构造函数中进行;可读不可写;在声明时和构造函数时都可指定;static readonly的成员由类型直接访问,readonly由对象访问;确定于运行时; ---特性 特性对程序中的元素进行标记,如类型,字段,方法,属性,程序集,模块,事件,参数,返回值
  定制特性以[,]形式展开,放在紧挨着的元素上面,多个特性可以用于同一元素。如[Flags][AttributeUsage,Flags] 所有自定义特性后面都有个Attribute后缀
  ---is,as
  都是把小的对象换算到大的类型中 ---动静之间
  单例的实现: 01 classSingleton
  02{
  03     private staticSingleton_instance= null;
  04
  05     public staticSingletonInstance
  06     {
  07         get
  08         {
  09             if (_instance== null)
  10             {
  11                 _instance= newSingleton();
  12             }
  13             return_instance; 
  14         }
  15     }
  16
  17     privateSingleton()
  18     {
  19     }
  20} 如果一个类只包含静态成员,可以把该类定义为静态类。
  静态类不可实例化。
  静态构造函数在运行库加载类时执行。
  一个类只能有一个静态构造函数
  静态成员先声明时初始化,然后再构造函数初始化
  ---委托,匿名方法
  多播委托,匿名委托
  1CalculateDelegatemyDlg= delegate( intx, inty)
  2{
  3     Console.WriteLine(x+y);
  4}

猜你喜欢

转载自lud35lud.iteye.com/blog/1361175