C#学习记录3上——类的封装,继承,多态
OOP面向對象的三大特點:封裝(encapsulation),繼承(inheritance),多態(encapsulation)
和JAVA與C++一樣,C#也是OOP語言。并且,C#對數據的封裝要比C++更好。另外,在C++里面可能習慣從main函數開始程序,類是作為主函數的一部分而存在的。而C#里面,所有的所有都是在某個類中進行。
這里還是說C#較其他語言不一樣的地方。
有關類Class
1.方法參數Arguments和傳遞參數Parameters
首先說一下這兩個詞的區別。其實都是指參數,大多時候也都是互相通用。具體的,parameters指在聲明方法的時候中的參數,而arguments指調用方法時傳到方法中的參數。
第一,關于可選(默認)變量:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Program obj = new Program(); 6 int num1 = 100, num2 = 200, num3 = 300; 7 obj.PrintMethod(num1, num2, num3); 8 obj.PrintMethod(num1); 9 obj.PrintMethod(num1, arg3: num3); 10 Console.ReadKey(); 11 } 12 void PrintMethod(int arg1, int arg2=20, int arg3=30) 13 { 14 Console.WriteLine(arg1 + " " + arg2 + " " + arg3); 15 } 16 }PrintMethod方法參數列表里面有三個參數,后兩個成為可選變量。也就是說,他們在方法被調用時可以填寫也可不填。不填寫則使用默認的值。
可選變量在C#3.0里是不允許的,而到了4.0就可以使用了。注意,如果想要在調用的時候跳過某一個可選變量對后面的進行賦值,需要向上面第9行一樣,用參數名:具體值得形式賦值。
上面的運行結果
第二,Passing by reference or by?value
相信這兩個已經爛熟于心了吧。不多解釋。C#一樣是不加說明則按值,通過在parameter列表里加ref說明是按引用。
除這兩個之外,C#多了一種out參數。由于C#需要明確賦值,即變量須在使用之前進行賦值。所以如果將只聲明而未賦值的變量按引用ref傳到方法中,就會出現錯誤。這個out就是在這兒使用的,可以將未賦值的變量傳入方法。
?
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Program obj = new Program(); 6 int num1 = 100, num2; 7 obj.ValueMethod(num1); 8 Console.WriteLine("After By Value: " + num1); 9 num1 = 100; 10 obj.ReferenceMethod( ref num1); 11 Console.WriteLine("After By Reference: " + num1); 12 obj.OutMethod(out num2); 13 Console.WriteLine("After By Out: " + num2); 14 Console.ReadKey(); 15 } 16 void ValueMethod(int arg1) 17 { 18 arg1 = 50; 19 } 20 void ReferenceMethod(ref int arg1) 21 { 22 arg1 = 50; 23 } 24 void OutMethod(out int arg1) 25 { 26 arg1 = 25; 27 } 28 }上面說的這些適用于除了引用類型的數據類型。引用類型有五種:class、interface、delegate、object、string
并不是說引用類型就都是按照引用方式傳遞了,具體的當引用類型作為參數時:
1、在修改變量本身時,結果類似于值傳遞,即不會改變傳遞前的變量的值
2、在修改變量的屬性或字段時,才是引用傳遞,會影響到傳遞前的變量的值
3、參數使用了ref后,才是真正的引用傳遞,不管修改變量本身還是修改變量的屬性或字段,都會影響到傳遞前的變量的值
2.this指針
為了明確一些名字的混淆問題,我們經常在類里面使用this指針,它指向當前對象(object)。不同的是C++里面this指針后要通過->來獲得object里面的內容,而C#內可以直接通過.(dot)使用。(不刻意的區分指針和具體對象了)
3.static
靜態的方法或成員變量在C#中必須只能直接通過類來訪問,不允許通過具體該類的實例對象來訪問。這一點要注意
另外static方法中不可使用this,而靜態方法只能訪問靜態成員變量。
4.銷毀對象
C#想JAVA一樣是隱式的進行垃圾回收。如果需要顯示的釋放空間,通過析構方法來進行。
不過C#顯示調用析構方法是不合法的。需要通過實現IDisposable接口,具體的添加Dispose方法。
這里可以使用代碼
?
1 class SomeClass : IDisposable 2 { 3 bool is_disposed = false; 4 protected virtual void Dispose(bool disposing) 5 { 6 if(!is_disposed) 7 { 8 if (disposing) 9 { 10 Console.WriteLine("Not in destructor"); 11 } 12 Console.WriteLine("Disposing..."); 13 } 14 this.is_disposed = true; 15 } 16 public void Dispose() 17 { 18 Dispose(true); 19 GC.SuppressFinalize(this); 20 } 21 ~SomeClass() 22 { 23 Dispose(false); 24 Console.WriteLine("In destructor"); 25 } 26 }5.通過屬性進行數據封裝
在設計類的時候,我們總是希望將類的內部狀態隱藏在類成員之間,通過方法來間接地訪問。當是客戶卻總是希望直接訪問這些屬性。解決這個沖突的方法就是通過屬性實現。
1 public int Salary 2 { 3 get 4 { 5 return salary; 6 } 7 set 8 { 9 this.salary = value; 10 } 11 }通過get和set可以通過類似屬性的方式來設置或訪問具體內容
6.readonly字段
也就是constant
被聲明為readonly的值只能在聲明時被賦值。如果是靜態readonly值則還可以在static從constructor里賦值
轉載于:https://www.cnblogs.com/sywang/p/4378867.html
總結
以上是生活随笔為你收集整理的C#学习记录3上——类的封装,继承,多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#单例模式详解
- 下一篇: c#将list集合转换为datatabl