Свойство C# и касательно параметра, почему никакой сахар?

Это не работает для меня. Auth :: check () - FALSE, а Auth :: user () - NULL.

70
задан Peter Mortensen 20 August 2010 в 20:10
поделиться

9 ответов

Только для получения информации, C# 4.0 будет иметь что-то как этот сахар, но только при вызове interop методов - частично из-за чистой склонности ref в этом сценарии. Я не протестировал его очень (в CTP); мы должны будем видеть, как это удается...

11
ответ дан Marc Gravell 24 November 2019 в 13:30
поделиться

Свойства являются не чем иным, как синтаксический сахар по Java разрабатывают getX/setX методы. Это не имеет большого смысла для 'касательно' на методе. В Вашем экземпляре это имело бы смысл, потому что Ваши свойства просто гасят поля. Свойства не должны просто быть тупиками, следовательно платформа не может позволить 'касательно' на Свойствах.

РЕДАКТИРОВАНИЕ : Ну, простой ответ - то, что простое то, что метод считывания Свойства или метод set могли включать намного больше, чем просто полевое чтение-запись, делает это нежелательным, не говоря уже о возможно неожиданном, для разрешения вида сахара, который Вы предлагаете. Это не должно говорить, что я не нуждался в этой функциональности прежде, просто что я понимаю, почему они не хотели бы обеспечивать ее.

17
ответ дан user7116 24 November 2019 в 13:30
поделиться

Поскольку Вы передаете результат из индексатора, который является действительно результатом вызова метода. Нет никакой гарантии, что свойство индексатора также имеет метод set, и проходить мимо него касательно привело бы к ложной безопасности на части разработчика, когда он думает, что его свойство будет установленным без называемого метода set.

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

32
ответ дан David Morton 24 November 2019 в 13:30
поделиться

Можно использовать поля с ref / out, но не свойства. Причина состоит в том, что свойства являются действительно просто коротким путем синтаксиса для специальных методов. Компилятор на самом деле переводит, добираются / свойства набора до соответствующего get_X и set_X методы, поскольку CLR не имеет никакой непосредственной поддержки свойств.

9
ответ дан Brian Rasmussen 24 November 2019 в 13:30
поделиться

Это не было бы ориентировано на многопотоковое исполнение; если два потока одновременно создают свои собственные копии значения свойства и передают их функциям как касательно параметров, только один из них заканчивает назад в свойстве.

class Program
{
  static int PropertyX { get; set; }

  static void Main()
  {
    PropertyX = 0;

    // Sugared from: 
    // WaitCallback w = (o) => WaitAndIncrement(500, ref PropertyX);
    WaitCallback w = (o) => {
      int x1 = PropertyX;
      WaitAndIncrement(500, ref x1);
      PropertyX = x1;
    };
    // end sugar

    ThreadPool.QueueUserWorkItem(w);

    // Sugared from: 
    // WaitAndIncrement(1000, ref PropertyX);
    int x2 = PropertyX;      
    WaitAndIncrement(1000, ref x2);
    PropertyX = x2;
    // end sugar

    Console.WriteLine(PropertyX);
  }

  static void WaitAndIncrement(int wait, ref int i)
  {
    Thread.Sleep(wait);
    i++;
  }
}

PropertyX заканчивает как 1, тогда как поле или локальная переменная были бы 2.

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

6
ответ дан Mark Rendle 24 November 2019 в 13:30
поделиться

Причина этого состоит в том, что C# не поддерживает "parameterful" свойства, которые принимают параметры, переданные ссылкой. Интересно отметить, что CLR действительно поддерживает эту функциональность, но C# не делает.

4
ответ дан Andrew Hare 24 November 2019 в 13:30
поделиться

Когда Вы передаете касательно / предварительно ожидаемого, это означает передачу ссылочного типа, который хранится в "куче".

Свойства являются методами обертки, не переменными.

4
ответ дан Peter Mortensen 24 November 2019 в 13:30
поделиться

Этот сайт, кажется, имеет работу вокруг для Вас. Я не протестировал его, хотя, таким образом, я не могу гарантировать, это будет работать. Пример, кажется, использует отражение для получения доступа к получению и функциям множества свойства. Это - вероятно, не рекомендуемый подход, но он мог бы выполнить то, что Вы просите.

http://www.codeproject.com/KB/cs/Passing_Properties_byref.aspx

0
ответ дан regex 24 November 2019 в 13:30
поделиться

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

1
ответ дан BC. 24 November 2019 в 13:30
поделиться
Другие вопросы по тегам:

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