সি # তে কনস্ট্যান্ড এবং রিডোনলি এর মধ্যে পার্থক্য কী?


1361

সি # তে constএবং পার্থক্য কী readonly?

আপনি কখন অন্যটির উপরে ব্যবহার করবেন?


এই লিঙ্কটি খুঁজতে আমাকে বেশ কয়েকটি উত্তর দেখতে হয়েছিল তবে এটি একটি ভাল। এরিক লিপার্টস সি # তে অপরিবর্তনীয়তা গ্রহণ করবেন
ফ্রাঙ্ক ব্রাইস

2
@donstack, আসলে অনুযায়ী সি # টি উল্লেখ , একটি কেবল পঠনযোগ্য ক্ষেত্র বরাদ্দ ও ফিল্ড ঘোষণা এবং কন্সট্রাকটর মধ্যে একাধিক বার পুনরায় নির্ধারণ করা যেতে পারে।
মার্কস

উত্তর:


1289

এর আপাত পার্থক্য ছাড়াও

  • কোনও constভিএস readonlyমানগুলির সংজ্ঞা দেওয়ার সময় মানটি ঘোষণার সাথে সাথে গতিশীলভাবে গণনা করা যায় তবে কনস্ট্রাক্টরটি প্রস্থান করার আগে নির্ধারিত হওয়া দরকার ... তারপরে এটি হিমায়িত হয়।
  • 'কনস্ট্যান্টস স্পষ্টভাবে হয় static। আপনি ClassName.ConstantNameএগুলি অ্যাক্সেস করতে একটি স্বরলিপি ব্যবহার করুন।

একটি সূক্ষ্ম পার্থক্য আছে। একটি শ্রেণীর মধ্যে সংজ্ঞায়িত বিবেচনা করুন AssemblyA

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyBরেফারেন্স AssemblyAএবং কোড এই মান ব্যবহার করে। যখন এটি সংকলিত হয়,

  • constমানটির ক্ষেত্রে এটি অনুসন্ধান-প্রতিস্থাপনের মতো, মান 2 এর 'আইএল'তে বেকড হয় AssemblyB। এর অর্থ হ'ল আগামীকাল যদি আমি I_CONST_VALUEভবিষ্যতে 20 এ আপডেট করব । AssemblyBআমি এটি পুনরায় সংশোধন না করা পর্যন্ত এখনও 2 থাকবে
  • readonlyমানটির ক্ষেত্রে এটি refএকটি স্মৃতি অবস্থানের মতো is মানটি AssemblyBএর আইএল বেকড হয় না । এর অর্থ হ'ল মেমরির অবস্থানটি আপডেট করা AssemblyBহলে পুনঃসংশোধন ছাড়াই নতুন মান পায়। সুতরাং যদি I_RO_VALUE30 এ আপডেট হয় তবে আপনাকে কেবল তৈরি করতে হবে AssemblyA। সমস্ত ক্লায়েন্টদের পুনরায় সংযুক্ত করার দরকার নেই।

সুতরাং আপনি যদি আত্মবিশ্বাসী হন যে ধ্রুবকের মান ব্যবহার করে না const

public const int CM_IN_A_METER = 100;

তবে আপনার যদি এমন একটি ধ্রুবক থাকে যা পরিবর্তিত হতে পারে (যেমন: যথার্থতা) .. বা সন্দেহ হলে, এ ব্যবহার করুন readonly

public readonly float PI = 3.14;

আপডেট: আকুর একটি উল্লেখ কোজ পাওয়া দরকার যা তিনি প্রথমে এটি নির্দেশ করেছিলেন। আমি যেখানে শিখেছি সেখানে প্লাগ করতে হবে .. কার্যকর সি # - বিল ওয়াগনার


77
static- বিন্দু সবচেয়ে গুরুত্বপূর্ণ এবং দরকারী বিন্দু হবে বলে মনে হয়consts are implicitly static
LCJ

28
রেফারেন্স মানগুলির অংশটি সর্বাধিক গুরুত্বপূর্ণ। কনস্ট মানগুলি দূরে অপ্টিমাইজ করা যায়।
কোডিংবারফিল্ড

22
readonlyভেরিয়েবলগুলি কনস্ট্রাক্টরের (প্রতিবিম্ব) বাইরে পরিবর্তন করা যেতে পারে। এটি কেবলমাত্র সংকলক যা আপনাকে কনস্ট্রাক্টরের বাইরে ভেরি পরিবর্তন করতে বাধা দেওয়ার চেষ্টা করে।
বিটারব্লু

