문제

이에 대해 동료와 친근한 토론을하고 있습니다. 우리는 이것에 대한 생각이 있지만, 그렇게 군중이 이것에 대해 어떻게 생각하는지 궁금합니다.

도움이 되었습니까?

해결책

한 가지 이유는 Readonly Local에 대한 CLR 지원이 없기 때문입니다. ReadOnly는 CLR/CLI Initonly Opcode로 변환됩니다. 이 플래그는 필드에만 적용될 수 있으며 현지인에게는 의미가 없습니다. 실제로 로컬에 적용하면 검증 할 수없는 코드가 생성 될 수 있습니다.

그렇다고 C#이 이것을 할 수 없다는 의미는 아닙니다. 그러나 그것은 동일한 언어 구성에 대해 두 가지 다른 의미를 줄 것입니다. 현지인의 버전에는 CLR 등가 매핑이 없습니다.

다른 팁

C# Architects의 일부에 대한 판단력이 좋지 않다고 생각합니다. 로컬 변수에 대한 Readonly 수정자는 프로그램 정확성을 유지하는 데 도움이되며 (어설 싱트와 마찬가지로) 컴파일러가 코드를 최적화하는 데 도움이 될 수 있습니다 (적어도 다른 언어의 경우). 그것이 지금 C#에서 허용되지 않았다는 사실은 C#의 "특징"중 일부가 단지 제작자의 개인 코딩 스타일의 시행이라는 또 다른 주장입니다.

Jared의 답변을 다루면 아마도 컴파일 타임 기능이어야 할 것입니다. 컴파일러는 초기 선언 후 (할당을 포함 해야하는) 초기 선언 후 변수에 쓰는 것을 금지합니다.

이것에서 가치를 볼 수 있습니까? 잠재적으로 - 그러나 많은 것은 아닙니다. 정직합니다. 변수가 메소드의 다른 곳에 할당 될지 쉽게 알 수 없다면 메소드가 너무 길다.

가치가있는 것에 대해 Java는이 기능을 가지고 있습니다 (사용 final 수정 자) 그리고 나는 매우 그것이 어디에 사용되는지가 아닌 경우는 거의 보이지 않습니다. 가지다 변수를 익명의 내부 클래스로 캡처 할 수 있도록 사용됩니다. ~이다 사용하면 유용한 정보보다는 혼란에 대한 인상을줍니다.

제안 현지인과 매개 변수 C# 7 디자인 팀은 간단히 논의했습니다. 에서 C# 2015 년 1 월 21 일 디자인 회의 노트:

매개 변수와 현지인은 Lambdas에 의해 포착 될 수 있으므로 동시에 접근 할 수 있지만, 공유 된 주류 문제로부터이를 보호 할 수있는 방법은 없습니다.

일반적으로 대부분의 매개 변수와 많은 현지인들은 초기 가치를 얻은 후에는 할당되지 않습니다. 그들에게 준비를 허용하면 그 의도를 명확하게 표현할 수 있습니다.

한 가지 문제는이 기능이 "매력적인 성가신"일 수 있다는 것입니다. "올바른 일"은 거의 항상 매개 변수와 현지인을 읽을 수있는 것이지만, 코드를 크게 혼란스럽게 할 것입니다.

이것을 부분적으로 완화시키는 아이디어는 로컬 변수의 readonly var가 Val에 계약되거나 그와 비슷한 짧은 것을 허용하는 것입니다. 보다 일반적으로 우리는 기독교인보다 더 짧은 키워드를 단순히 생각할 수 있습니다.

C# Language Design Repo에서 토론이 계속됩니다. 귀하의 지원을 보여주기 위해 투표하십시오. https://github.com/dotnet/csharplang/issues/188

나는 그 동료 였고 친절하지 않았습니다! (농담)

짧은 방법을 작성하는 것이 좋습니다. 스레드가 어렵 기 때문에 사용해서는 안된다고 말하는 것과 비슷합니다. 나에게 칼을주고 나 자신을 자르지 않는 책임을 맡게 해주세요.

