কী- static
ওয়ার্ডটি newbies উপলব্ধি করতে কিছুটা কঠিন হতে পারে। এর প্রাথমিক উদ্দেশ্যটি কোনও শ্রেণীর সদস্যকে শ্রেণীর কোনও একক উদাহরণের সাথে সম্পর্কিত নয়, বরং ক্লাসের নিজস্ব হিসাবে চিহ্নিত করা।
খুব বেশি বিশদে না গিয়ে, সি # (এবং জাভা) কঠোরভাবে অবজেক্ট ভিত্তিক আদর্শ প্রয়োগ করুন যে সমস্ত কোড এবং ডেটা অবশ্যই কোনও বস্তুর অন্তর্ভুক্ত, এবং তাই সুযোগ, দৃশ্যমানতা এবং আজীবন সীমাবদ্ধ। কিছু বাস্তব-বিশ্বের জিনিসের প্রতিনিধিত্বকারী কোনও বস্তুর মৌলিক তত্ত্ব যেখানে প্রযোজ্য সেখানে এটি সাধারণত সেরা অনুশীলন। তবে এটি সবসময় হয় না; কখনও কখনও আপনার যা প্রয়োজন তা হ'ল একটি ফাংশন বা ভেরিয়েবল যা আপনি কোডের যে কোনও জায়গা থেকে এটিতে থাকা কোনও উপাদানের রেফারেন্সের বাইরে যাওয়ার প্রয়োজন ছাড়াই এবং আপনি যে ডেটাটি দেখছেন বা পরিবর্তন করছেন তার গ্যারান্টি সহ প্রত্যেকটি হুবহু অন্যথায় কাজ করছে, এবং এর কোনও অনুলিপি কোনও অবজেক্টের ভিন্ন উদাহরণের সাথে সম্পর্কিত নয়।
এই জাতীয় আচরণ সি এবং সি ++ এ "গ্লোবাল" ফাংশন বা ভেরিয়েবল আকারে উপলব্ধ ছিল যা কোনও বস্তুতে আবদ্ধ ছিল না। সুতরাং, আপোস হিসাবে, সি # এবং জাভা "স্থিতিশীল সুযোগ" সমর্থন করে, কোনও প্যারেন্ট অবজেক্ট এবং সীমিত সুযোগের সদস্যদের সহ সত্যিকারের গ্লোবাল কোডের অর্ধেক পয়েন্ট।
static
প্রোগ্রামের main()
ফাংশনের প্রথম লাইন হিসাবে ঘোষিত যে কোনও "কোড সদস্য" (ফাংশন, সম্পত্তি, ক্ষেত্র) স্কোপে আসে এবং main()
ফাংশনটি শেষ না হওয়া পর্যন্ত এটিকে ছেড়ে যায় না । সরল ইংরেজিতে, একটি স্থির সদস্য উপস্থিত থাকে এবং যতক্ষণ না প্রোগ্রামটি চলছে ততক্ষণ ব্যবহার করা যেতে পারে। তদুপরি, স্থিতিশীল সদস্যদের তাদেরকে সেই ধরণের নিজস্ব সদস্য হিসাবে ডেকে আহ্বান জানানো হয়, সেই ধরণের কোনও এক উদাহরণের সদস্য নয়:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
এটি স্ট্যাটিক সদস্যদের যে কোনও কোডের কাছে প্রকারের জ্ঞান রয়েছে এমন দৃশ্যমান করে তোলে, এর কোনও একক উদাহরণ সম্পর্কে তারা জানেন কি না।
আপনার প্রশ্নের জবাব দেওয়ার জন্য, কোনও কিছুকে স্থিতিশীল হিসাবে চিহ্নিত করার প্রাথমিক সুবিধা হ'ল এটি যে যেখানেই টাইপটি পরিচিত সেখানেই তা দৃশ্যমান হয়, নির্বিশেষে গ্রাহক কোড রয়েছে কিনা তা অন্তর্ভুক্ত বস্তুর উদাহরণ থাকতে পারে। এখানে একটা ব্যাপার অসম্মান কর্মক্ষমতা সুবিধা; যেহেতু পদ্ধতিটি স্থিতিশীল সুযোগে রয়েছে, এটি কেবলমাত্র অন্যান্য স্থিতিশীল সদস্যদের (একই শ্রেণির বা অন্যদের) অ্যাক্সেস করতে পারে এবং প্যারামিটার হিসাবে যা কিছু পাস করেছে। অতএব, রানটাইমটি ধারণকৃত অবজেক্টের বর্তমান দৃষ্টান্তের কোনও রেফারেন্স সমাধান করতে হবে না, কারণ সাধারণত এটি প্রাসঙ্গিক-নির্দিষ্ট রাষ্ট্রের তথ্য সরবরাহ করার জন্য একটি উদাহরণ পদ্ধতির জন্য প্রয়োজন।
সম্পূর্ণ ক্লাসগুলি স্থির হিসাবে চিহ্নিত করা যেতে পারে; এটি করে আপনি সংকলককে বলবেন যে শ্রেণি ঘোষণাটি কেবল স্থির সদস্যদের সমন্বয়ে গঠিত হবে এবং তাই তা তাত্ক্ষণিকভাবে স্থাপন করা যায় না। এটি নিশ্চিত করার একটি সহজ উপায় যা মেমরিতে কোনও বস্তুর অনুলিপি এবং কেবল একটিই রয়েছে; শ্রেণি এবং এর সমস্ত কিছু স্থির করে তুলুন। যাইহোক, এটি খুব বিরল যে এই যেমন প্রয়োজনের সেরা সমাধান। এমন পরিস্থিতিতে যেখানে ডেটা সেটের হুবহু একটি অনুলিপি প্রয়োজন হয়, সাধারণত "সিঙ্গলটন" পরিবর্তে তার পরিবর্তে পরামর্শ করা হয়; এটি একটি অ-স্ট্যাটিক শ্রেণি, যা নিজেই একক নজরে অ্যাক্সেস সরবরাহ করতে একটি স্ট্যাটিক অ্যাক্সেসর এবং একটি অ-পাবলিক কনস্ট্রাক্টর ব্যবহার করে। তাত্ত্বিকভাবে, একটি সিঙ্গলটন সম্পূর্ণ স্ট্যাটিক ক্লাসের অনেক একই সুবিধা প্রদান করে তবে ক্লাসটি ইনস্ট্যান্স-ভিত্তিক, অবজেক্ট-ভিত্তিক উপায়ে ব্যবহারের অতিরিক্ত ক্ষমতা সহ।