IP filter˙
使用emule的時候
為了:保護自己 必須使用IP過濾器來濾掉一些危險IP
用法
將 ipfilter.dat 放置在主程式資料夾下的 「Config」 的資料夾裡
之後觀看「記錄」的部分 看看是否有載入
如果成功 應該就會 出現XXXXIP-過濾已載入 的訊息
2009年2月25日 星期三
2009年2月10日 星期二
C#的事件指派
namespace ConsoleTest2008
{
public delegate void TestEvent(int myX);
class AT {
public AT()
{
_x = 100;
_y = 200;
}
//解構式測試
~AT() {
Console.WriteLine("AT is Die");
}
private int _x;
private int _y;
public event TestEvent isLarge;
public int Attr {
get {
return _x;
}
set
{
if (value < 0)
{
_x = 0;
}
else
{
if (value > 5)
{
isLarge(value);
}
_x = value;
}
}
}
}
class Program
{
static void Main(string[] args)
{
AT at = new AT();
Console.WriteLine("事件測試");
at.isLarge+=new TestEvent(at_isLarge);
at.Attr = 9;
GC.Collect();
/* Ctrl+F5 編譯時不會程式自動結束*/
}
static void at_isLarge(int _x)
{
Console.WriteLine("X:{0}太大", _x);
}
}
C#事件指派幾個要點
宣告委託型態
delegate void TestEvent(int myX);
透過delegate 宣告事件處裡函式的基本型態
之後的事件指派函式必須長的委託者長的一樣
宣告事件
public event TestEvent isLarge;
透過event宣告事件名稱跟委託者型態
上面程式代表事件 isLarge必須給樣式為TestEvent的人處裡
制於事件何時發生必須透過物件程式自己判斷
if (value > 5)
{
isLarge(value);
}
如上 ,當value大於5時 event就會被觸發
事件可以當函數直接呼叫,但是參數要傳對
事件委託
上面宣告好之後就開始正式委託
at.isLarge+=new TestEvent(at_isLarge);
at.Attr = 9;
物件at將isLarge事件委託給at_isLarge處裡
C#事件的委託很像C++函數指標,就是把函數當成變數來使用
可以把delegate看成一種宣告函數指標
可以用於很多方面
delegate bool Compare(int a,int b);
.......
bool isSmall(int a,int b){...}
bool isBig(int a,int b){...}
Compare cmp=new Compare(isSmall);//將cmp指向函式isSmall
swap(cmp);
cmp==new Compare(isBig);//將cmp指向函式isBig
swap(cmp);
....
void swap(Compare cmp){...}
藉此可達成另一種多型的應用
C# 函式 ref out getter setter
C#函式的參數傳遞有分三種 call By Value,call By Refeance,Output parameter
第一種就是最原始的參數傳遞,也就是函式運作不改變
call By Value範例
上面範例 a,b,x,y都是使用不同記憶體 x,y的值不會被改變
第二種是參數跟變數共用記憶體 變數會被函式影響
call By Refeance範例
上面範例 a跟x是同一份記憶體 b跟y是同一份記憶體
x,y會被函式swap改變
第三種就跟call By Refeance很像
變數跟參數共用記憶體,但是變數不需要指派初始值
變數的值由函式賦予
再來介紹setter跟getter的語法
第一種就是最原始的參數傳遞,也就是函式運作不改變
call By Value範例
int swap(a,b){....}
int x,y;
x=1;
y=2;
......
swap(x,y);
上面範例 a,b,x,y都是使用不同記憶體 x,y的值不會被改變
第二種是參數跟變數共用記憶體 變數會被函式影響
call By Refeance範例
int swap(ref a,ref b){....}
int x,y;
x=1;
y=2;
......
swap(ref x,ref y);
上面範例 a跟x是同一份記憶體 b跟y是同一份記憶體
x,y會被函式swap改變
第三種就跟call By Refeance很像
變數跟參數共用記憶體,但是變數不需要指派初始值
變數的值由函式賦予
int setValue(out a,out b){....}
int x,y;
......
setValue(out x,out y);
再來介紹setter跟getter的語法
class AT {
public AT()
{
_x = 100;
_y = 200;
}
private int _x;
private int _y;
/*getter setter屬性封裝測試*/
public int Attr {
get {
return _x;
}
set
{
if (value < 0)
{
_x = 0;
}
else
{
_x = value;
}
}
}
/*唯獨屬性測試*/
public int ReadOnly
{
get {
return _y;
}
/*要建立唯獨屬性 就是只設立get*/
/*要建立唯寫屬性 就是只設立set*/
/*如果唯獨嘗試設值會編譯不過*/
}
}
訂閱:
文章 (Atom)