개인적으로, 나는 "inv"(무비) 또는 "rvar"와 같은 또 다른 "var"유형 키워드를 원했습니다. 나는 늦게 F#을 공부해 왔으며 불변의 일이 매력적입니다.

Java가 이것을 가지고 있다는 것을 결코 알지 못했습니다.

나는 현지인을 원합니다 준비 적 내가 로컬을 좋아하는 것과 같은 방식으로 변수 Const 변수. 그러나 다른 주제보다 우선 순위가 적습니다.
아마도 우선 순위 C# 디자이너가 그렇지 않은 것과 같은 이유입니다. (아직!) 이 기능을 구현하십시오. 그러나 향후 버전의 로컬 리드 폰리 변수를 지원하는 것은 쉽고 뒤로 호환됩니다.

C# 언어 디자이너에게는 감독입니다. F#에는 VAL 키워드가 있으며 CLR을 기반으로합니다. C#이 동일한 언어 기능을 가질 수없는 이유는 없습니다.

ReadOnly는 인스턴스 변수를 설정할 수있는 유일한 장소가 생성자에 있습니다. 로컬로 변수를 선언 할 때 인스턴스가 없으며 (범위에 불과 함) 생성자가 만질 수 없습니다.

나는 이것이 당신의 질문에 대한 이유에 대답하지 않습니다. 어쨌든,이 질문을 읽는 사람들은 그럼에도 불구하고 아래의 코드에 감사 할 수 있습니다.

한 번만 설정 해야하는 로컬 변수를 무시할 때 발에서 자신을 촬영하는 데 실제로 관심이 있고, 더 전 세계적으로 액세스 가능한 변수로 만들고 싶지 않다면, 이와 같은 일을 할 수 있습니다.

    public class ReadOnly<T>
    {
        public T Value { get; private set; }

        public ReadOnly(T pValue)
        {
            Value = pValue;
        }

        public static bool operator ==(ReadOnly<T> pReadOnlyT, T pT)
        {
            if (object.ReferenceEquals(pReadOnlyT, null))
            {
                return object.ReferenceEquals(pT, null);
            }
            return (pReadOnlyT.Value.Equals(pT));
        }

        public static bool operator !=(ReadOnly<T> pReadOnlyT, T pT)
        {
            return !(pReadOnlyT == pT);
        }
    }

예제 사용 :

        var rInt = new ReadOnly<int>(5);
        if (rInt == 5)
        {
            //Int is 5 indeed
        }
        var copyValueOfInt = rInt.Value;
        //rInt.Value = 6; //Doesn't compile, setter is private

아마도 코드만큼 덜하지 않을 수도 있습니다 rvar rInt = 5 그러나 그것은 작동합니다.

C# 대화식 컴파일러를 사용하는 경우 C#에서 Readonly 로컬 변수를 선언 할 수 있습니다. csi:

>"C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe"
Microsoft (R) Visual C# Interactive Compiler version 1.3.1.60616
Copyright (C) Microsoft Corporation. All rights reserved.

Type "#help" for more information.
> readonly var message = "hello";
> message = "goodbye";
(1,1): error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)

또한 Readonly 로컬 변수를 선언 할 수도 있습니다 .csx 스크립트 형식.

C#은 이미 다소 다른 구문에도 불구하고 Readonly var를 이미 가지고 있습니다.

다음 줄을 고려하십시오.

var mutable = myImmutableCalculationMethod();
readonly var immutable = mutable; // not allowed in C# 8 and prior versions
return immutable;

비교 :

var mutable = myImmutableCalculationMethod();
string immutable() => mutable; // allowed in C# 7
return immutable();

틀림없이, 첫 번째 솔루션은 쓸 코드가 적을 수 있습니다. 그러나 두 번째 스 니펫은 변수를 참조 할 때 Readonly 명시 적으로 명시 적으로 만듭니다.

Readonly 변수를 가진 함수가 절대 호출되지 않을 수 있으며, 아마도 범위를 벗어나고 언제 필요한가?

사용 const 읽기 전용 변수를 만드는 키워드.

참조: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

public class SealedTest
{
    static void Main()
    {
        const int c = 707;
        Console.WriteLine("My local constant = {0}", c);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top