C#高階程式(三)-物件與類型詳解

黄舟
發布: 2017-03-20 13:33:14
原創
1181 人瀏覽過

3.2 類別與結構

  類別與結構的差異是它們在記憶體中的#、存取方式(類似儲存在堆疊上的參考類型,而結構是儲存在堆疊上的值類型)和它們的一些特徵# 。

  語法上,類別與結構非常相似,主要差異是結構使用關鍵字 struc取代 class 來宣告。

3.3 類別成員

  3.3.1 資料成員

    資料成員是包含類別資料—欄位##和##事件

##的成員。

  3.3.2 函數成員##    函數成員提供了操作類別中資料的某些功能,包括方法屬性#建構子#與析構函數(終結器)運算子

    #索引器
  1. #。

#        ref 與 

out #out 

##ref 在傳遞之前必須已經初始化,out 則不要求。

        

ref 的實質是將值型別進行引用傳遞,而 out ##是是將值型別進行引用傳遞,而 

為了增加返回值。

        命名參數:在傳遞參數的過程中可以指定其名字,格式為MethodName (ParameterName : Value ) #  ##Params 關鍵字: 必須在方法參數的最後面。         方法的重載:不能只在回傳類型上有區別,不能只根據宣告  

    、 

  1. ## 
    1. 、 
    2. out 或 

    3. params 
之間區分。

########### ########        概念:屬性是一個或一對方法,在客戶端程式碼看來,它(們)是一個欄位。 ############        get存取器不帶任何參數,且傳回屬性宣告的型別。 ############        set存取器帶一個value參數,其型別與宣告的型別相同。 ############        屬性的存取修飾符:在get和set存取器中,必須有一個具備屬性的存取等級。 ######

    1. 建構子

        宣告建構方式就是宣告一個與包含的類別同名的方法,但此方法並沒有傳回值。

        如果提供了帶參數的建構函數,編譯器就不會自動提供預設的建構子。

        (1)靜態建構子

                    。次使用類別之前,從外部來源初始化這些欄位和屬性。

          .NET運作函式庫並沒有確保何時去執行靜態建構函數,所以不應該要求在某個特定時刻執行靜態建構子中的程式碼。但可以確保的是,它在所有引用之前只會呼叫一次。

          無參建構子可以與靜態建構子在同一個類別中定義。

        (2)從構造函數中呼叫其它構造函數

    ##this 關鍵字   3.3.3 只讀取欄位

    

    # readonly 與 const 的差異:

    #readonly #可以在建構子中賦值,建構子中賦值,而 const 哪裡都不能賦值,只能初始化。

3.4 匿名類型

    var #和 ##var 

new 

關鍵字一起使用可以建立匿名類型,例如。

static void Main(string[] args)
 2 
 3 
 4         {
 5 
 6 
 7             var test = new { Name = "Earl Jones", Age = 17 };
 8 
 9 
10             Console.WriteLine(test.ToString());
11 
12 
13             Console.WriteLine(test.Name.GetType().ToString());
14 
15 
16             Console.WriteLine(test.Age.GetType().ToString());
17 
18 
19             Console.ReadKey();
20 
21 
22         }
复制代码
登入後複製

    輸出結果如下:

    ##    
  • #     #     

  • # 」

    #」
  • 。 ##物件的類型,編譯器為其「偽造」了一個名稱,但是只有編譯器才能使用它,我們不能也不應該使用新物件上的任何類型反射,因為這不會得到一致的結果。

  •  

    3.5 結構

  • #  結構是值類型,不是引用類型,其

    生命週期###的限制與簡單的###資料類型###一樣,傳遞結構時可以使用ref關鍵字來減少效能損耗。 ##################  ######結構一般用來表達簡單的組合資料。 ##################  結構不支援###繼承###,但所有結構都繼承於System.ValueType,而System.ValueType又繼承於System.Object。 ##################  使用結構,可以指定欄位如何在記憶體中佈局。 ##################  對於結構,編譯器總是提供預設無參構造函數,它不允許被替換,也不能在結構中為字段提供初始值,必須在構造函數中提供。 ##################  結構中的公有欄位為可接受的程式設計方式。 ######
  •   在定义结构时使用new关键字只不过是用于调用其构造函数,变量的声明实际上才是为结构分配空间,所以以下代码不被报错。

1 MyStruct myStruct /*= new MyStruct()*/;
2 myStruct.Name = "Earl Jones";
3 myStruct.Age = 17;
登入後複製

  覆盖结构默认的构造函数会报错

    

3.6 弱引用

  在代码中实例化一个类或结构时,只要有代码引用它,就会形成强引用。

  强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时都可能被GC回收,所以使用它的时候必须确定其是否存活。如:

<span style="font-family: &#39;Microsoft YaHei&#39;;"><span style="color: #008080;">1</span> <span style="color: #000000;">    MyClass myClass;<br/></span><span style="color: #008080;">2</span>     WeakReference weakMyClass = <span style="color: #0000ff;">new</span> WeakReference(<span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass());<br/></span><span style="color: #008080;">3</span>     <span style="color: #0000ff;"><a href="http://www.php.cn/wiki/109.html" target="_blank">if</a></span><span style="color: #000000;"> (weakMyClass.IsAlive)<br/></span><span style="color: #008080;">4</span> <span style="color: #000000;">     {<br/></span><span style="color: #008080;">5</span>          myClass = weakMyClass.Target <span style="color: #0000ff;">as</span><span style="color: #000000;"> MyClass;<br/></span><span style="color: #008080;">6</span> <span style="color: #000000;">         Console.WriteLine(myClass.value); <br/></span><span style="color: #008080;">7</span> <span style="color: #000000;">      } </span></span>
登入後複製

3.7 部分类

  Partial关键字可以允许把类、结构、方法或结构放在多个文件中。

  如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:

  •   访问修饰符

  •   abstract

  •   sealed

  •   new

  •   一般约束

3.9 Object类

  所有类都继承自System.Object类。

  方法:

  • ToString();

  • GetHashCode();

  • Equals();这里有三个比较三个用于比较对象相等性的方法。

  • Finalize();

  • GetType();

  • GMemberwiseClone();

3.10 扩展方法

  扩展方法用于在某些不能直接修改源代码中的类中添加方法。


 1         using System; 
 2          
 3         namespace 扩展方法 
 4         { 
 5             class Program 
 6             { 
 7                 static void Main(string[] args) 
 8                 { 
 9                     MyClass myClass1 = new MyClass();
 10                     myClass1.SayHiToSomeone();
 11                     myClass1.SayHi();
 12                     Console.ReadKey();
 13                 }
 14             }
 15         
 16             class MyClass
 17             {
 18                  public void SayHi()
 19                 { 
20             Console.WriteLine("我是最原始的方法"); 
21             }
22             }
23         
24             static class AddMyClass
25             {
26                 static public void SayHiToSomeone(this MyClass myClass)27                 { 
28             Console.WriteLine("我是一个扩展方法"); 
29             }
30         
31                 static public void SayHi(this MyClass myClass)
32                 {
33              Console.WriteLine("我是扩展方法SayHi");
34              }
35             }
36         }
登入後複製

  输出的结果:

  

  由上得出:

  •     扩展方法必须定义在一个静态类中。

  •     扩展方法的第一个参数为放在 this 后的类,这个方法就是这个类的一部分。

  •     即是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。

  •     如果扩展方法与类中某个方法同名,就从来不会调用扩展方法。

 

以上是C#高階程式(三)-物件與類型詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!