[英]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
關鍵字,因為您將從GetPersonalDetails
和GetMachineDetails
修改實際實例。 但是,如果您的目的是從這些方法中實例化新的UserInformation
對象或將實例設置為null,則需要使用ref
關鍵字。
你可能不需要在這里使用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.