সি # তে কীভাবে গ্লোবাল ভেরিয়েবল ব্যবহার করবেন?


104

আমি কীভাবে একটি ভেরিয়েবল ঘোষণা করব যাতে প্রতিটি শ্রেণি (* .cs) উদাহরণ ছাড়াই রেফারেন্স ছাড়াই এর সামগ্রীটি অ্যাক্সেস করতে পারে?

উত্তর:


128

ইন C#আপনি সত্য গ্লোবাল ভেরিয়েবল সংজ্ঞায়িত করতে পারবেন না (অর্থে তারা কোনো বর্গ অন্তর্গত না যে)।

এটি বলা হচ্ছে, এই বৈশিষ্ট্যটির নকল করতে আমি জানলাম যে সহজ পদ্ধিতি নীচে একটি ব্যবহার করে তৈরি static classকরে:

public static class Globals
{
    public const Int32 BUFFER_SIZE = 512; // Unmodifiable
    public static String FILE_NAME = "Output.txt"; // Modifiable
    public static readonly String CODE_PREFIX = "US-"; // Unmodifiable
}

তারপরে আপনি আপনার কোডের যে কোনও জায়গায় নির্ধারিত মানগুলি পুনরুদ্ধার করতে পারেন (এটি যদি এর অংশ হিসাবে থাকে তবে namespace):

String code = Globals.CODE_PREFIX + value.ToString();

বিভিন্ন নেমস্পেসগুলি মোকাবেলা করার জন্য, আপনি হয়:

  • Globalsশ্রেণিটিকে একটি নির্দিষ্ট হিসাবে অন্তর্ভুক্ত না করে ঘোষণা করুন namespace(যাতে এটি বিশ্বব্যাপী অ্যাপ্লিকেশন নেমস্পেসে স্থাপন করা হবে);
  • অন্যের থেকে ভেরিয়েবলগুলি পুনরুদ্ধার করার জন্য যথাযথ ব্যবহারের নির্দেশিকা সন্নিবেশ করান namespace

@ জারাথোস কি ক্লাসের পাশাপাশি স্থির থাকতে হবে?
kosnkov

4
ভাল এটি প্রয়োজনীয় নয় তবে কেন এটি তাত্পর্যপূর্ণ করা উচিত তা আমি দেখতে পাচ্ছি না।
টমমসো বেলুজ্জো

আপনি যদি তার প্রতি সংজ্ঞাটি আর "গ্লোবাল" না করে, অ্যাপ্লিকেশন রাষ্ট্রের অংশ না করে ইনস্ট্যান্ট করতে চান
ভাইকিং

হাই, আমি ক্লাসে স্ট্যাটিক কীওয়ার্ডটি টাইপ না করলে কী পার্থক্য হবে? আমি কেবল FILE_NAME স্ট্রিংটিকে স্থিতিশীল করেছিলাম, আমি চেষ্টা করেছি এবং এটি এখনও আমার পক্ষে কাজ করে।
টোমর কাহাল

4
স্থির বৈশিষ্ট্য ব্যতীত আপনার শ্রেণি অস্থির হবে (গ্লোবালস জি = নতুন গ্লোবাল ())। এটি ভিতরে ঘোষিত স্থিতিশীল ভেরিয়েবলগুলির আচরণকে পরিবর্তন করে না, তবে এটি সত্যিই দরকারী বলে মনে হচ্ছে না।
টমমসো বেলুজ্জো

74

সি # তে গ্লোবাল ভেরিয়েবলের মতো জিনিস নেই। পিরিয়ড।

আপনি চাইলে আপনার স্থির সদস্য থাকতে পারে:

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}

যদিও আমি একমত নই, আপনি দয়া করে কেন সি # তে বৈশ্বিক পরিবর্তনশীল বলে কিছুই নেই তা নিয়ে প্রসারিত করতে পারেন? আমি একটি ভাল কারণ চিন্তা করার চেষ্টা করছিলাম কেন যে staticআপনি যে উদাহরণটি প্রদান করেছেন তা সত্যই বিশ্বব্যাপী ভ্যারাই হিসাবে বিবেচনা করা যায় না।
ক্রেগক্স

