2017年7月18日 星期二

[C#]Struct, Class


  • struct

    1. 成員預設是 public
    2. 值類型,struct 不能設 null
      • Code
      • struct AStruct
        {
           int aField;
        }
        
        class MainClass
        {
            public static void Main()
            {
                AStruct s = null; // Error [ Cannot convert null to 'AStruct' because it is a value type ].
            }
        }
    3. 創建在 stack (由編譯器分配內存空間的,調用構造函數來構造 stack 對象)
    4. 不是對 struct 的引用 (直接使用它們)
    5. struct 傳遞的市值而非引用
    6. struct 不可以有初始化
      • Code
      • struct MyStruct
        {   
            int myVar = 10;  //  syntax error. 
            public void MyFun() 
            {       
                //  statements    
            }
        }
        
    7. struct 不可以有明顯的無參數構造器
      • Code
      • struct MyStruct
        { 
            int myVar;
            public MyStruct() // syntax error.
            {      
                // statements 
            }
        }
        
    8. struct 不需要實例化
      • Code
      • MyStruct aStructObj;
        /// 
        /// no exception
        /// 
        aStructObj.myVar=100;
        
    9. struct 不支持繼承和多型,注意:但是 struct 可以像 class 實現接口 (其成員不能使用 protected 或 protected Internal )
    10. struct 構造器必須初始化所有字段
      • Code
      • /// 
        /// Error 
        /// Field 'MyStruct.myString' must be fully assigned before it leaves the constructor
        /// 
        struct MyStruct
        { 
            int myInt;  
            string myString; 
            public MyStruct( int aInt ) 
            {    
                myInt = aInt;  
            }
        }
        
    11. struct 不可以定義析構器
    12. struct 適用於經常使用的數據組合成的新類型

  • class

    1. 成員預設是 private
    2. 引用類型,class 可以設定為 null
      • Code
      • class  AClass
        {
           int aField;
        }
        
        class MainClass
        {
            public static void Main()
            {
                AClass b = null; // No error.
            }
        }
        
    3. 創建在 heap (建立在 heap,類對象只能建立在 ,不能是靜態建立對象,且不濘接條用類得構造函數)
    4. class 實例的引用
    5. class 作為參數傳給一個方法,傳遞的是一個引用
    6. class 可以有初始化
      • Code
      • class MyClass
        {  
            int myVar =10;  //  no syntax error.    
            public void MyFun()
            {       
                //  statements    
            }
        }
        
    7. class 可以有明顯的無參數構造器
      • Code
      • class MyClass
        {  
            int myVar = 10;
            public MyClass() // no syntax error. 
            {   
                // statements
            }
        } 
    8. class 使用前必須 new 關鍵字實例化
      • Code
      • /// 
        /// MyClass aClassObj=new MyClass(); is the correct format.aClassObj.
        /// 
        MyClass aClassObj;
        /// 
        /// NullReferenceException
        /// (because aClassObj does not contain a reference to an object of type myClass).
        /// 
        aClassObj.myVar = 100; 
        
    9. class 支持繼承和多型
    10. class 構造器不需要初始化所有字段
      • Code
      • /// 
        /// No error
        /// No matter whether the Field 'MyClass.myString' is initialized or not
        /// 
        class MyClass
        { 
            int myInt;  
            string myString;   
            public MyClass( int aInt )
            {    
                myInt = aInt;    
            }
        }
        
    11. class 可以定義析構器
    12. class 適合大的量和複雜的數據

  • struct and class


  • struct 有性能優勢,class 有面向對象的擴展優勢。用於底層數據存儲的類型設計爲struct 類型,將用於定義應用程式列爲的類型設計爲 class。如果對類型將來的應用情況不能確定,應該使用 class。
  • Ref: 
  • http://jashliao.pixnet.net/blog/post/207253459-c%23-%E4%B8%AD-struct-%E8%88%87-class-%E7%9A%84%E5%8D%80%E5%88%A5%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%85%A9%E8%80%85%E7%9A%84%E9%81%A9%E7%94%A8%E5%A0%B4
  • http://www.cnblogs.com/waitrabbit/archive/2008/05/18/1202064.html
  • https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/using-structs 
  • https://read01.com/3RQD6K.html
  • http://www.cnblogs.com/liuzijing688/archive/2008/01/11/1034893.html
  • http://weisnote.blogspot.tw/2012/08/static.html

  • 沒有留言:

    張貼留言