繁体   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