একটি ধ্রুবক তালিকার ইনলাইন ইনস্ট্যান্টেশন


103

আমি এরকম কিছু করার চেষ্টা করি:

public const List<String> METRICS = new List<String>()
        {
            SourceFile.LOC,
            SourceFile.MCCABE,
            SourceFile.NOM,
            SourceFile.NOA,
            SourceFile.FANOUT,
            SourceFile.FANIN,
            SourceFile.NOPAR,
            SourceFile.NDC,
            SourceFile.CALLS
        };

তবে দুর্ভাগ্যক্রমে এটি কার্যকর হয় না:

FileStorer.METRICS' is of type 'System.Collections.Generic.List<string>'. A const field of a reference type other than string can only be initialized with null.

কিভাবে আমি এই সমস্যার সমাধান করতে পারে?



4
দ্রষ্টব্য: নকল হিসাবে এই প্রশ্নটি বন্ধ করা একটি ভুল ছিল। সংযুক্ত প্রশ্নটি ধ্রুবক অ্যারে সম্পর্কে , এই প্রশ্নটি ধ্রুবক তালিকাগুলি সম্পর্কে । যদিও উভয় পন্থা মোটামুটি একই কার্যকারিতা সরবরাহ করে তবে সেগুলি আলাদা এবং উত্তরগুলি পৃথক। এই প্রশ্নের উল্লেখ শুধুমাত্র উত্তর ReadOnlyCollection। প্রশ্নগুলি সম্পর্কিত, তবে উভয়ই অন্যটির সদৃশ নয়।
— অথরি

উত্তর:


196

constসংকলন-সময় ধ্রুবক জন্য। আপনি কেবল এটি তৈরি করতে পারেন static readonly, তবে এটি কেবলমাত্র METRICSভেরিয়েবলের ক্ষেত্রেই প্রযোজ্য (যার পরিবর্তে সাধারণত নেট নামকরণ কনভেনশনগুলি পরিবর্তে মেট্রিক হওয়া উচিত )। এটি তালিকাটি অপরিবর্তনীয় করে তুলবে না - যাতে কেউ কল করতে পারেMETRICS.Add("shouldn't be here");

আপনি ReadOnlyCollection<T>এটি মোড়ানোর জন্য একটি ব্যবহার করতে চাইতে পারেন । উদাহরণ স্বরূপ:

public static readonly IList<String> Metrics = new ReadOnlyCollection<string>
    (new List<String> { 
         SourceFile.LoC, SourceFile.McCabe, SourceFile.NoM,
         SourceFile.NoA, SourceFile.FanOut, SourceFile.FanIn, 
         SourceFile.Par, SourceFile.Ndc, SourceFile.Calls });

ReadOnlyCollection<T>কেবলমাত্র একটি সম্ভাব্য-পরিবর্তনীয় সংগ্রহ গুটিয়ে রাখে, তবে List<T>পরবর্তীকালে আর কোনও কিছুই অ্যাক্সেস পাবে না , আপনি সামগ্রিক সংগ্রহটিকে অপরিবর্তনীয় হিসাবে বিবেচনা করতে পারেন।

(এখানে মূলধনটি বেশিরভাগ অনুমানের কাজ - পূর্ণ নাম ব্যবহার করা তাদের পরিষ্কার করে তোলে, আইএমও।)

কিনা আপনি যেমন ডিক্লেয়ার IList<string>, IEnumerable<string>, ReadOnlyCollection<string>নাকি অন্য কিছু আপ আপনাকে যদি আপনি আশা করি এটি শুধুমাত্র একটি ক্রম হিসাবে গণ্য করা উচিত, তারপর ... IEnumerable<string>সম্ভবত সবচেয়ে উপযুক্ত হবে। যদি অর্ডারটি গুরুত্বপূর্ণ হয়ে থাকে এবং আপনি চান যে লোকেরা সূচক দ্বারা এটি অ্যাক্সেস করতে সক্ষম হয় IList<T>তবে উপযুক্ত হতে পারে। আপনি যদি অপরিবর্তনশীলতাটিকে দৃশ্যমান করতে চান, এটি ReadOnlyCollection<T>সহজেই কার্যকর হিসাবে ঘোষণা করে - তবে জটিল নয়।


4
আমি new List<string>{ ... }অংশটি খুঁজতে এখানে এসেছি ধন্যবাদ জোন :)
— জেসন

4
আমি মনে করি এর কোনও কারণ আছে, তবে আমার কাছে এটি ReadOnlyCollectionIList<>.Add
— উদ্ভট

26

static readonlyপরিবর্তে আপনাকে একটি তালিকা ব্যবহার করতে হবে। এবং আপনি যদি তালিকাটি অপরিবর্তনীয় রাখতে চান তবে আপনি ReadOnlyCollection<T>তার চেয়ে বরং ব্যবহারটি বিবেচনা করতে পারেন List<T>।

private static readonly ReadOnlyCollection<string> _metrics =
    new ReadOnlyCollection<string>(new[]
        {
            SourceFile.LOC,
            SourceFile.MCCABE,
            SourceFile.NOM,
            SourceFile.NOA,
            SourceFile.FANOUT,
            SourceFile.FANIN,
            SourceFile.NOPAR,
            SourceFile.NDC,
            SourceFile.CALLS
        });

public static ReadOnlyCollection<string> Metrics
{
    get { return _metrics; }
}

-7

আপনি এর মতো একটি সাধারণ কোড সন্ধান করছেন:

    List<string> tagList = new List<string>(new[]
    {
         "A"
        ,"B"
        ,"C"
        ,"D"
        ,"E"
    });

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