c# - একটি ক্ষেত্রকে সি-তে পাঠ্য হিসাবে চিহ্নিত করার সুবিধা কী?




readonly (10)

একটি সদস্য পরিবর্তনশীল শুধুমাত্র পড়া হিসাবে ঘোষিত থাকার সুবিধা কি কি? এটি কি কেবল শ্রেণীর জীবনযাত্রার সময় পরিবর্তনকারীর বিরুদ্ধে রক্ষা করছে নাকি এই শব্দটির কারণে কোনও কম্পাইলার গতির উন্নতি আছে


WPF এ একটি পারফরম্যান্স সুবিধা হতে পারে, এটি ব্যয়বহুল নির্ভরতা প্রোপার্টিগুলির প্রয়োজনগুলি সরিয়ে দেয়। এই সংগ্রহে সঙ্গে বিশেষভাবে দরকারী হতে পারে


আমি একটি পঠনযোগ্য ক্ষেত্র ব্যবহার করে কোনো কর্মক্ষমতা লাভ আছে বিশ্বাস করি না। বস্তুটি সম্পূর্ণরূপে একবার তৈরি হওয়ার পরে এটি কেবলমাত্র একটি চেক, এটি ক্ষেত্রটিকে একটি নতুন মানের দিকে নির্দেশ করা যাবে না।

তবে "পঠনযোগ্য" অন্যান্য ধরনের পাঠ্য-কেবল সেম্যান্টিক থেকে খুব ভিন্ন কারণ এটি CLR দ্বারা রানটাইম এ প্রয়োগ করা হয়। পঠনযোগ্য শব্দটি .initonly পর্যন্ত সংকলন করে যা CLR দ্বারা যাচাইযোগ্য।

এই শব্দটির প্রকৃত সুবিধা অপরিবর্তনীয় তথ্য কাঠামো তৈরি করা। সংজ্ঞা দ্বারা অপ্রচলিত তথ্য কাঠামো একবার নির্মাণ করা যাবে না। এটি রানটাইম-এ একটি কাঠামোর আচরণ সম্পর্কে যুক্তিযুক্ত করে তোলে। উদাহরণস্বরূপ, কোডের অন্য র্যান্ডম অংশে একটি অপ্রয়োজনীয় গঠন পাস করার কোনও বিপদ নেই। তারা এটি কখনও পরিবর্তন করতে পারে না তাই আপনি সেই কাঠামোর বিরুদ্ধে বিশ্বস্তভাবে প্রোগ্রাম করতে পারেন।

এখানে অপূর্ণতা বেনিফিট এক সম্পর্কে একটি ভাল এন্ট্রি: Threading


খুব বাস্তব পদে এটা করা:

যদি আপনি dll A এবং dll B রেফারেন্সগুলির মধ্যে একটি সংখ্যার ব্যবহার করেন, তবে এটি যে কনস্টের মানটি dll B. এ সংকলিত করা হবে। আপনি যদি সেই সংখ্যার জন্য একটি নতুন মান দিয়ে dll A পুনর্নির্মাণ করেন তবে ডিল বি এখনও মূল মানটি ব্যবহার করবে।

যদি আপনি কেবলমাত্র পড়তে dll A এবং Dll B রেফারেন্সগুলি ব্যবহার করেন তবে এটি কেবল পঠনযোগ্য সময়েই দেখানো হবে। এর মানে হল যে আপনি যদি শুধুমাত্র পাঠযোগ্যতার জন্য একটি নতুন মান সহ dll A পুনর্নির্মাণ করেন, তবে DL B সেই নতুন মানটি ব্যবহার করবে।


পঠনযোগ্যভাবে চিহ্নিতকরণের আরেকটি আকর্ষণীয় অংশ সিঙ্গল্টনে শুরু থেকে ক্ষেত্র রক্ষা করতে পারে।

উদাহরণস্বরূপ csharpindepth থেকে কোড:

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}

পঠনযোগ্যভাবে দুইবার সূচনা করা থেকে ক্ষেত্র Singleton রক্ষা করার ভূমিকা পালন করে। আরেকটি বিস্তারিত যে উল্লেখ করা দৃশ্যকল্প জন্য আপনি কনস্টেবল ব্যবহার করতে পারেন না কারণ সংকলন সময় কম্পন বাহিনী সৃষ্টি, কিন্তু এককোন রান রান সময় সৃষ্টি করে।


বিস্ময়করভাবে, পঠনযোগ্যভাবে ধীরে ধীরে ধীরে ধীরে কোড আসতে পারে, যেমন Jon Skeet তার নোড টাইম লাইব্রেরি পরীক্ষার সময় পাওয়া যায়। এই ক্ষেত্রে, 20 সেকেন্ডের মধ্যে স্থাপিত একটি পরীক্ষা শুধুমাত্র পাঠ্য অপসারণের পরে মাত্র 4 সেকেন্ড সময় নেয়।

