একটি স্ট্যাটিক শ্রেণীর ভিতরে একটি অভিধান ঘোষণা করুন


90

স্ট্যাটিক ক্লাসের ভিতরে স্ট্যাটিক ডিকশনারি অবজেক্টটি কীভাবে ডিক্লেয়ার করবেন? আমি চেষ্টা করেছিলাম

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
    {
        { "1", "User name or password problem" }     
    };
}

তবে সংকলকটি অভিযোগ করে যে " স্ট্রিং ব্যতীত রেফারেন্স টাইপের একটি কনস্ট ফিল্ড কেবল নাল দিয়েই আরম্ভ করা যেতে পারে "।


4
আপনি অভিধানের ধরণের সাথে কনস্ট ব্যবহার করতে পারবেন না, কেবল স্কেলারের মান সহ। (আমার উত্তরটি দেখুন) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Yona

উত্তর:


214

আপনি যদি একবার ডিকশনারিটি ঘোষণা করতে চান এবং কখনই পরিবর্তন করতে চান না তবে এটি কেবল পঠনযোগ্য হিসাবে ঘোষণা করুন:

private static readonly Dictionary<string, string> ErrorCodes
    = new Dictionary<string, string>
{
    { "1", "Error One" },
    { "2", "Error Two" }
};

যদি আপনি অভিধান আইটেমগুলি কেবলমাত্র পঠনযোগ্য হতে চান (কেবলমাত্র রেফারেন্সই নয় তবে সংগ্রহের আইটেমগুলিও) তবে আপনাকে পঠনযোগ্য অভিধান বর্গ তৈরি করতে হবে যা আইডিকোরিয়াম প্রয়োগ করে।

রেফারেন্সের জন্য রিডইনলি সংগ্রহ সংগ্রহ করুন।

বিটিডব্লিউ কনস্ট কেবলমাত্র স্কেলারের মানগুলি ইনলাইন ঘোষণার সময় ব্যবহার করা যেতে পারে।


শ্রেণি স্তরের বেসরকারী স্ট্যাটিক ভেরিয়েবল প্রাইভেট স্ট্যাটিক অভিধানটি <স্ট্রিং, স্ট্রিং> ত্রুটি কোড এবং তারপরে সম্পর্কিত ফাংশনে যদি লুপটিতে ব্যবহৃত হয় (ত্রুটি কোডস == নাল) dictionary অভিধান পূরণ করুন c মান ক্যাশে করা যায় কিনা?
LifeOfPi

4
আপনি যদি অভিধানটি পরিবর্তন না করতে চান তবে আপনি এটিতে একটি মোড়ানো করতে পারেন ReadOnlyDictionary। আরও কার্যকর (তবে কম নিরাপদ বিকল্প) হ'ল এটি কোনও IReadOnlyDictionaryধরণের ক্ষেত্রে নির্ধারণ করা ।
রামন ডি ক্লিন

8

সঠিক বাক্য গঠন (ভিএস ২০০৮ এসপি 1 তে যেমন পরীক্ষিত), এটি হ'ল:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic;
     static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}

তবে এটি কনটেন্টটি সংশোধন করতে গ্রাসকারী শ্রেণিকে বাধা দেয় না।
এভেল্টস

4

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

private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
    { "1", "Unrecognized segment ID" },
    { "2", "Unexpected segment" }
};

সম্পাদনা করুন: নীচে ক্রিসের মন্তব্য নীচে, Dictionary<string, string>ওভার ব্যবহার StringDictionaryকরা সাধারণত পছন্দনীয় তবে আপনার পরিস্থিতির উপর নির্ভর করবে। আপনি যদি কোনও পুরানো কোড বেস নিয়ে কাজ করছেন তবে আপনি সীমাবদ্ধ থাকতে পারেন StringDictionary। এছাড়াও, নীচের লাইনটি লক্ষ করুন:

myDict["foo"]

যদি myDictহয় তবে নালায় ফিরে আসবে StringDictionary, তবে ব্যতিক্রম ক্ষেত্রে নিক্ষেপ করা হবে Dictionary<string, string>। আরও তথ্যের জন্য তিনি যে এসও পোস্টটি উল্লেখ করেছেন তা দেখুন, যা এই সম্পাদনার উত্স।



ঠিক এই প্রশ্নের সাথেই আমি যুক্ত ছিলাম।
ক্রিস মরগান

4
হা বাহ, এমনকি এটি ধরেনি - ঠিক একই সন্ধান করতে ঘটেছিল। আমি মন্তব্যটি সম্পাদনা করতে পারিনি, তাই আমি কেবল একটি জায়গায় সংক্ষিপ্তসার জন্য পোস্ট সম্পাদনা করেছি। ধন্যবাদ!
আরিলিং করছে

1

আপনার প্রাথমিক উদাহরণটিতে সমস্যাটি মূলত constপরিবর্তে ব্যবহারের কারণেstatic ; আপনি সি # তে নন-নুল কনস্ট রেফারেন্স তৈরি করতে পারবেন না।

আমি বিশ্বাস করি এটিও কাজ করবে:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic
        = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
}

এছাড়াও, ওয়াই লো উল্লেখ করেছেন যেহেতু যুক্ত readonlyকরাও একটি ভাল ধারণা এবং এখানে আলোচিত কোনও সংশোধকই অভিধানটিকে নিজেই সংশোধন করা থেকে বিরত রাখতে পারবেন না।


1

অভিধানে মান যুক্ত করতে একটি স্ট্যাটিক কনস্ট্রাক্টর তৈরি করুন

enum Commands
{
    StudentDetail
}
public static class Quires
{
    public static Dictionary<Commands, String> quire
        = new Dictionary<Commands, String>();
    static Quires()
    {
        quire.add(Commands.StudentDetail,@"SELECT * FROM student_b");
    }
}

4
কোয়ার বা কোয়েরি?
অ্যাশ

0

আপনি আপনার অভিধানটি আরম্ভ করতে স্ট্যাটিক / শ্রেণি নির্মাতা ব্যবহার করতে পারেন:

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}

4
আপনি কি শব্দটিকে স্থির করতে চেয়েছেন? আপনি এটি কনস্ট্যান্ট থাকতে পারে না। ত্রুটি বার্তায় যেমন বলা হয়, কেবলমাত্র মান ধরণের, স্ট্রিংগুলি বা নাল কনস্টেেন্ট হতে পারে
অরিওন এডওয়ার্ডস

0

অভিধানকে একটি স্ট্যাটিক করুন এবং আপনার স্ট্যাটিক অবজেক্টের কর্টারের বাইরে কখনও এটিকে যুক্ত করবেন না। এটি সি # তে স্থির / দৃ const় বিধি বিধিবিধানের সাথে ফিড করার চেয়ে সহজ সমাধান বলে মনে হচ্ছে।


0

ঠিক আছে - সুতরাং আমি এএসপি ২.x এ কাজ করছি (আমার পছন্দ নয় ... তবে আরে কে বিচি দিচ্ছে?)।

আরম্ভের অভিধানের উদাহরণগুলির কোনওটিই কাজ করবে না। তারপরে আমি এগুলি দেখতে পেলাম: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dorses- and-collections.aspx

... যা আমাকে এএসপি ২.এক্সে সংগ্রহের সূচনাটি ব্যবহার করতে পারে না এই বিষয়টি সম্পর্কে জানতে পেরেছিল।


-2
public static class ErrorCode
{
    public const IDictionary<string , string > m_ErrorCodeDic;

    public static ErrorCode()
    {
      m_ErrorCodeDic = new Dictionary<string, string>()
             { {"1","User name or password problem"} };             
    }
}

সম্ভবত কনস্ট্রাক্টরটিতে আরম্ভ করুন।

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