C#学习记录3上——类的封装,继承,多态
OOP面向?qū)ο蟮娜筇攸c(diǎn):封裝(encapsulation),繼承(inheritance),多態(tài)(encapsulation)
和JAVA與C++一樣,C#也是OOP語言。并且,C#對(duì)數(shù)據(jù)的封裝要比C++更好。另外,在C++里面可能習(xí)慣從main函數(shù)開始程序,類是作為主函數(shù)的一部分而存在的。而C#里面,所有的所有都是在某個(gè)類中進(jìn)行。
這里還是說C#較其他語言不一樣的地方。
有關(guān)類Class
1.方法參數(shù)Arguments和傳遞參數(shù)Parameters
首先說一下這兩個(gè)詞的區(qū)別。其實(shí)都是指參數(shù),大多時(shí)候也都是互相通用。具體的,parameters指在聲明方法的時(shí)候中的參數(shù),而arguments指調(diào)用方法時(shí)傳到方法中的參數(shù)。
第一,關(guān)于可選(默認(rèn))變量:
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方法參數(shù)列表里面有三個(gè)參數(shù),后兩個(gè)成為可選變量。也就是說,他們?cè)诜椒ū徽{(diào)用時(shí)可以填寫也可不填。不填寫則使用默認(rèn)的值。
可選變量在C#3.0里是不允許的,而到了4.0就可以使用了。注意,如果想要在調(diào)用的時(shí)候跳過某一個(gè)可選變量對(duì)后面的進(jìn)行賦值,需要向上面第9行一樣,用參數(shù)名:具體值得形式賦值。
上面的運(yùn)行結(jié)果
第二,Passing by reference or by?value
相信這兩個(gè)已經(jīng)爛熟于心了吧。不多解釋。C#一樣是不加說明則按值,通過在parameter列表里加ref說明是按引用。
除這兩個(gè)之外,C#多了一種out參數(shù)。由于C#需要明確賦值,即變量須在使用之前進(jìn)行賦值。所以如果將只聲明而未賦值的變量按引用ref傳到方法中,就會(huì)出現(xiàn)錯(cuò)誤。這個(gè)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 }上面說的這些適用于除了引用類型的數(shù)據(jù)類型。引用類型有五種:class、interface、delegate、object、string
并不是說引用類型就都是按照引用方式傳遞了,具體的當(dāng)引用類型作為參數(shù)時(shí):
1、在修改變量本身時(shí),結(jié)果類似于值傳遞,即不會(huì)改變傳遞前的變量的值
2、在修改變量的屬性或字段時(shí),才是引用傳遞,會(huì)影響到傳遞前的變量的值
3、參數(shù)使用了ref后,才是真正的引用傳遞,不管修改變量本身還是修改變量的屬性或字段,都會(huì)影響到傳遞前的變量的值
2.this指針
為了明確一些名字的混淆問題,我們經(jīng)常在類里面使用this指針,它指向當(dāng)前對(duì)象(object)。不同的是C++里面this指針后要通過->來獲得object里面的內(nèi)容,而C#內(nèi)可以直接通過.(dot)使用。(不刻意的區(qū)分指針和具體對(duì)象了)
3.static
靜態(tài)的方法或成員變量在C#中必須只能直接通過類來訪問,不允許通過具體該類的實(shí)例對(duì)象來訪問。這一點(diǎn)要注意
另外static方法中不可使用this,而靜態(tài)方法只能訪問靜態(tài)成員變量。
4.銷毀對(duì)象
C#想JAVA一樣是隱式的進(jìn)行垃圾回收。如果需要顯示的釋放空間,通過析構(gòu)方法來進(jìn)行。
不過C#顯示調(diào)用析構(gòu)方法是不合法的。需要通過實(shí)現(xiàn)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.通過屬性進(jìn)行數(shù)據(jù)封裝
在設(shè)計(jì)類的時(shí)候,我們總是希望將類的內(nèi)部狀態(tài)隱藏在類成員之間,通過方法來間接地訪問。當(dāng)是客戶卻總是希望直接訪問這些屬性。解決這個(gè)沖突的方法就是通過屬性實(shí)現(xiàn)。
1 public int Salary 2 { 3 get 4 { 5 return salary; 6 } 7 set 8 { 9 this.salary = value; 10 } 11 }通過get和set可以通過類似屬性的方式來設(shè)置或訪問具體內(nèi)容
6.readonly字段
也就是constant
被聲明為readonly的值只能在聲明時(shí)被賦值。如果是靜態(tài)readonly值則還可以在static從constructor里賦值
轉(zhuǎn)載于:https://www.cnblogs.com/sywang/p/4378867.html
總結(jié)
以上是生活随笔為你收集整理的C#学习记录3上——类的封装,继承,多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#单例模式详解
- 下一篇: 微软的APT服务器探针产品,原子探针断层