سؤال

بعد مناقشة ودية مع زميل حول هذا الموضوع.لدينا بعض الأفكار حول هذا الموضوع ، ولكن أتساءل ما إذا الحشد يفكر في هذا ؟

هل كانت مفيدة؟

المحلول

وأحد الأسباب هو عدم وجود دعم CLR لمحلية للقراءة فقط. للقراءة فقط وترجمتها إلى CLR / CLI initonly شفرة التشغيل. هذا العلم يمكن تطبيقه فقط على الحقول وليس له معنى لمحلية. في الواقع، تطبيقه على المستوى المحلي من المرجح أن تنتج كود التحقق منها.

وهذا لا يعني أن C # لا يستطيع أن يفعل هذا. ولكن من شأنه أن يعطي معنيين مختلفين لبناء نفس لغة. ان النسخة للسكان المحليين ليس لديهم خرائط CLR ما يعادلها.

نصائح أخرى

واعتقد انها سوء الحكم على جزء من C # المهندسين المعماريين. معدل قراءة فقط على المتغيرات المحلية يساعد في الحفاظ على صحة برنامج (مثلما يؤكد) ويحتمل أن يساعد رمز مترجم الأمثل (على الأقل في حالة لغات أخرى). حقيقة أن انها غير مسموح بها في C # الآن، هو حجة أخرى أن بعض "ميزات" من C # هي مجرد تطبيق أسلوب الترميز شخصية مؤسسيها.

والتصدي للإجابة جاريد، فإنه من المحتمل أن يكون لديك لمجرد أن يكون ميزة وقت الترجمة - أن المترجم تمنعك من الكتابة إلى متغير بعد الإعلان الأولي (والتي يجب أن تشمل مهمة)

هل يمكنني رؤية قيمة في هذا؟ يحتمل أن تكون - ولكن ليس كثيرا، لنكون صادقين. إذا كنت لا أستطيع أن أقول بسهولة أم لا متغير سوف يتم تعيين أي مكان آخر في الأسلوب، ثم الأسلوب الخاص بك هو طويل جدا.

لما يستحق، جافا هذه الميزة (باستخدام معدل final) ولقد <م> جدا نادرا ما ينظر إليه المستخدمة غير في الحالات التي يكون فيها <م> لديه أن تكون تستخدم للسماح المتغير إلى أن استولت عليها طبقة داخلية مجهولة - وأين <م> هو المستخدمة، مما يعطيني انطباع من الفوضى بدلا من معلومات مفيدة

اقتراح للقراءة فقط السكان المحليين و المعلمات بالنسبة لفترة وجيزة ناقش C# 7 فريق التصميم.من C# تصميم الاجتماع ملاحظات Jan 21, 2015:

المعلمات السكان المحليين يمكن التقاطها بواسطة lambdas وبالتالي الوصول إليها في وقت واحد ، ولكن ليس هناك طريقة لحمايتهم من المشترك المتبادل قضايا الدول:فإنها لا يمكن أن تكون للقراءة فقط.

بشكل عام, معظم المعلمات العديد من السكان المحليين لم يقصد أن يكون تعيينها بعد الحصول على القيمة الأولية.مما يسمح للقراءة فقط عليها أن تعبر عن ذلك القصد واضح.

مشكلة واحدة هي أن هذه الميزة قد تكون "جذابة إزعاج".في حين أن "الصواب" إلى ما يقرب من يكون دائما لجعل المعلمات المحليين للقراءة فقط ، سيكون فوضى رمز كبير للقيام بذلك.

فكرة جزئيا في التخفيف من هذا هو السماح مزيج للقراءة فقط فار على متغير محلي يتم التعاقد على فال أو شيء قصير كهذا.عموما نحن يمكن أن تحاول مجرد التفكير في أقصر الكلمة من تأسيس للقراءة فقط للتعبير عن للقراءة فقط نيس.

يستمر النقاش في لغة C# تصميم الريبو.التصويت على اظهار الدعم الخاص بك. https://github.com/dotnet/csharplang/issues/188

وكنت أن زميل العمل وأنها ليست ودية! (مجرد مزاح)

وأود أن لا يلغي ميزة لأنه من الأفضل أن تكتب طرق قصيرة. انها قليلا مثل قوله يجب عدم استخدام المواضيع لأنهم الثابت. أعطني سكينا واسمحوا لي أن أكون مسؤولا لعدم قطع نفسي.

وشخصيا، كنت أريد آخر "فار" نوع الكلمة مثل "الجرد" (invarient) أو "rvar" لتجنب الفوضى. لقد تم دراسة F # في الآونة الأخيرة، والعثور على شيء غير قابل للتغيير جذابة.

ولم يعرف كان جافا هذا.

أود المحلية للقراءة فقط المتغيرات في نفس الطريقة كما أحب المحلية const المتغيرات.ولكن لديها أقل أولوية من المواضيع الأخرى.
ربما الأولوية هو نفس سبب C# المصممين لا (حتى الآن!) تنفيذ هذه الميزة.ولكن ينبغي أن يكون من السهل (و متوافق) لدعم المحلي للقراءة فقط المتغيرات في الإصدارات المستقبلية.

وإنه لرقابة لمصمم لغة C #. F # ديه فال الكلمة، ويستند على CLR. ليس هناك من سبب C # لا يمكن أن يكون ميزة اللغة نفسها.

وقراءة فقط تعني المكان الوحيد يمكن تعيين متغير مثيل في منشئ. عندما يعلن متغير محليا لم يكن لديك مثيل (انها مجرد النطاق)، وأنه لا يمكن لمسها من قبل المنشئ.

وأنا أعلم، وهذا لا يجيب على ماذا على سؤالك. على أي حال، هذه قراءة هذا السؤال قد نقدر رمز أدناه مع ذلك.

إذا كنت تشعر بالقلق حقا مع اطلاق النار نفسك في القدم عندما تجاوز متغير محلي أن يجب تعيين مرة واحدة فقط، وكنت لا تريد أن تجعل من متغير للوصول بشكل أفضل على الصعيد العالمي، هل يمكن أن تفعل شيئا من هذا القبيل.

    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 #، إذا كنت تستخدم csi مترجم تفاعلية C #:

>"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)

ويمكنك أيضا بتعريف المتغيرات المحلية للقراءة فقط في الشكل النصي .csx.

وج # بالفعل فار للقراءة فقط، وإن كان ذلك في جملة مختلفة بعض الشيء:

والنظر في السطور التالية:

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();

وباعتراف الجميع، والحل الأول ربما يمكن أن يكون أقل الرمز إلى الكتابة. لكن المقتطف 2ND سيجعل للقراءة فقط وضوحا، عند الإشارة إلى المتغير.

وأعتقد أن هذا بسبب وظيفة له المتغير للقراءة فقط لا يجوز أبدا أن يسمى، وهناك ربما شيئا حيال ذلك الخروج من نطاق، وعندما كنت في حاجة إليها؟

واستخدام const الكلمة لجعل قراءة متغير فقط.

وإشارة: https://docs.microsoft كوم / EN-US / DOTNET / CSHARP / لغة الإشارة / كلمات / CONST

public class SealedTest
{
    static void Main()
    {
        const int c = 707;
        Console.WriteLine("My local constant = {0}", c);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top