Проблема с помощью касательно ключевого слова. Очень вопрос о новичке!

Вот мой класс:

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)
        {

        }
    }

У меня создается впечатление, что касательно ключевого слова говорит компьютеру использовать ту же переменную и не создавать новую.

Я использую его правильно? Я должен использовать касательно и на строке кода вызова и на фактической реализации метода?

5
задан Earlz 27 April 2010 в 15:38
поделиться

4 ответа

Когда вы передаете ссылочный тип (в вашем случае ваш класс UserInformation является ссылочным типом) в качестве параметра, по умолчанию вы передаете указатель на класс по значению , что означает, что GetPersonalDetails получит свою собственную копию указателя, который указывает на тот же экземпляр класса UserInformation .

Использование ключевого слова ref в вашем примере передаст тот же указатель на экземпляр UserInformation методу.

Итак, в вашем случае, если вы хотите просто изменить свойства UserInformation , ключевое слово ref не требуется, поскольку вы будете изменять фактический экземпляр из ] GetPersonalDetails и GetMachineDetails . Однако, если вы намереваетесь создать экземпляр нового объекта UserInformation внутри этих методов или установить для экземпляра значение null, вам нужно будет использовать ключевое слово ref .

Джон Скит отлично объяснил передачу параметров в этой статье .

5
ответ дан 13 December 2019 в 05:32
поделиться

В отличие от C ++, в C # передача ссылочной переменной функции означает использование той же переменной. Это означает, что вы можете изменить переменную, и это изменение будет видно вызывающему абоненту. Ключевое слово ref позволяет изменить саму ссылку (это означает, что ссылка передается по ссылке). Это означает, что функция может установить ссылку на null или присвоить ее другому объекту, и это изменение будет видно вызывающему. Да, ref должен использоваться как функцией, так и вызывающим. Это лучше, чем в C ++, вы можете видеть в коде вызывающего абонента, этот параметр передается по ссылке.

Если вы знакомы с C / C ++, передача ссылочного типа в функцию без ключевого слова ref аналогична * в C ++. Передача ссылочного типа в функцию с ref аналогична ** в C ++.

0
ответ дан 13 December 2019 в 05:32
поделиться

Вам, вероятно, не нужно использовать здесь 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";
    }
4
ответ дан 13 December 2019 в 05:32
поделиться

У меня сложилось впечатление, что ключевое слово ref указывает компьютеру использовать ту же переменную, а не создавать новую .

Возможно, у вас есть опыт работы на C. В отличие от класса / структуры C, класс C # не копирует весь класс в вызываемую функцию. Если вы будете использовать struct в C #, она создаст независимую копию всего содержимого struct для вызываемой функции, поэтому ref требуется, когда вы хотите минимизировать накладные расходы памяти / времени выполнения при передаче вашей структуры данных struct к вашей функции.

Если у вас есть знания в 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. Thinking ..

{{1} }
3
ответ дан 13 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: