কনস্টের অ্যারে ঘোষণা করুন


457

নিম্নলিখিত কি অনুরূপ কিছু লেখা সম্ভব?

public const string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };

স্ট্যাটিক ব্যবহার করা যেতে পারে, পাবলিক স্ট্যাটিক স্ট্রিং [] শিরোনাম = নতুন স্ট্রিং [] German "জার্মান", "স্প্যানিশ"};
রায়

উত্তর:


690

হ্যাঁ, তবে এটির readonlyপরিবর্তে আপনার এটি ঘোষণা করা দরকার const:

public static readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };

কারণটি হ'ল constকেবলমাত্র এমন ক্ষেত্রে প্রয়োগ করা যেতে পারে যার মূল্য সংকলন সময়ে জানা যায় known আপনার প্রদর্শিত অ্যারে ইনিশিয়ালাইজারটি সি # তে একটি ধ্রুবক প্রকাশ নয়, সুতরাং এটি একটি সংকলক ত্রুটি তৈরি করে।

এটি readonlyঘোষণার ফলে সমস্যাটি সমাধান হয়ে যায় কারণ রান-টাইম না হওয়া পর্যন্ত মানটি আরম্ভ হয় না (যদিও এটি অ্যারে ব্যবহারের আগে প্রথমবারের মতো শুরু করার নিশ্চয়তা দেয়)।

আপনি চূড়ান্তভাবে কী অর্জন করতে চান তা নির্ভর করে আপনি এনাম ঘোষণার বিষয়টিও বিবেচনা করতে পারেন:

public enum Titles { German, Spanish, Corrects, Wrongs };

115
মনে রাখবেন যে এখানে অ্যারে অবশ্যই পঠনযোগ্য নয়; নমুনা এ থেকে জেড [2] = "ওয়েলশ"; রানটাইমে ঠিক কাজ করবে
মার্ক গ্র্যাভেল

46
আপনি সম্ভবত এটি স্থির করতে চান
টিম্টাম

4
ক্লাস ওয়ানে নয়, কোনও মেথড বডিটিতে "কনস্ট" অ্যারে ঘোষণা করার বিষয়ে কীভাবে?
serhio

19
ডাউন ভোটের জন্য দুঃখিত, তবে কনস্টেট স্থিরও বোঝায়। অ্যারেটিকে কেবল পঠন হিসাবে ঘোষণা করা কোনও কার্যকারণের কাছাকাছি নয়। এটি readonly staticঅনুরোধক শব্দার্থবিজ্ঞানের কোনও সাদৃশ্য থাকা প্রয়োজন।
আন্তন

3
@ অ্যান্টন, আপনি এবং আপনার "অনুসারীরা" ডাউনভোটটি সরিয়ে দিয়েছেন? আমার staticকাছে এটি কাজ করার প্রয়োজন নেই, এটি কেবল Titlesউদাহরণ ছাড়াই রেফারেন্সের সম্ভাবনা যুক্ত করে , তবে বিভিন্ন উদাহরণের জন্য মান পরিবর্তন করার সম্ভাবনা সরিয়ে দেয় (যেমন আপনি যে readonlyক্ষেত্রের মান পরিবর্তন করেন তার উপর নির্ভর করে আপনার প্যারামিটার দিয়ে কনস্ট্রাক্টর থাকতে পারে )।
সিনাতর

57

আপনি অ্যারে হিসাবে ঘোষণা করতে পারেন 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();

31
.NET 4.5 এবং উচ্চতর আপনি আইলিস্ট <স্ট্রিং> এর পরিবর্তে IReadOnlyList <string> হিসাবে একটি তালিকা ঘোষণা করতে পারেন।
গ্রেজগোর্জ স্মুলকো

কেবল স্পষ্ট করে বলতে গেলে, আপনি এখনও একটি আইআরএডঅনলিস্টে মানগুলি পরিবর্তন করতে পারেন (কেবল উপাদানগুলি যোগ বা অপসারণ করবেন না)। তবে হ্যাঁ, এটিকে IReadOnlyList হিসাবে ঘোষণা করা আইএলিস্টের চেয়ে ভাল।
কেভিনভিক্টর

প্রশ্নটি constনয় readonly...
ইউসু আলেয়্যুব

50

আপনি একটি 'কনস্ট' অ্যারে তৈরি করতে পারবেন না কারণ অ্যারেগুলি বস্তু এবং কেবল রানটাইম এ তৈরি করা যেতে পারে এবং সংকলনের সময় কনস্ট সংস্থাগুলি সমাধান করা হয়।

পরিবর্তে আপনি যা করতে পারেন তা হ'ল আপনার অ্যারেটিকে "পঠনযোগ্য" হিসাবে ঘোষণা করা। এটি রানটাইমের সময় মান সেট করা ব্যতীত কনস্টের মতো একই প্রভাবযুক্ত। এটি কেবল একবার সেট করা যেতে পারে এবং এরপরে এটি কেবল পঠনযোগ্য (অর্থাত্ কনস্ট) মান।


2
এই পোস্টে কেন অ্যারেগুলিকে ধ্রুবক হিসাবে ঘোষণা করা যায় না তা হাইলাইট করা হয়েছে
র‌্যাডার্ডজ

1
একটি ধ্রুবক অ্যারে ঘোষণা করা সম্ভব; সমস্যাটি একটি ধ্রুবক মান দিয়ে এটি সূচনা করে। একমাত্র কার্যকরী উদাহরণ যা মনে আসে তা হ'ল const int[] a = null;যা খুব কার্যকর নয় তবে সত্যই অ্যারে ধ্রুবকের একটি উদাহরণ।
ওয়াল্ড্রাম্পাস

এটিই একমাত্র সঠিক উত্তর।
ইউশা আলেয়ুব

17

সি # 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";

1
এক্ষেত্রে ক্ষেত্রের পরিবর্তে সম্পত্তি ব্যবহার করে লাভ কী?
নিকোলে.নেইকিয়েনকো

2
ক্ষেত্র প্রতিটি কলে একটি নতুন অবজেক্ট ফিরিয়ে দিতে পারে না। একটি সম্পত্তি মূলত "ছদ্মবেশে ফাংশন" এর এক ধরণের।
এমজেপসন 10

1
আপনি যদি সর্বশেষ বিকল্পটি উল্লেখ করে থাকেন তবে ক্ষেত্র বা সম্পত্তি উভয়ই ব্যবহার করে এটি করা যেতে পারে তবে এটি সর্বজনীন হওয়ায় আমি একটি সম্পত্তি পছন্দ করি। প্রোপার্টি প্রবর্তনের পর থেকে আমি কখনই কোনও সর্বজনীন ক্ষেত্র ব্যবহার করি না।
এমজেপসন 10

1
1 ম পদ্ধতির আরও নেতিবাচক দিক রয়েছে: Titles[0]উদাহরণস্বরূপ - অ্যাসাইনমেন্টের প্রচেষ্টাটি চুপচাপ উপেক্ষা করা হলে আপনি সংকলন ত্রুটি পাবেন না । প্রতিবার অ্যারে পুনরুদ্ধার করার অদক্ষতার সাথে একত্রিত হয়ে আমি অবাক হয়ে দেখি যে এই পদ্ধতিরটি প্রদর্শন করার মতো আরও উপযুক্ত কিনা। বিপরীতে, 2 য় পদ্ধতির দক্ষ, এবং আপনাকে অপরিবর্তনীয়তা পরাস্ত করার জন্য আপনার পথের বাইরে যেতে হবে।
mklement0

6

যদি আপনি কোনও আইআরএডঅনলিলিস্ট ইন্টারফেসের পিছনে একটি অ্যারে ঘোষণা করেন তবে রানটাইমে ঘোষিত ধ্রুবক মান সহ একটি ধ্রুবক অ্যারে পাবেন:

public readonly IReadOnlyList<string> Titles = new [] {"German", "Spanish", "Corrects", "Wrongs" };

.NET 4.5 এবং এর থেকেও উচ্চতর উপলভ্য।


6

একটি। নেট ফ্রেমওয়ার্ক 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

1
@ মর্টব: দুর্ভাগ্যক্রমে, IReadOnlyCollectionসূচীকৃত অ্যাক্সেস সমর্থন করে না, তাই এটি এখানে ব্যবহার করা যাবে না। অতিরিক্ত হিসাবে, এর মতো IReadOnlyList(যা সূচিযুক্ত অ্যাক্সেস ধারণ করে) এটি আবার কাস্ট করে উপাদান হেরফেরের জন্য সংবেদনশীল string[]। অন্য কথায়: ReadOnlyCollection(যেটিতে আপনি স্ট্রিং অ্যারে নিক্ষেপ করতে পারবেন না) এটি সবচেয়ে শক্তিশালী সমাধান ust গেটর ব্যবহার না করা একটি বিকল্প (এবং আমি এটি নোট করার উত্তরটি আপডেট করেছি) তবে পাবলিক ডেটা সহ কোনও সম্পত্তির সাথে থাকা আরও ভাল।
mklement0

5

আমার প্রয়োজনের জন্য আমি staticঅ্যারের সংজ্ঞা দিচ্ছি , অসম্ভবের পরিবর্তে constএবং এটি কার্যকর করে: public static string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };


1
কেবল constওপি উদাহরণ থেকে অপসারণটিও কাজ করে, তবে এটি (বা আপনার উত্তর) উভয়: Titlesউদাহরণ এবং কোনও মান পরিবর্তন করতে দেয় । তাহলে এই উত্তরে আমি কী বলব?
সিনাটার

@ সিনাটার, আমি এর উত্তর 3 বছর আগে, যখন আমি সি # তে কাজ শুরু করেছি। আমি এটি রেখেছি, এখন আমি জাভা বিশ্বে আছি। সম্ভবত আমি যুক্ত করতে ভুলে গেছিreadonly
ALZ

দ্বিতীয় ভাবার পরে, আপনার উত্তরটি কোনও ওপেনconst / কোডreadonly বিবেচনা ছাড়াই কীভাবে ওপি কোডকে কাজ করতে হয় তা কেবল এটি কার্যকর করে তোলে (যেমন যদি constসিন্টেক্সের ভুল ছিল)। কিছু লোকের কাছে এটি একটি মূল্যবান উত্তর বলে মনে হচ্ছে (সম্ভবত তারা constভুল করেও ব্যবহার করার চেষ্টা করেছিল ?)
সিনাতর

5

আপনি একটি ভিন্ন পদ্ধতির গ্রহণ করতে পারেন: আপনার অ্যারে উপস্থাপনের জন্য একটি ধ্রুবক স্ট্রিং সংজ্ঞায়িত করুন এবং তারপরে আপনার যখন প্রয়োজন হবে তখন স্ট্রিংটিকে একটি অ্যারেতে বিভক্ত করুন eg

const string DefaultDistances = "5,10,15,20,25,30,40,50";
public static readonly string[] distances = DefaultDistances.Split(',');

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


8
আমি মনে করি বিভক্তি সম্পাদনের ব্যয়টি কনস্টের সংজ্ঞা দিয়ে যে কোনও সুবিধা ছাড়িয়ে গেছে। তবে বাক্সের বাইরে একটি অনন্য পদ্ধতির জন্য এবং চিন্তাভাবনার জন্য +1! ;)
র‌্যাডার্জ

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

4

সম্পূর্ণতার খাতিরে, এখন আমাদের কাছে অপ্রয়োজনীয় অ্যারাইও রয়েছে। এটি সত্যই পরিবর্তনযোগ্য হওয়া উচিত:

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


3

আপনি যা চান তা করার এটি একটি উপায়:

using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;

public ReadOnlyCollection<string> Titles { get { return new List<string> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();}}

এটি কেবল পঠনযোগ্য অ্যারে করার মতোই।


8
আপনি ঠিক হিসাবে এটি করতে পারেন public static readonly ReadOnlyCollection<String> Titles = new List<String> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();; আপনি যদি যাইহোক এটি রিডইনক্লিকেশন তৈরি করেন তবে প্রতিটি পুনরুদ্ধারে তালিকা পুনরায় তৈরি করার দরকার নেই।
নাইয়ারগডস

3

এটিই একমাত্র সঠিক উত্তর। আপনি বর্তমানে এটি করতে পারবেন না।

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

এগুলি কখনও কখনও পরিবর্তিত হয়, তবে সবসময় হয় না।


2

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


2

অ্যারে সম্ভবত things জিনিসগুলির মধ্যে একটি যা কেবল রানটাইমে মূল্যায়ন করা যায়। সংকলনের সময় ধ্রুবকের মূল্যায়ন করতে হবে। "কনস্ট" এর পরিবর্তে "পঠনযোগ্য" ব্যবহার করার চেষ্টা করুন।


0

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

public static string[] Titles 
{
    get
    {
        return new string[] { "German", "Spanish", "Corrects", "Wrongs"};
    }
}

অবশ্যই এটি প্রতিটি ক্ষেত্রে নতুন স্ট্রিং অ্যারে তৈরি হওয়ার কারণে বিশেষভাবে কার্যকর হবে না।


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