Это не работает для меня. Auth :: check () - FALSE, а Auth :: user () - NULL.
Только для получения информации, C# 4.0 будет иметь что-то как этот сахар, но только при вызове interop методов - частично из-за чистой склонности ref
в этом сценарии. Я не протестировал его очень (в CTP); мы должны будем видеть, как это удается...
Свойства являются не чем иным, как синтаксический сахар по Java разрабатывают getX/setX методы. Это не имеет большого смысла для 'касательно' на методе. В Вашем экземпляре это имело бы смысл, потому что Ваши свойства просто гасят поля. Свойства не должны просто быть тупиками, следовательно платформа не может позволить 'касательно' на Свойствах.
РЕДАКТИРОВАНИЕ : Ну, простой ответ - то, что простое то, что метод считывания Свойства или метод set могли включать намного больше, чем просто полевое чтение-запись, делает это нежелательным, не говоря уже о возможно неожиданном, для разрешения вида сахара, который Вы предлагаете. Это не должно говорить, что я не нуждался в этой функциональности прежде, просто что я понимаю, почему они не хотели бы обеспечивать ее.
Поскольку Вы передаете результат из индексатора, который является действительно результатом вызова метода. Нет никакой гарантии, что свойство индексатора также имеет метод set, и проходить мимо него касательно привело бы к ложной безопасности на части разработчика, когда он думает, что его свойство будет установленным без называемого метода set.
На более техническом уровне, касательно и передают адрес памяти объекта, переданного в них, и установить свойство, необходимо назвать метод set, таким образом, нет никакой гарантии, что свойство было бы на самом деле изменено особенно, когда тип свойства неизменен. касательно и не делают всего , устанавливает значение по возврату метода, они передают фактическую ссылку памяти на сам объект.
Можно использовать поля с ref
/ out
, но не свойства. Причина состоит в том, что свойства являются действительно просто коротким путем синтаксиса для специальных методов. Компилятор на самом деле переводит, добираются / свойства набора до соответствующего get_X
и set_X
методы, поскольку CLR не имеет никакой непосредственной поддержки свойств.
Это не было бы ориентировано на многопотоковое исполнение; если два потока одновременно создают свои собственные копии значения свойства и передают их функциям как касательно параметров, только один из них заканчивает назад в свойстве.
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.
, Что пример кода также выделяет трудности, представленные вещами как анонимные методы при просьбе, чтобы компилятор сделал сладкий материал.
Причина этого состоит в том, что C# не поддерживает "parameterful" свойства, которые принимают параметры, переданные ссылкой. Интересно отметить, что CLR действительно поддерживает эту функциональность, но C# не делает.
Когда Вы передаете касательно / предварительно ожидаемого, это означает передачу ссылочного типа, который хранится в "куче".
Свойства являются методами обертки, не переменными.
Этот сайт, кажется, имеет работу вокруг для Вас. Я не протестировал его, хотя, таким образом, я не могу гарантировать, это будет работать. Пример, кажется, использует отражение для получения доступа к получению и функциям множества свойства. Это - вероятно, не рекомендуемый подход, но он мог бы выполнить то, что Вы просите.
http://www.codeproject.com/KB/cs/Passing_Properties_byref.aspx
Если Вы спрашиваете, почему компилятор не заменяет полем, возвращенным методом считывания свойства, это - потому что метод считывания может возвратить константу или только для чтения или литеральный или что-то еще, что не должно быть повторно инициализировано или перезаписано.