12
@ মিনি-মি readonlyভেরিয়েবলগুলি একবার প্রতিস্থাপনের মাধ্যমেও কনস্ট্রাক্টর শেষ হয়ে গেলে তার পরিবর্তন করার অনুমতি নেই। রানটাইম এটি প্রয়োগ না করার জন্য ঘটে। রানটাইমটি এমন পরিবর্তনও ঘটায় যাতে আপনি পরিবর্তন করেন string.Emptyনা "Hello, world!", তবে আমি এখনও দাবি করব না যে এটি string.Emptyপরিবর্তনযোগ্য করে তোলে , বা সেই কোডটি ধরে নেওয়া উচিত নয় যে string.Emptyসর্বদা শূন্য দৈর্ঘ্যের স্ট্রিং হবে।

7
blogs.msmvps.com/jonskeet/2014/07/16/… কেবল একটি মাত্র পড়ার জন্য ওভারহেড ব্যয় পড়ার জন্য আকর্ষণীয়
সিএডি ব্লাক

275

কনস্টেট সহ একটি গেটচা আছে! আপনি যদি অন্য কোনও সমাবেশ থেকে কোনও ধ্রুবক উল্লেখ করেন তবে এর মানটি কলিং অ্যাসেমব্লিতে ঠিকই সংকলিত হবে। আপনি যখন রেফারেন্সড অ্যাসেমব্লিতে ধ্রুবক আপডেট করেন তখন কলিং অ্যাসেমব্লিতে এটি পরিবর্তন হবে না!


8
সংশ্লেষণে (প্রতিচ্ছবি, আইএলএসপিএস, ..) স্থির কখনও কখনও যে কোনও একটি দ্বারা একই রেফারেন্স করা হয়, একই সমাবেশ বা অন্য কোনও সমাবেশ নয়, তাই আপনি সংকলিত কোডে ধ্রুবকটির ব্যবহারটি বিশ্লেষণ করতে পারবেন না।
বসন্তের 76

159

ধ্রুবক

  • ধ্রুবকগুলি ডিফল্টরূপে স্থির থাকে
  • সংকলন-সময়ে তাদের অবশ্যই মান থাকতে হবে (আপনার উদাহরণস্বরূপ 3.14 * 2 থাকতে পারে, তবে পদ্ধতিগুলি কল করতে পারবেন না)
  • ফাংশন মধ্যে ঘোষণা করা যেতে পারে
  • এগুলি ব্যবহার করে এমন প্রতিটি সমাবেশে অনুলিপি করা হয় (প্রতিটি সমাবেশ মানগুলির স্থানীয় কপি পায়)
  • গুণাবলী ব্যবহার করা যেতে পারে

কেবলমাত্র পাঠ্য উদাহরণ ক্ষেত্র

  • সময় নির্মাতার বাইরে যাওয়ার সময় অবশ্যই মান নির্ধারণ করতে হবে
  • উদাহরণ তৈরি করা হয় যখন মূল্যায়ন করা হয়

স্ট্যাটিক পঠন ক্ষেত্র

  • কোড প্রয়োগকারী শ্রেণি রেফারেন্সকে হিট করে যখন মূল্যায়ন করা হয় (যখন নতুন উদাহরণ তৈরি করা হয় বা কোনও স্থির পদ্ধতি কার্যকর করা হয়)
  • স্ট্যাটিক কনস্ট্রাক্টর হওয়ার সময়কালের মধ্যে একটি মূল্যায়ন করা মান অবশ্যই হবে
  • এগুলিতে থ্রেডস্ট্যাটিক অ্যাট্রিবিউট রাখার প্রস্তাব দেওয়া হয় না (স্থির নির্মাতারা কেবল একটি থ্রেডে কার্যকর করা হবে এবং এর থ্রেডের জন্য মান নির্ধারণ করবে; অন্য সমস্ত থ্রেডের এই মানটি অনির্বাচিত হবে)

58

কেবল যুক্ত করার জন্য, কেবলমাত্র রেফারেন্স কেবলমাত্র রেফারেন্সের জন্য রেফারেন্সটি কেবল পাঠ্যই মানগুলিকে নয়। উদাহরণ স্বরূপ:

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};

  public UpdateReadonly()
  {
     I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
     I_RO_VALUE = new char[]{'V'}; //will cause compiler error
  }
}

আপনি stringধ্রুবক হিসাবে ব্যবহার করতে পারেন যে ছাড়া অন্য কোন রেফারেন্স টাইপ আছে ?
বসন্তের 76