4
@ কাওয়াস কারণ একটি "গ্লোবাল ভেরিয়েবল" এর ধারণাটি (কোথাও থেকে ঝুলন্ত, লম্বা অবস্থায় ভেসে বেড়ানো, কোনও শ্রেণীর অন্তর্গত নয়) ওওপির খুব প্রকৃতির পরিপন্থী। এবং সি # কঠোরভাবে অবজেক্ট ওরিয়েন্টেড।
ফেডেরিকো বেরাসেট্টুয়ে

হ্যাঁ, এগুলিই আমি ধারণার সাথে একমত। তবে সেই স্থির সদস্য তৈরি করে আপনি কেবল এক ধরণের গ্লোবাল ভেরি তৈরি করেছেন। আপনি যে বিশ্বব্যাপী পৃথকভাবে বলেছিলেন তার থেকে কীভাবে আলাদা? আমি একটি বাস্তব উদাহরণ দেখতে চাই।
ক্রেগক্স

4
আমার মনে হয় আপনি হয় আমার প্রশ্ন এড়িয়ে যাচ্ছেন বা আমি পরিষ্কার নই। তবে আমি এর উত্তর ইতিমধ্যে পেয়েছি। এখানে: stackoverflow.com/a/20010543/274502
cregox

7
আমি এখন বুঝতে পেরেছিলাম যে আমি বলতে চাইছি স্থিতিশীল সদস্যরা ধারণাগত এবং ব্যবহারিকভাবে বৈশ্বিক যুদ্ধগুলি (সম্ভবত that স্তূপের জিনিসটি বাদে , যদি আপনি অনিরাপদ কোডটি না লিখছেন বা পরিচালনা না করে কিছু ভারী আন্তঃব্যবস্থাপনা পরিচালনা না করেন তবেই কেবল তাত্পর্য হয় )। সুতরাং আমি জানি না যে কেউ কেন " সিশার্পে বৈশ্বিক পরিবর্তনশীল বলে কিছুই নেই" বলবে । এটা আমাকে অনেক গুলিয়ে ফেলেছে।
ক্রেগোক্স

23

আপনার সফ্টওয়্যার আর্কিটেকচারের কথা বিবেচনা না করে যদি আপনার সত্যিই কোনও গ্লোবাল ভেরিয়েবলের প্রয়োজন হয় তবে তা পরিষ্কারভাবে পরীক্ষা করুন।

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

  1. এই জাতীয় সমস্ত গ্লোবাল ভেরিয়েবলকে একটি একক staticশ্রেণিতে (পরিচালনা করার জন্য) মোড়ানো ।
  2. ক্ষেত্রের পরিবর্তে বৈশিষ্ট্যগুলি (= 'ভেরিয়েবল') রাখুন। ভবিষ্যতে গ্লোবালগুলিতে সমকালীন লেখাগুলি সহ যে কোনও সমস্যা সমাধানের জন্য আপনার কাছে এমন কিছু ব্যবস্থা রয়েছে।

এই জাতীয় শ্রেণীর জন্য প্রাথমিক রূপরেখাটি হ'ল:

public class Globals
{
    private static bool _expired;
    public static bool Expired 
    {
        get
        {
            // Reads are usually simple
            return _expired;
        }
        set
        {
            // You can add logic here for race conditions,
            // or other measurements
            _expired = value;
        }
    }
    // Perhaps extend this to have Read-Modify-Write static methods
    // for data integrity during concurrency? Situational.
}

অন্যান্য শ্রেণি থেকে ব্যবহার (একই নাম স্থানের মধ্যে)

// Read
bool areWeAlive = Globals.Expired;

// Write
// past deadline
Globals.Expired = true;

5

এটির জন্য একটি দরকারী বৈশিষ্ট্য using static

অন্যরা যেমন বলেছে, আপনার গ্লোবালগুলির জন্য আপনাকে একটি ক্লাস তৈরি করতে হবে:

public static class Globals {
    public const float PI = 3.14;
}

তবে আপনি ক্লাসের নামটি স্থির বৈশিষ্ট্যের সামনে আর লেখার জন্য এটি এ জাতীয়ভাবে আমদানি করতে পারেন:

using static Globals;
[...]
Console.WriteLine("Pi is " + PI);

ধন্যবাদ! এই ছোট্ট কৌশলটি আমাকে ভিবিএ থেকে সি # রূপান্তর করতে ঘন্টা বাঁচাচ্ছে।
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.