5

这是我的课:

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 吗?

4

4 回答 4

5

当您将引用类型(在您的情况下,您的UserInformation类是引用类型)作为参数传递时,默认情况下,您通过 value将指针传递给类,这意味着GetPersonalDetails将获得指向相同的指针的自己的副本类的实例UserInformation

在您的示例中使用ref关键字会将指向UserInformation实例的相同指针传递给方法。

因此,在您的情况下,如果您的意图是简单地修改 的属性UserInformation,则ref不需要关键字 in ,因为您将从 和 修改实际GetPersonalDetails实例GetMachineDetails。但是,如果您的意图是UserInformation从这些方法中实例化一个新对象或将实例设置为 null,则需要使用ref关键字。

Jon Skeet在本文中很好地解释了参数传递。

于 2010-04-25T14:37:45.803 回答
4

你可能不需要在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";
    }
于 2010-04-25T14:29:14.070 回答
3

我的印象是 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 类比。思考..

于 2010-04-25T14:48:04.530 回答
0

与 C++ 不同,在 C# 中将引用变量传递给函数意味着使用相同的变量。这意味着,您可以更改变量,并且此更改对调用者可见。ref 关键字允许更改引用本身(这意味着引用通过引用传递)。这意味着,函数可以将引用设置为 null 或将其分配给另一个对象,并且此更改对调用者可见。是的,函数和调用者都应该使用 ref。这比在 C++ 中要好,您可以在调用者代码中看到,该参数是通过引用传递的。

如果您了解 C/C++,则将引用类型传递给不带 ref 关键字的函数与 C++ 中的 * 相同。使用 ref 将引用类型传递给函数与 C++ 中的 ** 相同。

于 2010-04-25T14:34:23.653 回答