আপনার constস্ট্রিং ব্যতীত রেফারেন্স প্রকারের সাথে থাকতে পারে তবে ধ্রুবকের কেবল মান থাকতে পারে null
মাইক রোসফট

40

এটি এটি ব্যাখ্যা করে । সংক্ষিপ্ত বিবরণ: কনস্ট্রাকশন অবশ্যই ঘোষণার সময় শুরু করা উচিত, কেবলমাত্র কনস্ট্রাক্টরের উপর আরম্ভ করা যেতে পারে (এবং ব্যবহারকারীর উপর নির্ভর করে আলাদা মান থাকতে পারে)।

সম্পাদনা: সূক্ষ্ম পার্থক্যের জন্য উপরে গিশুর গোটচা দেখুন


32

const: কোথাও পরিবর্তন করা যায় না।

readonly: এই মানটি কেবলমাত্র নির্মাণকারীকেই পরিবর্তন করা যায়। সাধারণ ক্রিয়ায় পরিবর্তন করা যায় না।


26

কেবলমাত্র পঠনযোগ্য একটি ছোট গোটচা আছে। একটি পঠনক্ষেত্র ক্ষেত্রটি কনস্ট্রাক্টরের মধ্যে একাধিকবার সেট করা যায়। এমনকি মান দুটি পৃথক শৃঙ্খলযুক্ত নির্মাত্রে সেট করা থাকলেও এটি অনুমোদিত।


public class Sample {
    private readonly string ro;

    public Sample() {
        ro = "set";
    }

    public Sample(string value) : this() {
        ro = value; // this works even though it was set in the no-arg ctor
    }
}

26

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

public class MyClass
{
    public const double PI1 = 3.14159;
}

একটি readonlyসদস্য স্থির মতো যে এটি একটি অপরিবর্তনীয় মান উপস্থাপন করে। পার্থক্যটি হ'ল কোনও readonlyসদস্য রানটাইমের সময়, কনস্ট্রাক্টারে আরম্ভ করা যেতে পারে, পাশাপাশি তারা ঘোষণার সাথে সাথে আরম্ভ করাতে সক্ষম হয়।

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

const

  • তাদের হিসাবে ঘোষণা করা যায় না static (এগুলি স্পষ্টতই স্থির)
  • ধ্রুবকের মান সংকলন সময়ে মূল্যায়ন করা হয়
  • ধ্রুবকগুলি কেবলমাত্র ঘোষণায় শুরু হয়

শুধুমাত্র পাঠযোগ্য

  • তারা হয় উদাহরণ স্তরের বা স্থির হতে পারে
  • রান সময়টিতে মানটি মূল্যায়ন করা হয়
  • পঠনযোগ্য ঘোষণায় বা কনস্ট্রাক্টরের কোড দ্বারা প্রাথমিক করা যেতে পারে

6
তারা অচল হতে পারে না , তারা অচল। আপনার স্পষ্ট করে দেওয়া উচিত যদি আপনি বোঝাতে পারেনstatic const int i = 0;
নওফাল

আপনি ব্যাখ্যা constকরতে পারেন কেন অভ্যন্তরীণ পদ্ধতিতে ঘোষণা করা যায় না?
মিন ট্রান

21

একটি কনস্ট একটি সংকলন-সময় ধ্রুবক যেখানে পঠনযোগ্যভাবে রান-টাইমে একটি মান গণনা এবং কনস্ট্রাক্টর বা ফিল্ড ইনিশিয়ালাইজারে সেট করতে দেয়। সুতরাং, একটি 'কনস্ট' সর্বদা ধ্রুবক তবে কেবলমাত্র নিয়োগের পরে কেবল 'পঠনযোগ্য' কেবল পঠনযোগ্য।

সি # টিমের এরিক লিপার্টের বিভিন্ন ধরণের অপরিবর্তনীয়তা সম্পর্কে আরও তথ্য রয়েছে


15

এখানে অন্য লিঙ্কটি দেখানো হচ্ছে যে কনস্ট্যান্ট কীভাবে সংস্করণ নিরাপদ নয়, বা রেফারেন্স ধরণের জন্য প্রাসঙ্গিক।

