簡體   English   中英

無法使用ref關鍵字。 非常新手的問題!

[英]Trouble using the ref keyword. Very newbie question!

這是我的班級:

public class UserInformation
    {
        public string Username { get; set; }
        public string ComputerName { get; set; }
        public string Workgroup { get; set; }

        public string OperatingSystem { get; set; }
        public string Processor { get; set; }
        public string RAM { get; set; }
        public string IPAddress { get; set; }

        public UserInformation GetUserInformation()
        {
            var CompleteInformation = new UserInformation();

            GetPersonalDetails(ref CompleteInformation);
            GetMachineDetails(ref CompleteInformation);

            return CompleteInformation;
        }

        private void GetPersonalDetails(ref UserInformation CompleteInformation)
        {

        }

        private void GetMachineDetails(ref UserInformation CompleteInformation)
        {

        }
    }

我的印象是ref關鍵字告訴計算機使用相同的變量而不是創建一個新變量。

我正確使用它嗎? 我是否必須在調用代碼行和實際方法實現上使用ref?

當您將引用類型(在您的情況下,您的UserInformation類是引用類型)作為參數傳遞時,默認情況下您將指針傳遞給類的值 ,這意味着GetPersonalDetails將獲得自己的指針副本,該指針指向UserInformation類的相同實例。

在示例中使用ref關鍵字將向UserInformation實例傳遞指向該方法的相同指針。

因此,在您的情況下,如果您的目的是簡單地修改UserInformation的屬性,則不需要ref關鍵字,因為您將從GetPersonalDetailsGetMachineDetails修改實際實例。 但是,如果您的目的是從這些方法中實例化新的UserInformation對象或將實例設置為null,則需要使用ref關鍵字。

Jon Skeet在解釋本文中的參數傳遞方面做得很好。

你可能不需要在這里使用ref 類是引用類型,因此您已經傳遞了引用。

這是沒有ref的代碼,還修復了許多其他樣式問題:

    public UserInformation GetUserInformation()
    {
        UserInformation userInformation = new UserInformation();

        updatePersonalDetails(userInformation);
        updateMachineDetails(userInformation);

        return userInformation;
    }

    private void updatePersonalDetails(UserInformation userInformation)
    {
        userInformation.FirstName = "Sergio";
        userInformation.LastName = "Tapia";
     }

    private void updateMachineDetails(UserInformation userInformation)
    {
        userInformation.MachineName = "Foobar";
    }

我的印象是ref關鍵字告訴計算機使用相同的變量而不是創建一個新變量。

也許你有C背景。 與C類/結構不同,C#類不會將整個類的副本復制到被調用的函數。 如果你將在C#中使用struct,它會將struct的整個內容的獨立副本復制到被調用函數,因此當你想在將struct數據結構傳遞給函數時最小化內存/運行時開銷時,保證ref。

如果您對C有所了解,那么您的上述代碼將轉換為:

UserInformation *CompleteInformation = new UserInformation();

GetPersonalDetails(&CompleteInformation);    

你的函數有ref轉換為:

void GetPersonalDetails(UserInformation **CompleteInformation)
{
    // you can make the CompleteInformation outside to point to new instance
}

因此,如果您不將CompleteInformation指向GetPersonalDetails中的新實例,則無需使用ref關鍵字。 刪除調用語句和被調用函數的ref關鍵字。

var CompleteInformation = new UserInformation();
GetMachineDetails(CompleteInformation);

private void GetPersonalDetails(UserInformation CompleteInformation)
{
    // you cannot make the CompleteInformation outside to point to new instance
}

C#代碼被轉換為C:

UserInformation *CompleteInformation = new UserInformation();

GetPersonalDetails(CompleteInformation);    

void GetPersonalDetails(UserInformation *CompleteInformation)
{
    // you cannot make the CompleteInformation outside to point to new instance
}

嗯... :-)仍然在思考如何用C#術語來解釋我的答案,而不是對C語言進行類比。

與C ++不同,在C#中將引用變量傳遞給函數意味着使用相同的變量。 這意味着,您可以更改變量,並且此更改對調用者可見。 ref關鍵字允許更改引用本身(這意味着引用通過引用傳遞)。 這意味着,函數可以將引用設置為null或將其分配給另一個對象,並且此更改對調用者可見。 是的,ref應該由函數和調用者使用。 這比在C ++中更好,你可以在調用者代碼中看到,該參數是通過引用傳遞的。

如果您了解C / C ++,則將引用類型傳遞給不帶ref關鍵字的函數與C ++中的*相同。 使用ref將引用類型傳遞給函數與C ++中的**相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM