присвоение значения в Set accssor вместо использования ключевого слова value - PullRequest
0 голосов
/ 28 июля 2011

Мне интересно, почему этот код работает нормально, а компилятор не генерирует никаких ошибок или предупреждений?

class Program
{
    static int _value;
    static int MyValue
    {
        get { return _value; }
        set { _value = 5; }
    }


    static void Main()
    {
        Console.WriteLine(Program.MyValue); //This line print 0 (defoult value of int variables)and its normal 
        Program.MyValue = 10; //after calling the Set accssor we will see that
        Console.WriteLine(Program.MyValue); //The result is 5
        Console.ReadLine();
    }

это какая-то полезная или особенная вещь?или это может быть техника инициализации свойства?заранее спасибо.

РЕДАКТИРОВАТЬ: Кажется, что здесь у нас есть Readonly Свойство со значением defoult я прав?

Ответы [ 5 ]

2 голосов
/ 28 июля 2011

set-accessor - это не что иное, как метод с параметром, параметром "value". Это зависит от метода, что он делает, а что нет.

void Set__MyValue(int value){
  _value=5;
}
1 голос
/ 28 июля 2011

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

Хотя ваш пример надуман, есть множество ситуаций, в которых имеет смысл игнорировать переданный value.Например, предположим, что вы хотели убедиться, что конкретное свойство string никогда не было равно нулю.Вы можете сделать что-то вроде этого:

private string _myProp = string.Empty;
public string MyProp
{
    get
    {
        return _myProp;
    }
    set
    {
        if (value == null)
        {
            _myProp = string.Empty;
            return;
        }

        _myProp = value;
    }
}

Мы игнорируем value, если хотим, и не делаем иначе.

1 голос
/ 28 июля 2011

Код действительный C #, поэтому не вызовет ошибок или предупреждений.

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

0 голосов
/ 28 июля 2011

Этот код довольно действителен и может быть полезен в некоторых случаях. Если вам кажется, что вы хотите поднять команду события / WPF при изменении _value, запишите эту информацию, делайте там любые другие важные для вас вещи. При таком типе управления установка _value напрямую вызовет «тихое» назначение, установка этого _value через свойство может вызвать уведомления.

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

С уважением.

0 голосов
/ 28 июля 2011

Свойство будет преобразовано как 2 различных метода в IL (один для установки значения, а другой - для возврата значения), и игнорирование параметра допустимо в методе!

Вы можете проверить это с помощью инструмента ildasm.exe (который поставляется с Visual Studio).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...