সংক্ষিপ্তসার :

  • আপনার কনস্টের সম্পত্তিটির মানটি সংকলন সময়ে সেট করা হয়েছে এবং রানটাইমে পরিবর্তন করতে পারে না
  • কনস্টকে স্থিতিশীল হিসাবে চিহ্নিত করা যায় না - কীওয়ার্ডটি কেবলমাত্র পড়ার ক্ষেত্রগুলির তুলনায় এগুলি স্থিতিশীল বলে বোঝায়।
  • কনস্ট মান (আদিম) ধরণের ব্যতীত আর কিছু হতে পারে না
  • পঠনযোগ্য কীওয়ার্ডটি ক্ষেত্রটি অপরিবর্তনীয় হিসাবে চিহ্নিত করে। তবে শ্রেণি নির্মাতার ভিতরে সম্পত্তি পরিবর্তন করা যেতে পারে
  • কেবলমাত্র পঠনযোগ্য কীওয়ার্ডটিকে স্থির সাথে একত্রিত করা যেতে পারে যাতে এটি কনস্টের মতো (পৃষ্ঠে ন্যূনতম) কাজ করে। আপনি দুজনের মধ্যে আইএল তাকান যখন একটি চিহ্নিত পার্থক্য আছে
  • কনস্ট ক্ষেত্রগুলি আইএল-তে "আক্ষরিক" হিসাবে চিহ্নিত হয়েছে যখন পাঠ্যভাবে "আরম্ভ" হয়

11

কেবলমাত্র পঠনযোগ্য : রানটাইমের সময় কর্টারের মাধ্যমে মান পরিবর্তন করা যায়। তবে সদস্য ফাংশনের মাধ্যমে নয়

ধ্রুবক : স্থির স্থির দ্বারা। মান কোথাও থেকে পরিবর্তন করা যায় না (কর্টর, ফাংশন, রানটাইম ইত্যাদি কোন জায়গায় নেই)


আমাকে এই দুটি টু-অ্যাভওয়েজের জন্য 4 টি অনুচ্ছেদ পড়তে না দেওয়ার জন্য ধন্যবাদ ...
ডন চ্যাডেল

9

তবুও আরেকটি গোচা: পঠনযোগ্য মানগুলি প্রতিবিম্বের মাধ্যমে "বোকা" কোড দ্বারা পরিবর্তন করা যেতে পারে।

var fi = this.GetType()
             .BaseType
             .GetField("_someField", 
                       BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);

প্রতিবিম্ব ব্যবহার করে আমি কি সি # তে একটি ব্যক্তিগত পঠনযোগ্য উত্তরাধিকার সূত্রে পরিবর্তন করতে পারি?


6

আমি বিশ্বাস করি একটি constমান সমস্ত বস্তুর জন্য সমান (এবং এটি অবশ্যই আক্ষরিক প্রকাশের সাথে আরম্ভ করা উচিত), যেখানে readonlyপ্রতিটি ইনস্ট্যান্টেশনের জন্য আলাদা হতে পারে ...


5

আমাদের অফিসে দলের একজন সদস্য কন্সট, স্থিতিশীল এবং কেবলমাত্র পড়ার জন্য নিম্নলিখিত নির্দেশিকাটি সরবরাহ করেছিলেন:

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

একটি চূড়ান্ত নোট: একটি দৃ const় ক্ষেত্র স্থির, কিন্তু বিপরীতটি সত্য নয়।


1
আমি মনে করি আপনার অর্থ "কথোপকথন"। বিপরীতটি হবে "একটি অ-স্থির ক্ষেত্র স্থির নয়" " যা সত্য বা নাও হতে পারে। কনভার্স, "একটি স্ট্যাটিক ফিল্ড (সর্বদা) কনস্ট" সত্য নয়।
মাইকেল ব্ল্যাকবার্ন

5

এগুলি উভয়ই ধ্রুবক, তবে সংকলনের সময় একটি কনস্টও পাওয়া যায়। এর অর্থ হ'ল পার্থক্যের একটি দিক হ'ল আপনি কনস্ট্রিট কনস্ট্রাক্টরগুলিকে ইনপুট হিসাবে কনস্ট ভেরিয়েবল ব্যবহার করতে পারেন, তবে পঠনযোগ্য ভেরিয়েবলগুলি নয়।

উদাহরণ:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}

5
  • কখন ব্যবহার করবেন constবাreadonly

    • const

      • সংকলন-সময় ধ্রুবক: পরম ধ্রুবক, মান ঘোষণার সময় সেট করা হয়, আইএল কোডেই
    • readonly

      • রান-টাইম ধ্রুবক: কনফিগারেশন ফাইলের মাধ্যমে কনস্ট্রাক্টর / আরআইএস-এ সেট করা যেতে পারে App.config, তবে একবার এটি আরম্ভ করলে এটি পরিবর্তন করা যায় না

4

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

