উত্তর:
হ্যাঁ, তবে এটির readonly
পরিবর্তে আপনার এটি ঘোষণা করা দরকার const
:
public static readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
কারণটি হ'ল const
কেবলমাত্র এমন ক্ষেত্রে প্রয়োগ করা যেতে পারে যার মূল্য সংকলন সময়ে জানা যায় known আপনার প্রদর্শিত অ্যারে ইনিশিয়ালাইজারটি সি # তে একটি ধ্রুবক প্রকাশ নয়, সুতরাং এটি একটি সংকলক ত্রুটি তৈরি করে।
এটি readonly
ঘোষণার ফলে সমস্যাটি সমাধান হয়ে যায় কারণ রান-টাইম না হওয়া পর্যন্ত মানটি আরম্ভ হয় না (যদিও এটি অ্যারে ব্যবহারের আগে প্রথমবারের মতো শুরু করার নিশ্চয়তা দেয়)।
আপনি চূড়ান্তভাবে কী অর্জন করতে চান তা নির্ভর করে আপনি এনাম ঘোষণার বিষয়টিও বিবেচনা করতে পারেন:
public enum Titles { German, Spanish, Corrects, Wrongs };
readonly static
অনুরোধক শব্দার্থবিজ্ঞানের কোনও সাদৃশ্য থাকা প্রয়োজন।
static
কাছে এটি কাজ করার প্রয়োজন নেই, এটি কেবল Titles
উদাহরণ ছাড়াই রেফারেন্সের সম্ভাবনা যুক্ত করে , তবে বিভিন্ন উদাহরণের জন্য মান পরিবর্তন করার সম্ভাবনা সরিয়ে দেয় (যেমন আপনি যে readonly
ক্ষেত্রের মান পরিবর্তন করেন তার উপর নির্ভর করে আপনার প্যারামিটার দিয়ে কনস্ট্রাক্টর থাকতে পারে )।
আপনি অ্যারে হিসাবে ঘোষণা করতে পারেন readonly
, তবে মনে রাখবেন আপনি readonly
অ্যারের উপাদান পরিবর্তন করতে পারেন ।
public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
...
Titles[0] = "bla";
এনডি ব্যবহার করার কথা বিবেচনা করুন, যেমন কোডির পরামর্শ অনুসারে, বা আইলিস্ট।
public readonly IList<string> ITitles = new List<string> {"German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();
const
নয় readonly
...
আপনি একটি 'কনস্ট' অ্যারে তৈরি করতে পারবেন না কারণ অ্যারেগুলি বস্তু এবং কেবল রানটাইম এ তৈরি করা যেতে পারে এবং সংকলনের সময় কনস্ট সংস্থাগুলি সমাধান করা হয়।
পরিবর্তে আপনি যা করতে পারেন তা হ'ল আপনার অ্যারেটিকে "পঠনযোগ্য" হিসাবে ঘোষণা করা। এটি রানটাইমের সময় মান সেট করা ব্যতীত কনস্টের মতো একই প্রভাবযুক্ত। এটি কেবল একবার সেট করা যেতে পারে এবং এরপরে এটি কেবল পঠনযোগ্য (অর্থাত্ কনস্ট) মান।
const int[] a = null;
যা খুব কার্যকর নয় তবে সত্যই অ্যারে ধ্রুবকের একটি উদাহরণ।
সি # 6 যেহেতু আপনি এটি লিখতে পারেন:
public static string[] Titles => new string[] { "German", "Spanish", "Corrects", "Wrongs" };
আরও দেখুন: সি #: নতুন এবং উন্নত সি # 6.0 (বিশেষত "এক্সপ্রেশন দেহ কার্যকারিতা এবং বৈশিষ্ট্যসমূহ" অধ্যায়)
এটি কেবল পঠনযোগ্য স্থিতিশীল সম্পত্তি তৈরি করবে, তবে এটি আপনাকে ফিরে আসা অ্যারের সামগ্রী পরিবর্তন করতে অনুমতি দেবে, কিন্তু আপনি যখন আবার সম্পত্তিটি কল করবেন, আপনি আবার আসল, আনলটার্টেড অ্যারে পাবেন।
স্পষ্টতার জন্য, এই কোডটি হ'ল (বা আসলে সংক্ষেপে):
public static string[] Titles
{
get { return new string[] { "German", "Spanish", "Corrects", "Wrongs" }; }
}
দয়া করে মনে রাখবেন যে এই পদ্ধতির একটি খারাপ দিক রয়েছে: একটি নতুন অ্যারে আসলে প্রতিটি এবং প্রতিটি রেফারেন্সে ইনস্ট্যান্ট করা হয়, তাই আপনি যদি খুব বড় অ্যারে ব্যবহার করেন তবে এটি সবচেয়ে কার্যকর সমাধান নাও হতে পারে। তবে আপনি যদি একই অ্যারেটি পুনরায় ব্যবহার করেন (উদাহরণস্বরূপ এটি একটি ব্যক্তিগত বৈশিষ্ট্যে রেখে) এটি আবার অ্যারের সামগ্রীগুলি পরিবর্তন করার সম্ভাবনাটি খুলবে।
যদি আপনি একটি অপরিবর্তনীয় অ্যারে (বা তালিকা) রাখতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
public static IReadOnlyList<string> Titles { get; } = new string[] { "German", "Spanish", "Corrects", "Wrongs" };
তবে এটির পরিবর্তনের ঝুঁকি রয়েছে, কারণ আপনি এখনও এটিকে আবার স্ট্রিংয়ে ফেলে দিতে পারেন [] এবং বিষয়বস্তুগুলিকে পরিবর্তন করতে পারেন:
((string[]) Titles)[1] = "French";
Titles[0]
উদাহরণস্বরূপ - অ্যাসাইনমেন্টের প্রচেষ্টাটি চুপচাপ উপেক্ষা করা হলে আপনি সংকলন ত্রুটি পাবেন না । প্রতিবার অ্যারে পুনরুদ্ধার করার অদক্ষতার সাথে একত্রিত হয়ে আমি অবাক হয়ে দেখি যে এই পদ্ধতিরটি প্রদর্শন করার মতো আরও উপযুক্ত কিনা। বিপরীতে, 2 য় পদ্ধতির দক্ষ, এবং আপনাকে অপরিবর্তনীয়তা পরাস্ত করার জন্য আপনার পথের বাইরে যেতে হবে।
যদি আপনি কোনও আইআরএডঅনলিলিস্ট ইন্টারফেসের পিছনে একটি অ্যারে ঘোষণা করেন তবে রানটাইমে ঘোষিত ধ্রুবক মান সহ একটি ধ্রুবক অ্যারে পাবেন:
public readonly IReadOnlyList<string> Titles = new [] {"German", "Spanish", "Corrects", "Wrongs" };
.NET 4.5 এবং এর থেকেও উচ্চতর উপলভ্য।
একটি। নেট ফ্রেমওয়ার্ক v4.5 + সমাধান যা টিডিবেকেটের উত্তরে উন্নতি করে :
using System.Collections.ObjectModel;
// ...
public ReadOnlyCollection<string> Titles { get; } = new ReadOnlyCollection<string>(
new string[] { "German", "Spanish", "Corrects", "Wrongs" }
);
দ্রষ্টব্য: সংগ্রহটি ধারণাগতভাবে ধ্রুবক হিসাবে দেওয়া, এটি শ্রেণি পর্যায়ে static
এটি ঘোষণা করার জন্য এটি বোধগম্য হতে পারে ।
সর্বোপরি:
একবার অ্যারের সাথে সম্পত্তিটির অন্তর্নিহিত ব্যাকিং ফিল্ড শুরু করে।
লক্ষ্য করুন { get; }
- অর্থাত, শুধুমাত্র একটি সম্পত্তি ঘোষণা সংগ্রহকারী - কি পরোক্ষভাবে শুধুমাত্র পাঠযোগ্য সম্পত্তি নিজেই করে তোলে (মেশা বের করার চেষ্টা readonly
সঙ্গে { get; }
আসলে একটি বাক্য গঠন ত্রুটি যায়)।
বিকল্প হিসাবে, আপনি কেবল বাদ দিতে পারেন { get; }
এবং কোনও সম্পত্তি হিসাবে পরিবর্তে ক্ষেত্রreadonly
তৈরি করতে যোগ করতে পারেন , যেমন প্রশ্নের মধ্যে রয়েছে, তবে ক্ষেত্রের চেয়ে জনসাধারণের ডেটা সদস্যদের সম্পত্তি হিসাবে প্রকাশ করা গঠন করা ভাল অভ্যাস।
একটি অ্যারের মতো কাঠামো তৈরি করে ( সূচিকৃত অ্যাক্সেসের অনুমতি দেয় ) যা সত্যই এবং দৃust়তার সাথে কেবল পঠনযোগ্য (ধারণামূলক ধ্রুবক, একবার তৈরি হয়েছে), উভয়ই সম্মানের সাথে:
IReadOnlyList<T>
সমাধান, যেখানে একটি (string[])
ঢালাই উপাদান লেখার অ্যাক্সেস অর্জন করতে ব্যবহার করা যেতে পারে , যেমন দেখানো mjepsen এর সহায়ক উত্তর । IReadOnlyCollection<T>
ReadOnlyCollection
IReadOnlyCollection
সূচীকৃত অ্যাক্সেস সমর্থন করে না, তাই এটি এখানে ব্যবহার করা যাবে না। অতিরিক্ত হিসাবে, এর মতো IReadOnlyList
(যা সূচিযুক্ত অ্যাক্সেস ধারণ করে) এটি আবার কাস্ট করে উপাদান হেরফেরের জন্য সংবেদনশীল string[]
। অন্য কথায়: ReadOnlyCollection
(যেটিতে আপনি স্ট্রিং অ্যারে নিক্ষেপ করতে পারবেন না) এটি সবচেয়ে শক্তিশালী সমাধান ust গেটর ব্যবহার না করা একটি বিকল্প (এবং আমি এটি নোট করার উত্তরটি আপডেট করেছি) তবে পাবলিক ডেটা সহ কোনও সম্পত্তির সাথে থাকা আরও ভাল।
আমার প্রয়োজনের জন্য আমি static
অ্যারের সংজ্ঞা দিচ্ছি , অসম্ভবের পরিবর্তে const
এবং এটি কার্যকর করে:
public static string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
const
ওপি উদাহরণ থেকে অপসারণটিও কাজ করে, তবে এটি (বা আপনার উত্তর) উভয়: Titles
উদাহরণ এবং কোনও মান পরিবর্তন করতে দেয় । তাহলে এই উত্তরে আমি কী বলব?
readonly
আপনি একটি ভিন্ন পদ্ধতির গ্রহণ করতে পারেন: আপনার অ্যারে উপস্থাপনের জন্য একটি ধ্রুবক স্ট্রিং সংজ্ঞায়িত করুন এবং তারপরে আপনার যখন প্রয়োজন হবে তখন স্ট্রিংটিকে একটি অ্যারেতে বিভক্ত করুন eg
const string DefaultDistances = "5,10,15,20,25,30,40,50";
public static readonly string[] distances = DefaultDistances.Split(',');
এই পদ্ধতির আপনাকে একটি ধ্রুবক দেয় যা কনফিগারেশনে সংরক্ষণ করা যেতে পারে এবং প্রয়োজনে অ্যারেতে রূপান্তর করতে পারে।
সম্পূর্ণতার খাতিরে, এখন আমাদের কাছে অপ্রয়োজনীয় অ্যারাইও রয়েছে। এটি সত্যই পরিবর্তনযোগ্য হওয়া উচিত:
public readonly static ImmutableArray<string> Tiles = ImmutableArray.Create(new[] { "German", "Spanish", "Corrects", "Wrongs" });
সিস্টেম.কলেশনগুলি দরকার mm অপরিবর্তনীয় নুগেট রেফারেন্স
https://msdn.microsoft.com/en-us/library/mt452182(v=vs.111).aspx
আপনি যা চান তা করার এটি একটি উপায়:
using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;
public ReadOnlyCollection<string> Titles { get { return new List<string> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();}}
এটি কেবল পঠনযোগ্য অ্যারে করার মতোই।
public static readonly ReadOnlyCollection<String> Titles = new List<String> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();
; আপনি যদি যাইহোক এটি রিডইনক্লিকেশন তৈরি করেন তবে প্রতিটি পুনরুদ্ধারে তালিকা পুনরায় তৈরি করার দরকার নেই।
এটিই একমাত্র সঠিক উত্তর। আপনি বর্তমানে এটি করতে পারবেন না।
অন্যান্য সমস্ত উত্তর স্থিরভাবে পঠনযোগ্য কেবল পরিবর্তনশীলগুলি ব্যবহার করার পরামর্শ দিচ্ছে যা একই ধরণের , তবে ধ্রুবকের মতো নয়। একটি ধ্রুবক কঠোরভাবে সমাবেশে কোড করা হয়। স্ট্যাটিক রিড অনলি ভেরিয়েবল একবার স্থিরযোগ্য, সম্ভবত কোনও বস্তুর আরম্ভ হয়।
এগুলি কখনও কখনও পরিবর্তিত হয়, তবে সবসময় হয় না।
একটি বিকল্প হিসাবে, কেবলমাত্র পঠনযোগ্য অ্যারেতে উপাদানগুলি-সংশোধন করা যায়-ইস্যুটি পরিবর্তিত হতে পারে, আপনি পরিবর্তে একটি স্থিতিশীল সম্পত্তি ব্যবহার করতে পারেন। (স্বতন্ত্র উপাদানগুলি এখনও পরিবর্তন করা যেতে পারে, তবে এই পরিবর্তনগুলি কেবল অ্যারের স্থানীয় অনুলিপিতে করা হবে))
public static string[] Titles
{
get
{
return new string[] { "German", "Spanish", "Corrects", "Wrongs"};
}
}
অবশ্যই এটি প্রতিটি ক্ষেত্রে নতুন স্ট্রিং অ্যারে তৈরি হওয়ার কারণে বিশেষভাবে কার্যকর হবে না।
সেরা বিকল্প:
public static readonly byte[] ZeroHash = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };