none
function參數 RRS feed

  • 問題

  • private void A(int a , int b)
    {  a=10; b=20 ;}
    int a =1 , b = 2;

    我執行A(a , b)

    在A中即便 變更了a與b的值,但是我只是傳一個值進去,所以不管A中如何變更數值,a也不會變成10,除非是用ref的方式

    但是好像使用某些c++寫的dll function 沒有ref  但是為什麼依舊可以變更我傳入的參數值

    2018年3月20日 上午 03:01

解答

  • 因為 int 是實值型別

    假設 呼叫端是這樣呼叫的 A(5,6);

    他就真真實實地把 5 複製給 a, 把 6 複製給 b.

    就像

    int i = 0;

    int j = i;

    下一行 j =5 ; 之後 i 不會變成 5.
    一樣的道理

    所以 a 和 b 無論如何變化都和呼叫者無關.

    至於你說 c++ 的狀況用的應該是指標變數吧.

    參考 傳遞參數 (C# 程式設計手冊)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2018年3月20日 上午 04:06
    版主
  • 我覺得你提出 C++ ,是否貼上你遇到的例子。

    就我知道你這樣的寫法 在 C++ 也是 call by value 。



    沒有dll原始碼 所以只能提供手冊與dllimport的程式碼

    Syntax: int OCR_StartSession(LPCSTRlpSrvAddr,intnSrvPort,LPCSTRlpUserName, LPCSTRlpPassword,HWNDnParentWnd,int*nPortNum,int*Handle);
    Parameters: lpSrvAddr [in] 設備地址
    nSrvPort [in] 設備服務端口
    lpUserName [in] 登錄用戶名稱
    lpPassword [in] 登錄用戶密碼
    nPortNum [out] 當前設備的端口總數量
    nParentWnd [in] 調用 Snapshot 的視窗句柄。
    nHandle [out] 返回 Session 句柄

     [DllImport(path, CharSet = CharSet.Ansi, SetLastError = true)]
    public unsafe static extern int OCR_StartSession(String lpSrvAddr, int nSrvPort, String lpUserName, String lpPassword, int nParentWnd, int* nPortNum, int* Handle);

    當我OCR_StartSession() 傳入nHandle參數

    nHandle會變更為回傳值。

    1.手冊有註明雖然有註明 nHandle [out]  但是想請問是怎麼一回事?


    你的參數宣告是 int* Handle ,多一個 *,這是 call by address。

    • 已標示為解答 StuBoo 2018年3月21日 上午 09:19
    2018年3月20日 上午 05:20

所有回覆

  • 因為 int 是實值型別

    假設 呼叫端是這樣呼叫的 A(5,6);

    他就真真實實地把 5 複製給 a, 把 6 複製給 b.

    就像

    int i = 0;

    int j = i;

    下一行 j =5 ; 之後 i 不會變成 5.
    一樣的道理

    所以 a 和 b 無論如何變化都和呼叫者無關.

    至於你說 c++ 的狀況用的應該是指標變數吧.

    參考 傳遞參數 (C# 程式設計手冊)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2018年3月20日 上午 04:06
    版主
  • 我覺得你提出 C++ ,是否貼上你遇到的例子。

    就我知道你這樣的寫法 在 C++ 也是 call by value 。



    2018年3月20日 上午 04:19
  • 我覺得你提出 C++ ,是否貼上你遇到的例子。

    就我知道你這樣的寫法 在 C++ 也是 call by value 。



    沒有dll原始碼 所以只能提供手冊與dllimport的程式碼

    Syntax: int OCR_StartSession(LPCSTRlpSrvAddr,intnSrvPort,LPCSTRlpUserName, LPCSTRlpPassword,HWNDnParentWnd,int*nPortNum,int*Handle);
    Parameters: lpSrvAddr [in] 設備地址
    nSrvPort [in] 設備服務端口
    lpUserName [in] 登錄用戶名稱
    lpPassword [in] 登錄用戶密碼
    nPortNum [out] 當前設備的端口總數量
    nParentWnd [in] 調用 Snapshot 的視窗句柄。
    nHandle [out] 返回 Session 句柄

     [DllImport(path, CharSet = CharSet.Ansi, SetLastError = true)]
    public unsafe static extern int OCR_StartSession(String lpSrvAddr, int nSrvPort, String lpUserName, String lpPassword, int nParentWnd, int* nPortNum, int* Handle);

    當我OCR_StartSession() 傳入nHandle參數

    nHandle會變更為回傳值。

    1.手冊有註明雖然有註明 nHandle [out]  但是想請問是怎麼一回事?


    2018年3月20日 上午 05:14
  • 我覺得你提出 C++ ,是否貼上你遇到的例子。

    就我知道你這樣的寫法 在 C++ 也是 call by value 。



    沒有dll原始碼 所以只能提供手冊與dllimport的程式碼

    Syntax: int OCR_StartSession(LPCSTRlpSrvAddr,intnSrvPort,LPCSTRlpUserName, LPCSTRlpPassword,HWNDnParentWnd,int*nPortNum,int*Handle);
    Parameters: lpSrvAddr [in] 設備地址
    nSrvPort [in] 設備服務端口
    lpUserName [in] 登錄用戶名稱
    lpPassword [in] 登錄用戶密碼
    nPortNum [out] 當前設備的端口總數量
    nParentWnd [in] 調用 Snapshot 的視窗句柄。
    nHandle [out] 返回 Session 句柄

     [DllImport(path, CharSet = CharSet.Ansi, SetLastError = true)]
    public unsafe static extern int OCR_StartSession(String lpSrvAddr, int nSrvPort, String lpUserName, String lpPassword, int nParentWnd, int* nPortNum, int* Handle);

    當我OCR_StartSession() 傳入nHandle參數

    nHandle會變更為回傳值。

    1.手冊有註明雖然有註明 nHandle [out]  但是想請問是怎麼一回事?


    你的參數宣告是 int* Handle ,多一個 *,這是 call by address。

    • 已標示為解答 StuBoo 2018年3月21日 上午 09:19
    2018年3月20日 上午 05:20