এছাড়াও, কনস্টের ভেরিয়েবলগুলি অন্তর্নিহিত স্থিতিশীল, যেখানে পঠনযোগ্য ভেরিয়েবলগুলি ইচ্ছা করলে নির্দিষ্টভাবে নির্দিষ্ট হতে পারে।


যোগ করা হয়েছে যে কনসেটগুলি দৃ # ়ভাবে # ডেফাইন ম্যাক্রো টাইপ করা হয় । অন্যথায়, আমরা সমস্ত সি বা সি ++ লোককে ভয় দেখাতে পারি। :-)
জেসন বেকার

4

const

  1. কনড কীওয়ার্ড ক্ষেত্র বা স্থানীয় ভেরিয়েবলগুলিতে প্রয়োগ করা যেতে পারে
  2. আমাদের ঘোষণার সময় কনট ফিল্ড বরাদ্দ করতে হবে
  3. কোনও মেমোরি বরাদ্দ করা হয়নি কারণ সংকলনের পরে কনট মানটি আইএল কোডেই এম্বেড করা আছে। এটি কনস্টেবল ভেরিয়েবলের সমস্ত উপস্থিতি সন্ধান করার মতো এবং এর মান দ্বারা প্রতিস্থাপন। তাই সংকলনের পরে আইএল কোডটিতে কনস্ট ভেরিয়েবলের জায়গায় হার্ড-কোডড মান থাকবে
  4. সি # তে কনস্ট্যান্ট ডিফল্ট স্থিতিশীল।
  5. মান সমস্ত বস্তুর জন্য ধ্রুবক
  6. Dll সংস্করণ সংক্রান্ত সমস্যা রয়েছে - এর অর্থ হ'ল আমরা যখনই কোনও পাবলিক কনস্ট ভেরিয়েবল বা সম্পত্তি পরিবর্তন করি (বাস্তবে এটি তাত্ত্বিকভাবে পরিবর্তিত হওয়ার কথা নয়), অন্য যে কোনও dll বা সমাবেশ যা এই ভেরিয়েবলটি ব্যবহার করে তা পুনর্নির্মাণ করতে হবে
  7. কেবল সি # অন্তর্নির্মিত ধরণের ধ্রুবক হিসাবে ঘোষণা করা যেতে পারে
  8. কনস্ট ফিল্ড রেফ বা আউট প্যারামিটার হিসাবে পাস করা যাবে না

শুধুমাত্র পাঠযোগ্য

  1. কেবলমাত্র পাঠ্য কীওয়ার্ড কেবল স্থানীয় ভেরিয়েবল নয় ক্ষেত্রগুলিতে প্রযোজ্য
  2. আমরা ঘোষণার সময় বা কনস্ট্রাক্টারে কেবল পাঠযোগ্য ক্ষেত্র নির্ধারণ করতে পারি, অন্য কোনও পদ্ধতিতে নয়।
  3. পঠনযোগ্য ক্ষেত্রগুলির জন্য গতিশীল মেমরি বরাদ্দ করা হয় এবং আমরা রান সময়ে মান পেতে পারি।
  4. পাঠ্য কেবল শ্রেণীর উদাহরণের মাধ্যমে এত অ্যাক্সেস করা অবজেক্টের অন্তর্ভুক্ত। এটি শ্রেণীর সদস্য করার জন্য আমাদের কেবল পঠনযোগ্যতার আগে স্ট্যাটিক কীওয়ার্ড যুক্ত করতে হবে।
  5. ব্যবহৃত কনস্ট্রাক্টরের উপর নির্ভর করে মানটি আলাদা হতে পারে (এটি শ্রেণীর অবজেক্টের সাথে সম্পর্কিত)
  6. যদি আপনি কোনও অ-আদিম প্রকার (রেফারেন্সের ধরণ) হিসাবে কেবলমাত্র পঠনযোগ্য রেফারেন্স হিসাবে ঘোষিত হন তবে এতে অন্তর্ভুক্ত অবজেক্টটি নয় not
  7. যেহেতু চলমান সময়ে মানটি পাওয়া যায়, কেবলমাত্র পঠনযোগ্য ক্ষেত্র / বৈশিষ্ট্যগুলির সাথে কোনও dll সংস্করণে সমস্যা নেই।
  8. আমরা কনস্ট্রাক্টর প্রসঙ্গে রিফ বা আউট প্যারামিটার হিসাবে কেবল পাঠ্য ক্ষেত্রটি পাস করতে পারি।

3

আরেকটা গোচা

