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.在深拷貝的情況下,對於物件中的動態成員,就不能僅僅簡單的賦值了,而應該...