C 基礎概念二十五問 6

2021-04-14 03:07:53 字數 3719 閱讀 2438

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)

}
}

21.p/invoke是什麼?

答:

在受控**與非受控**進行互動時會產生乙個事務(transition) ,這通常發生在使用平台呼叫服務(platform invocation services),即p/invoke

如呼叫系統的 api 或與 com 物件打交道,通過 system.runtime.interopservices 命名空間

雖然使用 interop 非常方便,但據估計每次呼叫事務都要執行 10 到 40 條指令,算起來開銷也不少,所以我們要盡量少呼叫事務

如果非用不可,建議本著一次呼叫執行多個動作,而不是多次呼叫每次只執行少量動作的原則

22.stringbuilder 和 string 的區別?

答:

string 在進行運算時(如賦值、拼接等)會產生乙個新的例項,而 stringbuilder 則不會。所以在大量字串拼接或頻繁對某一字串進行操作時最好使用 stringbuilder,不要使用 string

另外,對於 string 我們不得不多說幾句:

1.它是引用型別,在堆上分配記憶體

2.運算時會產生乙個新的例項

3.string 物件一旦生成不可改變(immutable)

3.定義相等運算子(==!=)是為了比較 string 物件(而不是引用)的值

示例:

using system;
using system.collections.generic;
using system.text;
namespace example22
msel", environment.tickcount - vtickcount);
vtickcount = environment.tickcount;
stringbuilder sb = new stringbuilder();
for (int i = 0; i < cycle; i++)
console.writeline("stringbuilder:  msel", environment.tickcount - vtickcount);
string tmpstr1 = "a";
string tmpstr2 = tmpstr1;
console.writeline(tmpstr1);
console.writeline(tmpstr2);
//注意後面的輸出結果,tmpstr1的值改變並未影響到tmpstr2的值
tmpstr1 = "b";
console.writeline(tmpstr1);
console.writeline(tmpstr2);
console.readline();
}
}
}

結果:

string: 375 msel

stringbuilder: 16 mselaa

ba23.explicit 和 implicit 的含義?

答:

explicit 和 implicit 屬於轉換運算子,如用這兩者可以讓我們自定義的型別支援相互交換

explicti 表示顯式轉換,如從 a -> b 必須進行強制型別轉換(b = (b)a)

implicit 表示隱式轉換,如從 b -> a 只需直接賦值(a = b)

隱式轉換可以讓我們的**看上去更漂亮、更簡潔易懂,所以最好多使用 implicit 運算子。不過!如果物件本身在轉換時會損失一些資訊(如精度),那麼我們只能使用 explicit 運算子,以便在編譯期就能警告客戶呼叫端

示例:

using system;
using system.collections.generic;
using system.text;
namespace example23
public

static

implicit

operator monster(immortal value)

}
class monster
public

static

explicit

operator immortal(monster value)

}
static

void main(string args)

}
}

結果:

紫霞仙子:神仙變妖怪?偷偷下凡即可。。。

孫悟空:妖怪想當神仙?再去修煉五百年!

歡迎您使用http://blogmove.cn提供的"部落格搬家"和"博文三窟"服務.

C 基礎概念二十五問 16 20

16.類和結構的區別?答 類 類是引用型別在堆上分配,類的例項進行賦值只是複製了引用,都指向同一段實際物件分配的記憶體 類有構造和析構函式 類可以繼承和被繼承 結構 結構是值型別在棧上分配 雖然棧的訪問速度比較堆要快,但棧的資源有限放 結構的賦值將分配產生乙個新的物件。結構沒有建構函式,但可以新增。...

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 當中加入了控制按...