C# взаимно блокировал Exchange

Существенное различие между ними - то, что значения хранилища переменных типа значения, таким образом определяя переменную типа значения в вызове метода передают копию значения той переменной к методу. Переменные ссылочного типа хранят ссылки на объекты, таким образом определяя переменную ссылочного типа, поскольку аргумент передает метод копия фактической ссылки, которая относится к объекту. Даже при том, что сама ссылка передается значением, метод может все еще использовать ссылку, которую это получает для взаимодействия with— и возможно modify— исходный объект. Точно так же при возврате информации из метода через оператор возврата, метод возвращает копию значения, сохраненного в переменной типа значения или копии ссылки, сохраненной в переменной ссылочного типа. Когда ссылка возвращается, вызывающий метод может использовать ту ссылку для взаимодействия со ссылочным объектом. Так, в действительности объекты всегда передаются ссылкой.

В c#, для передачи переменной ссылкой, таким образом, вызываемый метод может изменить переменную, C# обеспечивает ключевые слова касательно и. Применение касательно ключевого слова к объявлению параметра позволяет, Вы для передачи переменной методу reference— вызываемый метод будете в состоянии изменить исходную переменную в вызывающей стороне. Касательно ключевого слова используется для переменных, которые уже были инициализированы в вызывающем методе. Обычно, когда вызов метода содержит неинициализированную переменную как аргумент, компилятор генерирует ошибку. Предшествование параметру с ключевым словом создает выходной параметр. Это указывает к компилятору, что аргумент будет передан в вызываемый метод ссылкой и что вызываемый метод присвоит значение исходной переменной в вызывающей стороне. Если метод не присваивает значение выходному параметру в каждом возможном пути выполнения, компилятор генерирует ошибку. Это также препятствует тому, чтобы компилятор генерировал сообщение об ошибке для неинициализированной переменной, которая передается как аргумент методу. Метод может возвратить только одно значение своей вызывающей стороне через оператор возврата, но может возвратить много значений путем определения нескольких вывод (касательно и/или) параметры.

см. c# обсуждение и примеры здесь текст ссылки

7
задан Sildoreth 13 April 2015 в 17:33
поделиться

3 ответа

Вы не можете передать приведенное выражение по ссылке, вы должны использовать временную переменную:

public static float Time;
float value2 = (float)SomeValue;
Interlocked.Exchange(ref Time, ref value2);
SomeValue = value2;
-3
ответ дан 6 December 2019 в 05:06
поделиться

Имеется перегрузка для Interlocked.Exchange специально для float (и другие для double , int ], long , IntPtr и объект ). Для uint его нет, поэтому компилятор считает, что наиболее близким совпадением является общий Interlocked.Exchange , но в этом случае T должен быть ссылочным типом. uint не является ссылочным типом, поэтому он тоже не работает - отсюда и сообщение об ошибке.

Другими словами:

  • Ваш текущий код работает, потому что он вызывает Interlocked.Exchange (ref float, float) .
  • Изменение его на uint не удается, потому что нет подходящей перегрузки. Точное сообщение об ошибке вызвано предположением компилятора, что вы имеете в виду Interlocked.Exchange (ref T, T) .

Что касается того, что делать, варианты могут быть следующими:

  • По возможности используйте вместо этого int , как предлагает Марк.
  • Если вам нужен дополнительный диапазон, подумайте об использовании long .
  • Используйте uint , но не Я пытаюсь написать код без блокировки

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

как предлагает Марк.
  • Если вам нужен дополнительный диапазон, подумайте об использовании long .
  • Используйте uint , но не пытайтесь писать код без блокировки
  • Хотя очевидно, что Exchange отлично работает с некоторыми конкретными типами значений, Microsoft не реализовала его для всех примитивных типов. Я не могу себе представить, что это было бы трудно сделать (в конце концов, это просто биты), но, по-видимому, они хотели, чтобы отсчет перегрузки был меньше.

    как предлагает Марк.
  • Если вам нужен дополнительный диапазон, подумайте об использовании long .
  • Используйте uint , но не пытайтесь писать код без блокировки
  • Хотя очевидно, что Exchange отлично работает с некоторыми конкретными типами значений, Microsoft не реализовала его для всех примитивных типов. Я не могу себе представить, что это было бы трудно сделать (в конце концов, это просто биты), но, по-видимому, они хотели, чтобы отсчет перегрузки был меньше.

    17
    ответ дан 6 December 2019 в 05:06
    поделиться

    Возможно, используйте int вместо uint ; есть перегрузки для int . Вам нужен дополнительный диапазон? В таком случае произведите преобразование как можно позже.

    3
    ответ дан 6 December 2019 в 05:06
    поделиться
    Другие вопросы по тегам:

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