C 學習筆記 2

2021-04-13 23:49:27 字數 4357 閱讀 8698

ref

和out

都是是傳遞引用,

out是返回值,兩者有一定的相同之處,不過也有不同點。

使用ref

前必須對變數賦值,

out不用。

out的函式會清空變數,即使變數已經賦值也不行,退出函式時所有

out引用的變數都要賦值,

ref引用的可以修改,也可以不修改。

下面是使用

out和

ref進行陣列修改的例子:

static

void fillarray(out

int arr)

; }

static

void fillarrayref(ref

int arr)

// fill the array:

arr[0] = 1111;

arr[4] = 5555;

}

ref1

ref2

.yield

是c#2.0

引入的新關鍵字,它主要是用來遍歷函式返回的物件,其主要功能是在

il**中生成了狀態資訊,使使用者不用自己維護遍歷器的狀態資訊。下面是乙個例子:每次呼叫

getint()

都會得到乙個增加的數:

public

static ienumerable getint()

下面是呼叫:

class

program

public

static ienumerable getint()

} yield

通常用在實現

ienumerable

介面的getenumerator()

函式中。

class

testclass : ienumerable

#endregion

#region

ienumerable members

ienumerator ienumerable.getenumerator()

#endregion

}

.net

框架程式可以通過靜態

dll

入口點的方式來訪問本機**庫。

dllimport

屬性用於指定包含外部方法的實現的

dll

位置。dllimport

屬性定義如下:

namespace

system.runtime.interopservices

public

callingconvention callingconvention;

public

charset charset;

public

string entrypoint;

public

bool exactspelling;

public

bool preservesig;

public

bool setlasterror;

public

string value }

} }

說明:1、

dllimport

只能放置在方法宣告上。2、

dllimport

具有單個定位引數:指定包含被匯入方法的

dll

名稱的dllname

引數。3

、dllimport

具有五個命名引數:a、

callingconvention

引數指示入口點的呼叫約定。如果未指定

callingconvention

,則使用預設值

callingconvention.winapi。b

、charset

引數指示用在入口點中的字符集。如果未指定

charset

,則使用預設值

charset.auto。c

、entrypoint

引數給出

dll

中入口點的名稱。如果未指定

entrypoint

,則使用方法本身的名稱。d、

exactspelling

引數指示

entrypoint

是否必須與指示的入口點的拼寫完全匹配。如果未指定

exactspelling

,則使用預設值

false。e

、preservesig

引數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為乙個具有

hresult

返回值和該返回值的乙個名為

retval

的附加輸出引數的簽名。如果未指定

preservesig

,則使用預設值

true。f

、setlasterror

引數指示方法是否保留

win32"

上一錯誤

"。如果未指定

setlasterror

,則使用預設值

false。4

、它是一次性屬性類。

5、此外,用

dllimport

屬性修飾的方法必須具有

extern

修飾符。

下面是c# 呼叫

win32 messagebox

函式的示例:

using

system;

using

system.runtime.interopservices;

class

}物件導向的程式語言幾乎都用到了抽象類這一概念,抽象類為實現抽象事物提供了更大的靈活性。

ntfs

的系統壓縮檔案可以使使用者無縫整合壓縮功能,實現壓縮的流式儲存。

但是,.net

還不支援這一系統級的功能,可以通過

interops

呼叫native

函式。下面是一段示例**:

using

system;

using

system.collections.generic;

using

system.text;

using

system.io;

using

microsoft.win32.safehandles;

using

system.runtime.interopservices;

namespace

compressntfstest

} } c#

在.net2.0

以後引入了范型的概念,可以建立帶有型別的引數,而且這些型別在被例項化的時候才真正指定。這種范型的引入是有一定的效能代價的,在裝箱/拆箱大型資料結構時會有比較明顯的效能影響。

下面是乙個例子

// declare the generic class

public

class

genericlist

}

class

testgenericlist

static

void main()

} 通常,clr

會自己控制管理類或者結構的物理儲存結構,如果這些資料型別需要以指定的方式進行儲存,可以使用

structlayoutattribute.

按照指定的方式進行儲存在進行非託管程式的程式設計時非常重要,比如,這些類有可能會被作為引數傳遞給非託管**。

layoutkind

用來指定儲存方式,其中

sequential

強迫成員按照順序進行儲存,

explicit

可以明確指定每乙個成員的儲存方式,但使用

explicit

, 每乙個成員必須使用

fieldoffsetattribute

標識該成員在此型別中的偏移位置(

offset

)。例子:

[structlayout(layoutkind.explicit, size = 16, charset = charset.ansi)]

public

class

mysystemtime

C 學習筆記(2)

定義 namespace a namespace a 系統會自動合併這兩個 使用時在前面加上using namespace a 或者a var來呼叫命名空間a中的變數和函式。wchar t雙位元組型變數,佔據2位元組,而char只佔據1位元組 wchar t wc l 中國 setlocale lc...

c 學習筆記 2

迴圈 while迴圈 計數控制迴圈 counter controlled loop 標記控制的迴圈 sentinel conrolled loop 在寫迴圈的過程中容易出現多一次或者少一次的錯誤 即差一錯誤 off by one error 計算減法 簡單 include include rand ...

c 學習筆記(2)

筆記 1.相同型別的類物件通過拷貝建構函式完成整個複製過程。2.編譯器會自動生成乙個拷貝建構函式,即預設拷貝建構函式,這個建構函式很簡單,僅僅使用老物件的資料成員的值對新物件的資料成員一一賦值。預設拷貝建構函式執行的是淺拷貝。3.在深拷貝的情況下,對於物件中的動態成員,就不能僅僅簡單的賦值了,而應該...