Как объявить и использовать свойства чтения / записи

Я только начал изучать C #, и в ответах на конкретный тест по следующему коду было упомянуто, что:

Установленное свойство для Tak отсутствует или неверно.

Код состоит из 2 классов.

Класс 1 с основными:

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            Takis obj = new Takis();

            obj.Val = 23.4;
            Console.WriteLine(obj.Val);
        }
    }
}

2 класс:

namespace ConsoleApplication6
{
    class Takis
    {
        double val;

        public double Val
        {
            get
            {
                return val;
            }
            set
            {
                val = 3.14;
            }
        }

        public Takis()
        {    
        }
    }
}

В Visual Studio я получаю НЕ ВСЕГДА следующее:

'ConsoleApplication6.vshost.exe' (CLR v4.0.30319: ConsoleApplication6.vshost.exe): загружен 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_32 \ System.Data \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Data .dll '. Пропущены символы загрузки. Модуль оптимизирован, включена опция отладчика «Только мой код». 'ConsoleApplication6.vshost.exe' (CLR v4.0.30319: ConsoleApplication6.vshost.exe): загружен 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Xml \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Xml .dll '. Пропущены символы загрузки. Модуль оптимизирован, включена опция отладчика «Только мой код». Поток 0x1610 завершился с кодом 259 (0x103). Поток 0x1638 завершился с кодом 0 (0x0). Поток 0x13f4 завершился с кодом 259 (0x103). 'ConsoleApplication6.vshost.exe' (CLR v4.0.30319: ConsoleApplication6.vshost.exe): загружен 'c: \ users \ stefanos \ documents \ visual studio 2013 \ Projects \ ConsoleApplication6 \ ConsoleApplication6 \ bin \ Debug \ ConsoleApplication6.exe'. Символы загружены. Поток 0x1480 завершился с кодом 259 (0x103). Поток 0x1498 завершился с кодом 259 (0x103).

Поскольку я действительно новичок в Visual Studio и в C # в целом, я был бы признателен, если бы кто-нибудь мог показать мне ошибку или объяснить мне, что не так.


person Stefanos Vakirtzis    schedule 16.12.2014    source источник
comment
msdn.microsoft.com/en-us/library/x9fsa0sw.aspx   -  person SLaks    schedule 17.12.2014
comment
метод set всегда устанавливает val равным 3,14 - это явно неверно   -  person pm100    schedule 17.12.2014
comment
Вывод, который вы цитируете, здесь не имеет значения. Похоже на типичное поведение.   -  person BartoszKP    schedule 17.12.2014
comment
Кроме того, для методов набора используйте «значение», чтобы фактически использовать любое значение, которое назначается для набора. set { val = value; }   -  person ryanyuyu    schedule 17.12.2014


Ответы (3)


set для свойства Val всегда устанавливает для свойства одно и то же значение. Вместо этого, скорее всего, следует установить для свойства значение, введенное пользователем:

set { val = value; }

В качестве альтернативы, если намерение заключалось в том, чтобы значение всегда было 3,14 (т. Е. Только для чтения), то установщик можно было бы удалить, и get вернет значение:

class Takis
{
    public double Val
    {
        get { return 3.14; }
    }

    public Takis()
    {    
    }
}
person Rufus L    schedule 16.12.2014
comment
Прежде всего, спасибо за уделенное время, Руфус. Просто уточнение. Если намерение заключалось в том, чтобы значение всегда было 3,14, код, который я предоставляю в своем первоначальном сообщении, неверен или просто неуместен? - person Stefanos Vakirtzis; 17.12.2014
comment
Немного и того, и другого: это неправильно, потому что, если пользователь никогда не пытается установить его, он будет «0», когда они его получат, и неуместным, потому что 1. вам не нужно поле поддержки (val) и 2. раскрытие set операции подразумевает, что вы разрешаете пользователю изменять значение, чего вы не делаете. - person Rufus L; 17.12.2014

Набор в вашем свойстве Val должен быть val = value; value в C # является ключевым словом, это значение, которое присваивается свойству с созданным экземпляром.

person Stephen    schedule 16.12.2014

Ваша собственность ведет себя не так, как обычно. Когда я устанавливаю значение 23,4, я ожидаю, что оно сохранится. В вашем случае вашему классу все равно, что установил я. Когда я что-то устанавливаю, что угодно, свойство будет 3.14.

Ваше свойство должно установить заданное значение (в данном случае 23,4). Вы можете сделать это с помощью valuekeyword:

    public double Val
    {
        get
        {
            return val;
        }

        set
        {
            val = value;
        }
    }
person nvoigt    schedule 16.12.2014