যেহেতু কনস্টটি কেবলমাত্র বেসিক ডেটা ধরণের সাথে কাজ করে, আপনি যদি কোনও ক্লাসের সাথে কাজ করতে চান তবে আপনি কেবলমাত্র বাধ্য হয়ে পড়তে পারেন "পঠনযোগ্য" ব্যবহার করতে। তবে, ফাঁদ থেকে সাবধান! কেবলমাত্র পঠনের অর্থ হ'ল আপনি অন্য কোনও বস্তুর সাথে অবজেক্টটি প্রতিস্থাপন করতে পারবেন না (আপনি এটি অন্য কোনও বস্তুর সাথে উল্লেখ করতে পারবেন না)। তবে যে কোনও প্রক্রিয়াতে অবজেক্টের রেফারেন্স রয়েছে তা অবজেক্টের অভ্যন্তরের মানগুলি পরিবর্তন করতে পারে !

সুতরাং এমন চিন্তাভাবনায় বিভ্রান্ত হবেন না যে কেবলমাত্র পড়ুনই বোঝায় যে কোনও ব্যবহারকারী জিনিস পরিবর্তন করতে পারে না। কোনও শ্রেণীর অভ্যন্তরীণ মান পরিবর্তন হওয়া (যতদূর আমি জানি) থেকে কোনও প্রতিস্থাপন প্রতিরোধ করার জন্য সি # তে কোনও সাধারণ সিনট্যাক্স নেই।


হ্যাঁ এটি একটি সাধারণ থিম বেশি। যদি আপনার কাছে কেবল একটি অ্যারেলিস্ট প্রকাশের সম্পত্তি থাকে তবে আপনি এখনও অ্যারেলিস্টটি সংশোধন করতে পারেন। আপনি সেই সম্পত্তিটিতে আলাদা অ্যারেলিস্ট সেট করতে পারবেন না, তবে আপনি ব্যবহারকারীকে অ্যারেলিস্ট পরিবর্তন করতে বাধা দিতে পারবেন না।
গিশু

3

একটি constহতে হয়েছে হার্ড কোডেড , যেখানে যেমন readonlyকরা যায় কন্সট্রাকটর সেট ক্লাসের।


3

সি #। নেট এ কনস্ট এবং পঠনযোগ্য ক্ষেত্রগুলির মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে

কনস্টটি ডিফল্ট স্থিতিশীল এবং ধ্রুবক মান দিয়ে আরম্ভ করা দরকার, যা পরে আর সংশোধন করা যায় না। কনস্ট্রাক্টরগুলিতেও মান পরিবর্তনের অনুমতি নেই। এটি সমস্ত ডেটাটাইপ দিয়ে ব্যবহার করা যাবে না। প্রাক্তন তারিখের জন্য। এটি ডেটটাইম ডেটাটাইপ দিয়ে ব্যবহার করা যাবে না।

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public readonly string Name = string.Empty; //No error, legal

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

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

তারপরে কেবলমাত্র পাঠ্য ক্ষেত্রটি তাত্ক্ষণিক নির্দিষ্ট মানগুলির সাহায্যে সূচনা করা যেতে পারে:

A objOne = new A(5);
A objTwo = new A(10);

এখানে উদাহরণস্বরূপ পঠনযোগ্য ক্ষেত্রের মূল্য 5 এবং অজবটওয়ের 10 টি হবে যা কনস্ট ব্যবহার করা সম্ভব নয়।


2

একটি ধ্রুবকটি আক্ষরিক মান হিসাবে ভোক্তার মধ্যে সংকলিত হবে যখন স্থির স্ট্রিং সংজ্ঞায়িত মানটির রেফারেন্স হিসাবে কাজ করবে।

অনুশীলন হিসাবে, একটি বাহ্যিক গ্রন্থাগার তৈরি করার চেষ্টা করুন এবং এটি একটি কনসোল অ্যাপ্লিকেশনটিতে গ্রাস করুন, তারপরে গ্রন্থাগারের মানগুলি পরিবর্তন করুন এবং এটি পুনরায় কম্পাইল করুন (ভোক্তার প্রোগ্রামটি পুনরায় সংশোধন না করে) ডিরেক্টরিতে ডিএলএলটি ফেলে দিন এবং এক্সই ম্যানুয়ালি চালান, আপনার সন্ধান করা উচিত যে ধ্রুব স্ট্রিং পরিবর্তন হয় না।


আমি আন্তরিকভাবে সন্দেহ করি যে সত্য ... আমি যাব।
ljs

- আপনার C # এর উন্নত করতে 50 নির্দিষ্ট উপায়ে এক amazon.co.uk/Effective-Specific-Ways-Improve-Your/dp/0321245660/...
Russ ক্যাম


