16.類和結構的區別?
答: 類:
類是引用型別在堆上分配,類的例項進行賦值只是複製了引用,都指向同一段實際物件分配的記憶體
類有構造和析構函式
類可以繼承和被繼承
結構:
結構是值型別在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結構的賦值將分配產生乙個新的物件。
結構沒有建構函式,但可以新增。結構沒有析構函式
結構不可以繼承自另乙個結構或被繼承,但和類一樣可以繼承自介面
示例:
根據以上比較,我們可以得出一些輕量級的物件最好使用結構,但資料量大或有複雜處理邏輯物件最好使用類。
如:geoemtry(gis 裡的乙個概論,在 ogc 標準裡有定義) 最好使用類,而 geometry 中點的成員最好使用結構
using system;
using system.collections.generic;
using system.text;
namespace example16
double y
double z
} //結構也可以從介面繼承
struct point: ipoint
public double x
set
} public double y
set
} public double z
set
} }
//在此簡化了點狀geometry的設計,實際產品中還包含project(座標變換)等複雜操作
class pointgeometry
public pointgeometry(point value)
public double x
set
} public double y
set
} public double z
set
} public static pointgeometry operator +(pointgeometry left, pointgeometry rigth)
public override string tostring()
, y: , z: ", value.x, value.y, value.z);
} }
class program
} } 結果:
x: 1, y: 2, z: 3
x: 4, y: 5, z: 6
x: 7, y: 8, z: 9
x: 7, y: 8, z: 9
17.介面的多繼承會帶來哪些問題?
答: c# 中的介面與類不同,可以使用多繼承,即乙個子介面可以有多個父介面。但如果兩個父成員具有同名的成員,就產生了二義性(這也正是 c# 中類取消了多繼承的原因之一),這時在實現時最好使用顯式的宣告
示例:
using system;
using system.collections.generic;
using system.text;
namespace example17
//方法
string f(int value);
//事件
event eventhandler e;
//索引指示器
string this[int index]
} inte***ce ia
} inte***ce ib
//ic介面從ia和ib多重繼承
inte***ce ic : ia, ib
class c : ic
set
} //顯式宣告實現ib介面中的count方法
int ib.count()
} static void main(string args)
", ((ia)tmpobj).count);
console.writeline("count function: ", ((ib)tmpobj).count());
console.readline();
} }
} 結果:
count property: 100
count function: 10000
18.抽象類和介面的區別?
答: 抽象類(abstract class)可以包含功能定義和實現,介面(inte***ce)只能包含功能定義
抽象類是從一系列相關物件中抽象出來的概念, 因此反映的是事物的內部共性;介面是為了滿足外部呼叫而定義的乙個功能約定, 因此反映的是事物的外部特性
分析物件,提煉內部共性形成抽象類,用以表示物件本質,即「是什麼」
為外部提供呼叫或功能需要擴充時優先使用介面
19.別名指示符是什麼?
答: 通過別名指示符我們可以為某個型別起乙個別名
主要用於解決兩個命名空間內有同名型別的衝突或避免使用冗餘的命名空間
別名指示符在所有命名空間最外層定義,作用域為整個單元檔案。如果定義在某個命名空間內,那麼它只在直接隸屬的命名空間內起作用
示例:
class1.cs:
using system;
using system.collections.generic;
using system.text;
namespace com.nblogs.reonlyrun.csharp25qexample.example19.lib01
} } class2.cs:
using system;
using system.collections.generic;
using system.text;
namespace com.nblogs.reonlyrun.csharp25qexample.example19.lib02
} } 主單元(program.cs):
using system;
using system.collections.generic;
using system.text;
//使用別名指示符解決同名型別的衝突
//在所有命名空間最外層定義,作用域為整個單元檔案
using lib01class1 = com.nblogs.reonlyrun.csharp25qexample.example19.lib01.class1;
using lib02class2 = com.nblogs.reonlyrun.csharp25qexample.example19.lib02.class1;
namespace example19
} namespace test2
} }
} 結果:
com.nblogs.reonlyrun.csharp25qexample.example19.lib01's class1
com.nblogs.reonlyrun.csharp25qexample.example19.lib02's class1
com.nblogs.reonlyrun.csharp25qexample.example19.lib01's class1
20.如何手工釋放資源?
答: .net 平台在記憶體管理方面提供了gc(garbage collection),負責自動釋放託管資源和記憶體**的工作。但在以下兩種情況需要我們手工進行資源釋放:一、由於它無法對非託管資源進行釋放,所以我們必須自己提供方法來釋放物件內分配的非託管資源,比如你在物件的實現**中使用了乙個com物件;二、你的類在執行是會產生大量例項(象 gis 中的geometry),必須自己手工釋放這些資源以提高程式的執行效率
最理想的辦法是通過實現乙個介面顯式的提供給客戶呼叫端手工釋放物件,system 命名空間內有乙個 idisposable 介面,拿來做這事非常合適,省得我們自己再宣告乙個介面了
示例:
using system;
using system.collections.generic;
using system.text;
namespace example20
//通過實現該介面,客戶可以顯式地釋放物件,而不需要等待gc來釋放資源,據說那樣會降低效率
void idisposable.dispose()
//將釋放非託管資源設計成乙個虛函式,提供在繼承類中釋放基類的資源的能力
protected virtual void releaseunmanageresources()
//私有函式用以釋放非託管資源
private void dispose(bool disposing)
}
} static void main(string args)
} }
本文標題: c#基礎概念二十五問 16-20
本文位址: /ruanjian/csharp/36492.html
C 基礎概念二十五問 6
20.如何手工釋放資源?答 net 平台在記憶體管理方面提供了gc garbage collection 負責自動釋放託管資源和記憶體 的工作。但在以下兩種情況需要我們手工進行資源釋放 一 由於它無法對非託管資源進行釋放,所以我們必須自己提供方法來釋放物件內分配的非託管資源,比如你在物件的實現 中使...
Linux基礎(二十五)
進入linux字元介面方式有字元介面 圖形介面下的終端以及虛擬控制台等方式。在字元介面下,虛擬控制台的選擇可以通過按下 alt 鍵和1個功能鍵來實現,功能鍵通常為f1 f6鍵。比如使用者登入後,按下 alt f2 鍵,使用者可以看 login 提示符,說明使用者進入了第2個虛擬控制台。然後只需利用按...
swipe的基礎使用(二十五)
本次文章介紹swiper當中的rtl布局。rtl布局呢,就是right to left,就是從左到右的布局。方面沒有什麼複雜的地方,還是按照原來的順序,首先編寫基礎的swiper頁面框架。h5edu 2 h5edu 3 h5edu 4 h5edu 5 h5edu 6 h5edu 7 當中加入了控制按...