উত্তর:
ডকস.মাইক্রোসফট.কম থেকে :
প্রকার বা সদস্য একই সমাবেশ বা অন্য কোনও সমাবেশে উল্লেখ করা অন্য যে কোনও কোড দ্বারা অ্যাক্সেস করতে পারে।
ধরণ বা সদস্যটি কেবল একই শ্রেণি বা কাঠামোর কোড দ্বারা অ্যাক্সেস করা যায়।
ধরণ বা সদস্যটি কেবল একই শ্রেণি বা কাঠামোয়, বা উত্পন্ন শ্রেণিতে কোড দ্বারা অ্যাক্সেস করা যায়।
private protected
(সি # 7.2 এ যুক্ত)প্রকার বা সদস্যটি কেবল একই শ্রেণি বা কাঠামোয় কোড দ্বারা, বা একই বিধানসভা থেকে প্রাপ্ত কোনও শ্রেণিতে, তবে অন্য সমাবেশ থেকে নয়।
প্রকার বা সদস্য একই অ্যাসেমব্লির যে কোনও কোড দ্বারা অ্যাক্সেস করা যেতে পারে, তবে অন্য সমাবেশ থেকে নয়।
প্রকার বা সদস্য একই অ্যাসেমব্লির যে কোনও কোড দ্বারা বা অন্য কোনও সমাবেশে প্রাপ্ত কোনও শ্রেণি দ্বারা অ্যাক্সেস করা যেতে পারে।
যখন কোনও অ্যাক্সেস মডিফায়ার সেট না করা হয়, তখন একটি ডিফল্ট অ্যাক্সেস মডিফায়ার ব্যবহৃত হয়। সুতরাং অ্যাক্সেস মডিফায়ারের কিছু ফর্ম সর্বদা থাকে যদি তা সেট না করা থাকে।
static
পরিবর্তককোনও শ্রেণীর স্ট্যাটিক সংশোধকটির অর্থ শ্রেণিটি তাত্ক্ষণিকভাবে চালু করা যায় না এবং এর সদস্যরা সবাই স্থির থাকে। স্থির সদস্যের এর সংযুক্তকরণের প্রকারের কতগুলি উদাহরণ তৈরি হয় তা নির্বিশেষে একটি সংস্করণ রয়েছে।
একটি স্ট্যাটিক বর্গটি মূলত অ-স্থিত শ্রেণীর মতো, তবে একটি পার্থক্য রয়েছে: একটি স্ট্যাটিক শ্রেণি বাহ্যিকভাবে তাত্ক্ষণিকভাবে স্থাপন করা যায় না। অন্য কথায়, আপনি শ্রেণীর ধরণের একটি পরিবর্তনশীল তৈরি করতে নতুন কীওয়ার্ডটি ব্যবহার করতে পারবেন না। কোনও উদাহরণ ভেরিয়েবল না থাকায়, আপনি ক্লাসের নামটি ব্যবহার করে একটি স্ট্যাটিক শ্রেণীর সদস্যদের অ্যাক্সেস করেন।
তবে, স্ট্যাটিক কনস্ট্রাক্টরের মতো একটি জিনিস রয়েছে । অবিচলিত ক্লাস সহ যে কোনও শ্রেণির এর মধ্যে একটি থাকতে পারে। তাদের সরাসরি বলা যায় না এবং প্যারামিটার থাকতে পারে না (ক্লাসে কোনও ধরণের প্যারামিটার বাদে)। প্রথম দৃষ্টান্ত তৈরি হওয়ার আগে বা কোনও স্থির সদস্যের রেফারেন্স হওয়ার আগে ক্লাসটি শুরু করার জন্য একটি স্ট্যাটিক কনস্ট্রাক্টরকে স্বয়ংক্রিয়ভাবে ডাকা হয়। এটা এমন দেখতে:
static class Foo()
{
static Foo()
{
Bar = "fubar";
}
public static string Bar { get; set; }
}
স্ট্যাটিক ক্লাসগুলি প্রায়শই পরিষেবা হিসাবে ব্যবহৃত হয়, আপনি এগুলি তাদের মতো ব্যবহার করতে পারেন:
MyStaticClass.ServiceMethod(...);
একটি গ্রাফিকাল ওভারভিউ (সংক্ষেপে সংক্ষিপ্তসার)
যেহেতু স্ট্যাটিক ক্লাসগুলি সিল করা হয়েছে, সেগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না (অবজেক্ট ব্যতীত), তাই সুরক্ষিত কীওয়ার্ডটি স্থির শ্রেণিতে অবৈধ।
ডিফল্টগুলির জন্য যদি আপনি সামনে অ্যাক্সেস মডিফায়ার না রাখেন তবে এখানে দেখুন:
সি # ক্লাস এবং সদস্যদের (ক্ষেত্র, পদ্ধতি ইত্যাদি) জন্য ডিফল্ট দৃশ্যমানতা?
অ নেস্টেড
enum public
non-nested classes / structs internal
interfaces internal
delegates in namespace internal
class/struct member(s) private
delegates nested in class/struct private
নেস্টেড:
nested enum public
nested interface public
nested class private
nested struct private
এছাড়াও, তাদের সিল-কীওয়ার্ড রয়েছে যা একটি শ্রেণিকে উত্তরাধিকারসূত্রে পরিণত করে না।
এছাড়াও, ভিবি.এনইটি-তে, কীওয়ার্ডগুলি কখনও কখনও আলাদা হয়, তাই এখানে একটি প্রতারণা-শীট:
সর্বজনীন - আপনি যদি ক্লাসটি দেখতে পান তবে আপনি পদ্ধতিটি দেখতে পারেন
প্রাইভেট - আপনি যদি ক্লাসের অংশ হন তবে আপনি পদ্ধতিটি দেখতে পারবেন, অন্যথায় নয়।
সুরক্ষিত - বেসরকারী হিসাবে একই, পাশাপাশি সমস্ত বংশধররাও এই পদ্ধতিটি দেখতে পাবেন।
স্ট্যাটিক (ক্লাস) - "ক্লাস" এবং "অবজেক্ট" এর মধ্যে পার্থক্য মনে আছে? সব ভুলে যাও। "স্থিতিশীল" এর সাথে এগুলি একই ... শ্রেণিটি হ'ল তার একমাত্র এবং একমাত্র উদাহরণ।
স্ট্যাটিক (পদ্ধতি) - আপনি যখনই এই পদ্ধতিটি ব্যবহার করবেন, তখন এতে রেফারেন্সের একটি ফ্রেম থাকবে এটি শ্রেণীর প্রকৃত উদাহরণের চেয়ে আলাদা।
এই উত্তর থেকে দুর্দান্ত চিত্রটি পুনরায় পোস্ট করা ।
এখানে ভেন ডায়াগ্রামের সমস্ত অ্যাক্সেস মডিফায়ার রয়েছে, আরও সীমাবদ্ধ থেকে আরও প্রতারণাপূর্ণ:
private
:
private protected
: - সি # 7.2 এ যুক্ত হয়েছে
internal
:
protected
:
protected internal
:
public
:
using System;
namespace ClassLibrary1
{
public class SameAssemblyBaseClass
{
public string publicVariable = "public";
protected string protectedVariable = "protected";
protected internal string protected_InternalVariable = "protected internal";
internal string internalVariable = "internal";
private string privateVariable = "private";
public void test()
{
// OK
Console.WriteLine(privateVariable);
// OK
Console.WriteLine(publicVariable);
// OK
Console.WriteLine(protectedVariable);
// OK
Console.WriteLine(internalVariable);
// OK
Console.WriteLine(protected_InternalVariable);
}
}
public class SameAssemblyDerivedClass : SameAssemblyBaseClass
{
public void test()
{
SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(privateVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
public class SameAssemblyDifferentClass
{
public SameAssemblyDifferentClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.internalVariable);
// NOT OK
// Console.WriteLine(privateVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
//Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
}
using System;
using ClassLibrary1;
namespace ConsoleApplication4
{
class DifferentAssemblyClass
{
public DifferentAssemblyClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
// Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protectedVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protected_InternalVariable);
}
}
class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
{
static void Main(string[] args)
{
DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
//Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
dd.test();
}
}
}
Private Protected
এটি হবে: একই শ্রেণি = Yes
, একই সমাবেশ, উত্পন্ন শ্রেণি = Yes
, একই সমাবেশ, যে কোনও শ্রেণি = NO
, বিভিন্ন সমাবেশ, উত্পন্ন শ্রেণি = NO
, বিভিন্ন সমাবেশ, যে কোনও শ্রেণি = NO
। আর একটি অতিরিক্ত পরামর্শ protected internal
হ'ল শব্দের ক্রম পরিবর্তন করা উচিত নয় , কারণ এটি @ ব্যবহারকারী 1810087 এর উত্তর থেকে নিউমোনিককে ভেঙে দেয়
তবুও বর্তমান অ্যাক্সেস সংশোধকটির আরও একটি ভিজ্যুয়াল পদ্ধতি (সি # 7.2)। আশা করি স্কিমাটি এটি সহজ মনে রাখতে সহায়তা করে
(ইন্টারেক্টিভ ভিউয়ের জন্য চিত্রটিতে ক্লিক করুন))
আপনি যদি দ্বি-শব্দযুক্ত অ্যাক্সেস সংশোধকগুলি মনে রাখার জন্য লড়াই করে থাকেন তবে বাইরে ভিতরে মনে রাখবেন ।
হুম।
এখানে দেখুন: অ্যাক্সেস মোডিফায়ার্স ।
সংক্ষেপে:
সর্বজনীন পদ্ধতি বা অন্য প্রকার / শ্রেণীর থেকে সম্পূর্ণ দৃশ্যমানতা টাইপ করে।
প্রাইভেট কেবল প্রাইভেট পদ্ধতি / চলক অ্যাক্সেস বেসরকারী পদ্ধতি / ভেরিয়েবল অ্যাক্সেসের ধরণ (মেনে নিন যে নেস্টেড ক্লাসগুলিতে ব্যক্তিগত শ্রেণিবদ্ধ ব্যক্তিগত পদ্ধতি / ভেরিয়েবলগুলি অ্যাক্সেস রয়েছে)।
সুরক্ষিত বেসরকারী অনুরূপ উদ্ভূত শ্রেণিগুলি ছাড়াও সুরক্ষিত পদ্ধতিতে অ্যাক্সেস করতে পারে।
"কিছুই না" VB.NET এর নালার সমতুল্য। যদিও আপনি যদি "কিছুই না" যার অর্থ "অ্যাক্সেস মডিফায়ার নয়" অর্থাত্, তবে এটি নির্ভর করে, যদিও থাম্বের একটি খুব রুক্ষ নিয়ম (অবশ্যই সি # তে) যদি আপনি স্পষ্টভাবে কোনও অ্যাক্সেস মডিফায়ার নির্দিষ্ট না করেন তবে পদ্ধতি / পরিবর্তনশীল ঘোষণাটি যতটা সম্ভব সীমাবদ্ধ থাকে । অর্থাত
public class MyClass
{
string s = "";
}
কার্যকরভাবে হিসাবে একই:
public class MyClass
{
private string s = "";
}
লিঙ্কযুক্ত এমএসডিএন নিবন্ধটি সম্পূর্ণরূপে বর্ণনার প্রস্তাব করবে যখন কোনও অ্যাক্সেস মডিফায়ার স্পষ্টভাবে নির্দিষ্ট করা হয়নি।
সর্বজনীন - যে কোনও জায়গায় যে কেউ অ্যাক্সেস করতে পারেন।
প্রাইভেট - ক্লাসের সাথেই এটি প্রবেশ করা যায় এটির একটি অংশ।
সুরক্ষিত - কেবল ক্লাসে বা ক্লাসের বাইরে উত্তরাধিকার সূত্রে প্রাপ্ত কোনও বস্তু দিয়েই অ্যাক্সেস করা যায়।
কিছুই নালার মতো নয় কিন্তু ভিবিতে।
স্ট্যাটিক মানে আপনার সেই অবজেক্টের একটি উদাহরণ রয়েছে, সেই শ্রেণীর প্রতিটি উদাহরণের জন্য পদ্ধতি।
প্রাইভেটের একটি স্থিতি নির্দেশ করে যে ভেরিয়েবলগুলি কেবল একই শ্রেণীর বস্তু দ্বারা অ্যাক্সেস করা যায়। সুরক্ষিত স্থিতি শ্রেণীর বংশধরদেরও অন্তর্ভুক্ত করার অ্যাক্সেসকে প্রসারিত করে।
"উপরের টেবিল থেকে আমরা বেসরকারী এবং সুরক্ষিত মধ্যে পার্থক্য দেখতে পাচ্ছি ... আমি মনে করি উভয়ই এক রকম .... সুতরাং এই দুটি পৃথক কমান্ডের কী দরকার"
আরও তথ্যের জন্য এমএসডিএন লিঙ্কটি পরীক্ষা করুন
এই অ্যাক্সেস পরিবর্তনকারীরা আপনার সদস্যদের কোথায় দৃশ্যমান তা নির্দিষ্ট করে। আপনার সম্ভবত এটি পড়া উচিত। আইয়েনএমএইচ প্রদত্ত লিঙ্কটি একটি সূচনা পয়েন্ট হিসাবে ধরুন।
স্ট্যাটিক সদস্যরা প্রতি ক্লাসে একজন এবং উদাহরণ হিসাবে এক নয়।
সাবধানতার সাথে আপনার ক্লাসগুলির অ্যাক্সেসযোগ্যতা দেখুন। সর্বজনীন এবং সুরক্ষিত শ্রেণি এবং পদ্ধতিগুলি ডিফল্টরূপে প্রত্যেকের জন্য অ্যাক্সেসযোগ্য।
এছাড়াও ভিজ্যুয়াল স্টুডিওতে নতুন ক্লাস তৈরি করা হলে মাইক্রোসফ্ট অ্যাক্সেস মডিফায়ারগুলি (সর্বজনীন, সুরক্ষিত, ইত্যাদি। কীওয়ার্ড) দেখানোর ক্ষেত্রে খুব একটা ব্যাখ্যা দেয় না। সুতরাং, ভাল যত্ন নিন এবং আপনার শ্রেণীর অ্যাক্সেসযোগ্যতার বিষয়ে চিন্তা করুন কারণ এটি আপনার বাস্তবায়নের অভ্যন্তরগুলির দ্বার।
আমি মনে করি এটি ভাল ওওপি ডিজাইনের সাথে সম্পর্কিত। আপনি যদি কোনও গ্রন্থাগারের বিকাশকারী হন তবে আপনি আপনার লাইব্রেরির অভ্যন্তরীণ কাজকর্মগুলি গোপন করতে চান। এইভাবে, আপনি পরে আপনার লাইব্রেরির অভ্যন্তরীণ কাজগুলি সংশোধন করতে পারেন। সুতরাং আপনি নিজের সদস্যদের এবং সহায়ক পদ্ধতিগুলি ব্যক্তিগত হিসাবে রেখেছেন এবং কেবল ইন্টারফেসের পদ্ধতিগুলিই সর্বজনীন। ওভাররাইট করা উচিত এমন পদ্ধতিগুলি সুরক্ষিত করা উচিত।
সি # এর মোট 6 অ্যাক্সেস সংশোধক রয়েছে:
ব্যক্তিগত : এই অ্যাক্সেসিবিলিটির সাথে ঘোষিত সদস্যটি ধারণিত ধরণের মধ্যে দৃশ্যমান হতে পারে, এটি কোনও উত্পন্ন ধরণের, একই সমাবেশে অন্য ধরণের বা ধারণকৃত সমাবেশের বাইরের প্রকারের জন্য দৃশ্যমান নয়। উদাহরণস্বরূপ, অ্যাক্সেস কেবলমাত্র রয়েছে এমন টাইপের মধ্যে সীমাবদ্ধ।
সুরক্ষিত : এই অ্যাক্সেসিবিলিটির সাথে ঘোষিত সদস্যটি উপস্থিত বিধানসভাটির মধ্যে থাকা রক্ষণশীল প্রকার থেকে প্রাপ্ত প্রকারগুলির এবং উপস্থিত বিধানের বাইরে থাকা উপাদানগুলি থেকে প্রাপ্ত ধরণের মধ্যে দৃশ্যমান হতে পারে। অর্থাত, অ্যাক্সেসটি ধারণক্ষম ধরণের ধরণের উত্সের মধ্যে সীমাবদ্ধ।
অভ্যন্তরীণ : এই অ্যাক্সেসিবিলিটি সহ ঘোষিত সদস্যটি এই সদস্যযুক্ত অ্যাসেমব্লির অভ্যন্তরে দৃশ্যমান হতে পারে, এটি ধারণামূলক সমাবেশের বাইরের কোনও সমাবেশে দৃশ্যমান নয়। অর্থাত্, অ্যাক্সেস কেবল সমাবেশ সম্বলিত সীমাবদ্ধ।
অভ্যন্তরীণ সুরক্ষিত : এই অ্যাক্সেসিবিলিটির সাথে ঘোষিত সদস্যটি উপস্থিত বিধানসভার অভ্যন্তরের অভ্যন্তরে বা এর বাইরে থাকা উপাদানগুলি থেকে উদ্ভূত প্রকারের মধ্যে দৃশ্যমান হতে পারে, এটি উপস্থিত সমাবেশের মধ্যে কোনও প্রকারের কাছেও দৃশ্যমান। অর্থাত্ অ্যাক্সেস কেবল সমাবেশ বা উদ্ভূত প্রকারের মধ্যে সীমাবদ্ধ।
সর্বজনীন : এই অ্যাক্সেসিবিলিটি সহ ঘোষিত সদস্যটি এই সদস্য সমন্বিত সমাবেশের মধ্যে দৃশ্যমান হতে পারে বা যে কোনও সমাবেশ রয়েছে যা সম্বলিত সমাবেশকে উল্লেখ করে। যেমন, অ্যাক্সেস সীমাবদ্ধ নয়।
সি # 7.2 অ্যাক্সেসযোগ্যতার একটি নতুন স্তর যুক্ত করছে:
ব্যক্তিগত সুরক্ষিত : এই অ্যাক্সেসিবিলিটি সহ ঘোষিত সদস্যটি সমন্বিত সমাবেশের মধ্যে এই ধারণকৃত ধরণ থেকে প্রাপ্ত প্রকারের মধ্যে দৃশ্যমান হতে পারে। এটি কোনও ধরণের ধারণক্ষম প্রকার থেকে উদ্ভূত নয় বা উপস্থিত সমাবেশের বাইরে দৃশ্যমান নয়। অর্থাত, অ্যাক্সেসটি সমন্বিত সমাবেশের মধ্যে উদ্ভূত প্রকারের মধ্যে সীমাবদ্ধ।
নতুন ব্যক্তিগত সুরক্ষিত অ্যাক্সেস মডিফায়ারের একটি নমুনা কোড সহ উত্স