В C#, где Вы используете “касательно” перед параметром?

Ваш код в порядке (я тоже пробовал сам). Из того, что я вижу выше, вы также отправляете значение вместе с развертыванием. Поскольку вы сами не определили конструктор, вызывается конструктор по умолчанию, который не подлежит оплате. Если вы хотите отправлять эфир при развертывании контракта, вы также должны определить платного конструктора.

18
задан Peter Mortensen 9 October 2009 в 15:27
поделиться

9 ответов

По моему мнению, ref в значительной степени компенсировал сложность объявления новых типов утилит и сложность "привязки информации" к существующей информации, что есть в C # предпринял огромные шаги в направлении адресации с момента ее появления через LINQ, дженерики и анонимные типы.

Так что нет, я не думаю, что есть больше ясных вариантов использования для этого. Я думаю, что это в значительной степени пережиток того, как язык был изначально разработан.

Я действительно думаю, что это все еще имеет смысл (как упомянуто выше) в случае, когда вам нужно вернуть какой-то код ошибки из функции, а также возвращаемое значение, но ничего больше (так что больший тип на самом деле не оправдан.) Если бы я делал это повсеместно в проекте,

11
ответ дан 30 November 2019 в 07:23
поделиться

Ну, ссылка обычно используется для специализированных случаев, но я бы не стал Это называется избыточной или устаревшей функцией C #. Вы увидите, что он (и из ) часто использовал в XNA, например. В XNA матрица - это структура , причем довольно массивная (я считаю, 64 байта), и, как правило, лучше, если вы передадите ее функциям, используя ref чтобы не копировать 64 байта, а только 4 или 8. Специалист по C #? Безусловно. Из мало пользы больше или свидетельствует о плохом дизайне? Я не согласна

Из мало пользы больше или свидетельствует о плохом дизайне? Я не согласна

Из мало пользы больше или свидетельствует о плохом дизайне? Я не согласна

9
ответ дан 30 November 2019 в 07:23
поделиться

Один шаблон проектирования, в котором ref полезен, - это двунаправленный посетитель.

Предположим, у вас есть класс Storage , который можно использовать для загрузки или сохранить значения различных примитивных типов. Это либо в режиме Load , либо в режиме Save . У него есть группа перегруженных методов, называемых Transfer , и вот пример для работы со значениями int .

public void Transfer(ref int value)
{
    if (Loading)
        value = ReadInt();
    else
        WriteInt(value);
}

Существуют аналогичные методы для других примитивных типов - bool , string и т. Д.

Затем для класса, который должен быть «переносимым», вы должны написать метод, подобный этому:

public void TransferViaStorage(Storage s)
{
    s.Transfer(ref _firstName);
    s.Transfer(ref _lastName);
    s.Transfer(ref _salary);
}

Этот тот же единственный метод может загружать поля из Хранение или сохраните поля в Хранение , в зависимости от того, в каком режиме находится объект Хранение .

На самом деле вы просто перечисляете все поля, которые должны быть перенесены, поэтому он приближается к декларативному программированию, а не к императиву. Это означает, что вам не нужно писать две функции (одну для чтения, другую для записи), и учитывая, что дизайн, который я здесь использую, зависит от порядка, тогда очень удобно знать, что поля всегда будут читаться / записано в идентичном порядке.

Общий смысл состоит в том, что когда параметр помечен как ref , вы не знаете, будет ли метод читать его или записывать в него, и это позволяет вам разрабатывать классы посетителей, которые работают в одном из двух направлений, предназначенных для вызова симметричным образом (т. е. при посещении метода, не нуждающегося в том, в каком режиме направления работает класс посетителей).

Сравнение: Атрибуты + Отражение

Почему это вместо того, чтобы приписывать поля и использовать отражение для автоматической реализации эквивалента TransferViaStorage ? Потому что иногда рефлексия достаточно медленная, чтобы быть узким местом (но всегда быть уверенным в этом - это вряд ли когда-нибудь, а атрибуты намного ближе к идеалу декларативного программирования).

1
ответ дан 30 November 2019 в 07:23
поделиться

Одна область связана с использованием небольших служебных функций, например:

void Swap<T>(ref T a, ref T b) { T tmp = a; a = b; b = tmp; }  

Я не вижу здесь более «чистых» альтернатив. Конечно, это не совсем уровень архитектуры.

7
ответ дан 30 November 2019 в 07:23
поделиться

P / Invoke - единственное место, где я могу реально придумайте место, где вы должны использовать ref или out. В других случаях они могут быть удобными, но, как вы сказали, обычно есть другой, более чистый способ.

4
ответ дан 30 November 2019 в 07:23
поделиться

I think the best uses are those that you usually see; you need to have both a value and a "success indicator" that is not an exception from a function.

1
ответ дан 30 November 2019 в 07:23
поделиться

Что если вы хотите вернуть несколько объектов , которые по неизвестной причине не связаны вместе в один объект.

void GetXYZ( ref object x, ref object y, ref object z);

РЕДАКТИРОВАТЬ: divo предложил бы использовать параметры OUT для этого. Я должен признать, у него есть точка. Я оставлю этот ответ здесь, для протокола, это неадекватное решение. В этом случае OUT превосходит REF.

3
ответ дан 30 November 2019 в 07:23
поделиться

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

Я мог видеть, если у кого-то есть структура со 100 значениями (очевидно, это уже проблема), вы, вероятно, захотите передать ее по ссылке, чтобы предотвратить копирование 100 значений. Это и возвращение этой большой структуры и перезапись старого значения, вероятно, приведет к проблемам с производительностью.

1
ответ дан 30 November 2019 в 07:23
поделиться

The obvious reason for using the "ref" keyword is when you want to pass a variable by reference. For example passing a value type like System.Int32 to a method and alter it's actual value. A more specific use might be when you want to swap two variables.

public void Swap(ref int a, ref int b)
{
   ...
}

The main reason for using the "out" keyword is to return multiple values from a method. Personally I prefer to wrap the values in a specialized struct or class since using the out parameter produces rather ugly code. Parameters passed with "out" - is just like "ref" - passed by reference.

public void DoMagic(out int a, out int b, out int c, out int d)
{
   ...
}
0
ответ дан 30 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

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