@ অ্যান্ড্রু হ্যারে - হ্যাঁ, আমি এখনই পরীক্ষা করেছি। আমি খুব অবাক, এটাই সত্যিকারের গোটাচা, আমি সত্যিই খুব আশ্চর্য হয়েছি, অবাক হয়েছি সেটাই ঘটনা ...!
ljs

আমি এখানে পয়েন্টার শব্দের ব্যবহার করতে আপত্তি করি। এটা একটা পয়েন্টার না, এটি একটি রেফারেন্স, এবং সেখানে হয় হিসাবে আপনি অনিরাপদ মোডে অপরিচালিত পয়েন্টার নিপূণভাবে পারবেন, সুতরাং এতে দুই মধ্যে পার্থক্য করা জরুরী C # এর মধ্যে একটি পার্থক্য।
ljs

2

ধ্রুব

সংজ্ঞা ক্ষেত্রটি যখন এটি সংজ্ঞায়িত করা হয় তখন আমাদের মান সরবরাহ করতে হবে। সংকলক এর পরে সমাবেশের মেটাডেটাতে ধ্রুবকের মান সংরক্ষণ করে। এর অর্থ হ'ল ধ্রুবককে কেবল আদিম ধরণের যেমন বুলিয়ান, চর, বাইট ইত্যাদির জন্য সংজ্ঞায়িত করা যায়। ধ্রুবকগুলি সর্বদা স্থির সদস্য হিসাবে বিবেচিত হয়, উদাহরণস্বরূপ সদস্য নয়।

শুধুমাত্র পাঠযোগ্য

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

উভয় সম্পর্কে আরও এই নিবন্ধে এখানে ব্যাখ্যা করা হয়েছে


1

প্রধানত; আপনি রানটাইমের সময় স্থিতিশীল পঠনযোগ্য ক্ষেত্রের একটি স্থির অ-ধ্রুবক মানকে একটি মূল্য নির্ধারণ করতে পারেন, যেখানে একটি কনস্টকে একটি ধ্রুবক মান নির্ধারণ করতে হয়।


1

কনস্ট এবং রিডোনলি একই রকম তবে এগুলি একেবারে এক নয়। কনস্টের ক্ষেত্রটি একটি সংকলন-সময় ধ্রুবক, যার অর্থ যে সংকলন-সময় সেই মানটি গণনা করা যায়। একটি পঠনক্ষেত্র ক্ষেত্র অতিরিক্ত পরিস্থিতি সক্ষম করে যাতে টাইপটি নির্মাণের সময় কিছু কোড চালানো উচিত। নির্মাণের পরে, কেবল পাঠযোগ্য ক্ষেত্রটি পরিবর্তন করা যায় না।

উদাহরণস্বরূপ, কনস্ট সদস্যরা সদস্যদের সংজ্ঞা হিসাবে ব্যবহার করতে পারেন:

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

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

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

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

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

এটি লক্ষণীয় আকর্ষণীয় যে কনস্টের সদস্যরা সর্বদা স্থির থাকে, তবে কেবলমাত্র নিয়মিত ক্ষেত্রের মতোই কেবল পাঠযোগ্য সদস্যরা স্থির হয় বা নাও হতে পারে।

এই দুটি উদ্দেশ্যে একটি একক কীওয়ার্ড ব্যবহার করা সম্ভব তবে এটি সংস্করণে সমস্যা বা পারফরম্যান্স সমস্যার কারণ হতে পারে। এক মুহুর্তের জন্য ধরে নিন যে আমরা এই (কনস্ট্যান্ট) জন্য একটি একক কীওয়ার্ড ব্যবহার করেছি এবং একজন বিকাশকারী লিখেছেন:

public class A
{
    public static const C = 0;
}

এবং অন্য বিকাশকারী কোড লিখেছেন যা এ:

public class B
{
    static void Main() {
        Console.WriteLine(A.C);
    }
}