https://codeblog.jonskeet.uk/2014/07/16/micro-optimization-the-surprising-inefficiency-of-readonly-fields/


ব্যক্তিগত readonly অ্যারে সঙ্গে সতর্ক থাকুন। যদি এটি কোনও ক্লায়েন্টকে কোনও বস্তু হিসাবে উন্মুক্ত করে (আপনি যা করতে পারেন তা হিসাবে আপনি COM ইন্টারপের জন্য এটি করতে পারেন) ক্লায়েন্ট অ্যারের মানগুলি ম্যানিপুলেট করতে পারে। একটি বস্তু হিসাবে একটি অ্যারে ফিরে যখন ক্লোন () পদ্ধতি ব্যবহার করুন।


যদি আপনার পূর্ব নির্ধারিত বা পূর্বনির্ধারিত মান থাকে যা প্রোগ্রামের বাইরে একই রকম থাকা দরকার তবে আপনাকে ধ্রুবক ব্যবহার করা উচিত তবে যদি আপনার কাছে এমন মান থাকে যা রানটাইম এ সরবরাহ করা প্রয়োজন তবে একবার প্রোগ্রামটি জুড়ে একইভাবে থাকা উচিত শুধুমাত্র পাঠযোগ্য. উদাহরণস্বরূপ, যদি আপনি প্রোগ্রামের শুরু সময়টি বরাদ্দ করতে চান বা আপনাকে অবজেক্ট প্রারম্ভে ব্যবহারকারী প্রদত্ত মানটি সংরক্ষণ করতে হয় এবং আপনাকে কেবলমাত্র পরিবর্তনের জন্য ব্যবহার করা উচিত তা থেকে আপনাকে এটি আরও সীমিত করতে হবে।


readonly ঘোষণায় প্রাথমিকভাবে শুরু করা যেতে পারে অথবা শুধুমাত্র কনস্ট্রাক্টর থেকে এটির মূল্য পেতে পারে। const মতই এটি একই সময়ে শুরু এবং ঘোষণা করা উচিত। readonly সবকিছু আছে const , প্লাস কন্সট্রাকটর প্রাথমিককরণ

কোড https://repl.it/HvRU/1

using System;

class MainClass {
    public static void Main (string[] args) {

        Console.WriteLine(new Test().c);
        Console.WriteLine(new Test("Constructor").c);
        Console.WriteLine(new Test().ChangeC()); //Error A readonly field 
        // `MainClass.Test.c' cannot be assigned to (except in a constructor or a 
        // variable initializer)
    }


    public class Test {
        public readonly string c = "Hello World";
        public Test() {

        }

        public Test(string val) {
          c = val;
        }

        public string ChangeC() {
            c = "Method";
            return c ;
        }
    }
}

readonly শব্দটি একটি সদস্য পরিবর্তনশীল একটি ধ্রুবক ঘোষণা করার জন্য ব্যবহৃত হয়, কিন্তু মান রানটাইম গণনা করা যাবে। এটি কম সংশোধনকারীর সাথে ঘোষিত একটি ধ্রুবক থেকে পৃথক, যা কম্পাইল সময়তে তার মান সেট থাকা আবশ্যক। readonly ব্যবহার করে আপনি readonly ক্ষেত্রে ক্ষেত্রটির মান নির্ধারণ করতে পারেন, অথবা বস্তুর কন্সট্রকটারে ক্ষেত্রটি সদস্য হতে পারেন।

যদি আপনি ধ্রুবক রেফারেন্স যে বাইরের DLLs recompile করতে চান না এটি ব্যবহার করুন (এটি কম্পাইল সময় প্রতিস্থাপিত হয়, যেহেতু)।


এই প্রশ্নের উত্তর দিতে একটি মৌলিক দৃষ্টিভঙ্গি যোগ করা হচ্ছে:

বৈশিষ্ট্যাবলী set অপারেটর থেকে বেরিয়ে পড়ার মাধ্যমে পাঠ্য হিসাবে প্রকাশ করা যেতে পারে। তাই বেশিরভাগ ক্ষেত্রেই আপনাকে readonly যুক্ত করতে হবে না:

public int Foo { get; }  // a readonly property

এর বিপরীতে: ফিল্ডগুলিকে অনুরূপ প্রভাব অর্জন করতে readonly শব্দটি প্রয়োজন:

public readonly int Foo; // a readonly field

সুতরাং, একটি ক্ষেত্রকে readonly হিসাবে চিহ্নিত করার একটি সুবিধা, set অপারেটর ছাড়া কোনও সম্পত্তি হিসাবে একই লেখার সুরক্ষা স্তর অর্জন করতে পারে - যদি কোনও কারণে, কোনও কারণে, কোনও কারণে এটির ক্ষেত্র পরিবর্তন না করে।





readonly