Автореализованное свойство действительно ли только для чтения возможно?

Я нашел тему на MSDN, который говорит, что да, это возможно.

Я сделал тест, который, кажется, повреждает этот оператор:

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo f = new Foo("1");
            Console.WriteLine(f.Bar); // prints 1
            f.Test("2");
            Console.WriteLine(f.Bar);// successfully prints 2
        }
    }

    class Foo
    {
        public Foo(string b)
        {
            this.Bar = b;
        }

        public string Bar { get; private set; }

        public void Test(string b)
        {
            // this would be impossible for readonly field!
            // next error would be occur: CS0191 or CS0191
            // A readonly field cannot be assigned to (except in a constructor or a variable initializer)
            this.Bar = b; 
        }
    }
}

Где я неправильно?

59
задан Mark Byers 15 August 2010 в 00:12
поделиться

5 ответов

Ответ ниже был написан еще в 2010 году.В C # 6 (выпущенном в 2015 году) вы можете записывать автоматически реализуемые свойства только для чтения:

// This can only be assigned to in a constructor
public int Foo { get; }

Вы абсолютно правы. Правильно реализуемые автоматически только для чтения свойства в настоящее время невозможны. Сделать установщик приватным - это не одно и то же, что бы ни говорили некоторые книги и MSDN:)

Если бы я правил миром, этого не было бы. Когда я вижу некоторых языковых дизайнеров на NDC 2010 в июне (пожалуйста, приходите!), Я намереваюсь попытаться убедить, подкупить, уговорить себя и вообще досадить до тех пор, пока они не согласятся. В конце концов, это всего лишь одна тонкая функция.

Глядя на эту статью MSDN, в самом тексте не говорится, что она создает автоматическое свойство только для чтения. Он создает неизменяемый тип , используя автоматическое свойство, и это правильно. Единственные проблемные места - это комментарии

// Read-only properties.

... которые определенно неверны. Фреймворк с нами согласен:

var prop = typeof(Contact).GetProperty("Name");
Console.WriteLine(prop.CanWrite); // Prints True
100
ответ дан 24 November 2019 в 18:18
поделиться

Это сбивает с толку. Вы должны отличать доступный только для чтения C # readonly (что означает ключевое слово).

  • только для чтения: они означают, что никто снаружи не может писать в него напрямую, а только читать.
  • C # только для чтения : вы можете писать в него только в конструкторе, и никогда больше.
6
ответ дан 24 November 2019 в 18:18
поделиться

Свойство доступно только для чтения вне класса Foo . Я думаю, это то, о чем идет речь в статье.

Но это не то же самое, что пометить переменную ключевым словом readonly .

8
ответ дан 24 November 2019 в 18:18
поделиться

Частный набор - это не то же самое, что только для чтения .

Подобно методам или полям, ключевое слово private делает видимость установщика доступной только самому классу. Другие объекты не могут использовать сеттер, но методы самого класса могут вызывать его свободно. Следовательно, ваш тестовый код компилируется и работает нормально.

Внешним объектам оно представляется как свойство только для чтения , но не только для чтения в истинном определении.

1
ответ дан 24 November 2019 в 18:18
поделиться

Нет, невозможно сделать автореализованное свойство доступным только для чтения. Для страницы, на которую вы ссылались:

для автореализованных свойств требуется аксессор get и set

Свойство только для чтения не имеет аксессора set.

Свойство без аксессора set считается доступным только для чтения

4
ответ дан 24 November 2019 в 18:18
поделиться
Другие вопросы по тегам:

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