এখন, উত্পন্ন কোডটি কি এসি একটি সংকলন-সময় ধ্রুবক এর উপর নির্ভর করতে পারে? অর্থাত, এসি ব্যবহারের ফলে কেবল 0 মানটি প্রতিস্থাপন করা যাবে? আপনি যদি এটিকে "হ্যাঁ" বলে থাকেন তবে তার অর্থ হ'ল এ এর ​​বিকাশকারী এসি শুরু করার উপায়টি পরিবর্তন করতে পারে না - এটি অনুমতি ছাড়াই এ এর ​​বিকাশকারীদের হাত বাঁধে। আপনি যদি এই প্রশ্নের "না" বলেন তবে একটি গুরুত্বপূর্ণ অপটিমাইজেশন মিস হয়ে গেছে। সম্ভবত এ এর ​​লেখক ইতিবাচক যে এসি সর্বদা শূন্য থাকবে। কনস্ট এবং পঠন উভয়ের ব্যবহার এ এর ​​বিকাশকারীকে উদ্দেশ্য নির্দিষ্ট করতে দেয় allows এটি উন্নত সংস্করণ আচরণ এবং আরও ভাল কর্মক্ষমতা তৈরি করে।


1

কেবলমাত্র পঠনযোগ্য: মানটি ক্লাসের নির্মাণকারীর কাছ থেকে কেবল একবারই শুরু করা হবে।
কনস্ট: যে কোনও ফাংশনে আরম্ভ করা যেতে পারে তবে কেবল একবার


1

পার্থক্যটি হ'ল স্ট্যাটিক রিডোনলি ফিল্ডের মান রান সময় নির্ধারিত হয়, সুতরাং প্রোগ্রামের বিভিন্ন নির্বাহের জন্য এটির আলাদা মান থাকতে পারে। যাইহোক, একটি কনস্টের ক্ষেত্রের মান একটি সংকলন সময় ধ্রুবককে সেট করা হয়।

মনে রাখবেন: রেফারেন্স ধরণের জন্য, উভয় ক্ষেত্রে (স্থিতিশীল এবং উদাহরণ), কেবলমাত্র পঠনযোগ্য সংশোধক আপনাকে ক্ষেত্রে একটি নতুন রেফারেন্স নির্ধারণ থেকে বাধা দেয়। এটি নির্দিষ্ট করে রেফারেন্স দ্বারা নির্দেশিত বস্তুটিকে পরিবর্তনযোগ্য করে তোলে না।

বিস্তারিত জানার জন্য, দয়া করে এই বিষয়টিতে সি # প্রায়শই জিজ্ঞাসিত প্রশ্নগুলি দেখুন: http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx


1

সংকলনের সময় ধ্রুবক ভেরিয়েবলগুলি ঘোষিত হয় এবং প্রারম্ভিক হয়। ওয়ার্ডগুলির পরে মানটি পরিবর্তন করা যায় না। কেবল পঠনযোগ্য ভেরিয়েবলগুলি কেবল শ্রেণীর স্ট্যাটিক নির্মাতা থেকে শুরু করা হবে। কেবলমাত্র পঠন তখনই ব্যবহৃত হয় যখন আমরা রান সময়টিতে মান নির্ধারণ করতে চাই।


1

কনস্ট্যান্ট : অ্যাপ্লিকেশন লাইফের সময় সম্পূর্ণ ধ্রুবক মান।

পঠনযোগ্য : চলমান সময়ে এটি পরিবর্তন করা যেতে পারে।


1
আপনার 'পঠনযোগ্য' এর সংজ্ঞাটি এটি পরিবর্তন করতে পারে যে ত্রুটিযুক্ত। আমার ধারণা 'পরিবর্তন' দ্বারা আপনি বোঝাচ্ছেন 'সেট', যেমন 'এটি রানটাইমে সেট করা যায়'।
আহমেদ

0

মানুষ উপরে যা বলেছে তাতে যুক্ত করার একটি বিষয়। যদি আপনার একটি পঠনযোগ্য মান (যেমন পঠনযোগ্য ম্যাক্সফুকাউন্ট = 4%) সমেত একটি অ্যাসেমব্লী থাকে তবে আপনি কলিং অ্যাসেম্বলিসমূহ সেই সমাবেশটির একটি নতুন সংস্করণ আলাদা মান সহ শিপিং করে যে মানটি দেখতে পাবেন তা পরিবর্তন করতে পারেন (যেমন পঠনযোগ্য ম্যাক্সফুকাউন্ট = 5;)

তবে কনস্টের সাহায্যে কলারটি সংকলন করা হলে এটি কলারের কোডে ফোল্ড হয়ে যায়।

আপনি যদি সি # দক্ষতার এই স্তরে পৌঁছে গেছেন তবে আপনি বিল ওয়াগনারের বই, কার্যকর সি #: আপনার সি উন্নত করার 50 টি নির্দিষ্ট উপায়ের জন্য প্রস্তুত রয়েছেন যা এই প্রশ্নের বিস্তারিতভাবে উত্তর দেয় (এবং অন্যান্য 49 টি বিষয়)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.