2009年2月25日 星期三

eMule IP filter

IP filter˙
使用emule的時候
為了:保護自己 必須使用IP過濾器來濾掉一些危險IP
用法
將 ipfilter.dat 放置在主程式資料夾下的 「Config」 的資料夾裡
之後觀看「記錄」的部分 看看是否有載入
如果成功 應該就會 出現XXXXIP-過濾已載入 的訊息

2009年2月10日 星期二

IIS 發生未預期的錯誤0x8ffe2740

主要是因為有其他應用程式port相衝
要更改IIS的port才能解決
或者可能跟skype衝突

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範例
    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*/
    /*如果唯獨嘗試設值會編譯不過*/

    }

    }