IT Share you

읽기 전용 자동 구현 속성이 가능합니까?

shareyou 2020. 12. 7. 21:12
반응형

읽기 전용 자동 구현 속성이 가능합니까?


나는 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; 
        }
    }
}

내가 어디에서 틀렸어?


아래 답변은 2010 년에 작성되었습니다. C # 6 (2015 년 출시)에서는 읽기 전용 자동 구현 속성을 작성할 있습니다.

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

당신이 절대적으로 옳습니다. 적절하게 읽기 전용으로 자동 구현 된 속성은 현재 불가능합니다. 세터를 비공개로 설정하는 것은 일부 책과 MSDN의 내용에 관계없이 동일하지 않습니다. :)

내가 세상을 다스렸다면 그렇지 않을 것입니다. 6 월 NDC 2010 에서 언어 디자이너들 중 일부를 만나면 (동의 해주세요!) 저는 그들이 동의 할 때까지 제 자신을 설득하고, 뇌물을주고, 속이고, 일반적으로 귀찮게 만들려고합니다. 결국 이것은 웨이퍼처럼 얇은 기능 일뿐 입니다.

MSDN 기사를 보면 텍스트 자체는 읽기 전용 자동 속성을 생성한다고 말하지 않습니다. 자동 속성을 사용하여 불변 유형 생성하며 맞습니다. 문제가되는 부분은

// Read-only properties.

... 확실히 틀 렸습니다. 프레임 워크는 다음 사항에 동의합니다.

var prop = typeof(Contact).GetProperty("Name");
Console.WriteLine(prop.CanWrite); // Prints True

이 속성은 Foo클래스 외부에서 읽기 전용 입니다. 나는 그것이 기사가 얻는 것이라고 생각합니다.

But it's not the same as marking a variable with the readonly keyword.


It's confusing. You should differentiate read-only to the c# readonly (what the keyword means).

  • read-only: they mean that no one outside can write to it directly, only read.
  • C# readonly: you can only write to it in the constructor, then never more.

No, it's not possible to make an auto-implemented property readonly. For the page you linked:

with auto-implemented properties, both a get and set accessor are required

A read-only property has NO set accessor.

A property without a set accessor is considered read-only


The ReadOnly keyword, in C# and VB, do the same thing when applied to a field. They make it so that field is only assignable during static initialization (if it is marked as a static/shared field) or during the constructor.

C# does not utilize the readonly keyword for anything else.

The ReadOnly keyword in VB takes on a different meaning when applied to a Property. In this case, it simply means that there is no acceptable way to assign to the Public property (internally, the backing field can be modified other internal code, of course).


It is not possible to create a readonly auto-implemented property. If you try to compile a class with an auto-implemented property you will get this error if it doesn't have both get and set:

'ProjectName.ClassName.Property.get' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.

With the sentence begining with 'Automatically' being the part of the error we are concerned with.


Private set is not the same as readonly.

Similar to methods or fields, the private keyword makes the visibility of the setter available to only the class itself. Other objects cannot use the setter, but methods of the class itself can call it freely. Hence your test code compiles and works fine.

It appears to external objects as a readonly property, but it isn't read-only in the true definition.

참고URL : https://stackoverflow.com/questions/2480503/is-read-only-auto-implemented-property-possible

반응형