সি # /। নেট-এ কেবলমাত্র নেমস্পেসের শ্রেণীর দৃশ্যমানতা?


88

সি # তে, আপনি কোনও পৃথক সমাবেশে বাস না করে কেবল কোনও নিজস্ব নামকক্ষেত্রে কোনও শ্রেণি দৃশ্যমান করতে পারবেন? এটি সাধারণ সহায়ক শ্রেণীর জন্য দরকারী বলে মনে হয় যা অন্য কোথাও ব্যবহার করা উচিত নয়। (যেমন জাভা প্যাকেজ-ব্যক্তিগত ক্লাসগুলি কী বলে)


আমি আপনার প্রশ্ন বুঝতে পারি না। আমি আমার উত্তরগুলি সরিয়ে দিয়েছি কারণ আপনি "অভ্যন্তরীণ" মানে না?
— জাইফ্রাক্স

4
@ নোস: আপনি কি জাভা-র প্যাকেজ-স্তরের দৃশ্যমানতার সমতুল্য সন্ধান করছেন?
— জন স্যান্ডার্স

উত্তর:



80

আপনি ক্লাস করতে পারেন internalতবে এটি কেবল সমাবেশের বাইরের কাউকেই ক্লাস ব্যবহার থেকে বিরত রাখে। তবে আপনি যে নামটি দিয়ে এটি করতে চান তার জন্য আপনাকে আলাদা আলাদা সংসদ তৈরি করতে হবে। আমি ধরে নিচ্ছি এই কারণেই আপনি এটি করতে চান না।

নেমস্পেসের দৃশ্যমানতা প্রয়োগের জন্য সি # সংকলক প্রাপ্ত iler

এখানে একটি নিবন্ধ রয়েছে ( সি # তে নেমস্পেসের দৃশ্যমানতা ) যা "জাল নামস্থান" এর ফর্ম হিসাবে আংশিক ক্লাস ব্যবহার করার একটি পদ্ধতি দেখায় যা আপনি সহায়ক হতে পারেন।

লেখক উল্লেখ করেছেন যে এটি পুরোপুরি কার্যকর হয় না এবং তিনি ত্রুটিগুলি নিয়ে আলোচনা করেন। মূল সমস্যাটি হ'ল সি # ডিজাইনাররা সি # এইভাবে কাজ না করার জন্য ডিজাইন করেছিলেন । এটি সি # /। নেটগুলিতে প্রত্যাশিত কোডিং অনুশীলনগুলি থেকে প্রচুর পরিমাণে বিচ্যুত হয়, যা নেট নেট ফ্রেমওয়ার্কের বৃহত্তম সুবিধা।

এটি একটি ঝরঝরে কৌশল ... এখন এটি করবেন না ।


4
System.Net.Mime.MediaTypeNames.Application
— সবেমাত্র

নিবন্ধটি বলেছে যে আপনার প্রতিটি নামকে আপনার "নেমস্পেস" নামের সাথে উপস্থাপন করতে হবে, তবে আপনার সি # 6 "স্ট্যাটিক ব্যবহার" এর সাথে এটির দরকার নেই। আপনি "নেমস্পেস" কে একটি স্ট্যাটিক আংশিক শ্রেণী করতে পারেন এবং তারপরে ক্লায়েন্ট
— কোডটিতে

@ পুমক্কো 'স্ট্যাটিক ব্যবহার করে' বিবৃতিটি ব্যবহার করতে সক্ষম হতে ক্লাসটির অচল হওয়ার দরকার নেই, যদিও আপনি যদি এটি একটি নেমস্পেস হিসাবে ব্যবহার করেন তবে তা যাইহোক হওয়া উচিত।
— অস্পষ্ট যুক্তি

21

অভ্যন্তরীণ হয় সমাবেশ (কঠোরভাবে মডিউল) বলুন গোপনীয়তা নেমস্পেসের দৃশ্যমানতার উপর এর কোনও প্রভাব নেই।

একই অ্যাসেমব্লির মধ্যে অন্য শ্রেণি থেকে কোনও শ্রেণীর গোপনীয়তা অর্জনের একমাত্র উপায় হ'ল কোনও শ্রেণীর অভ্যন্তরীণ শ্রেণি।

এই মুহুর্তে যদি শ্রেণিটি ব্যক্তিগত হয় তবে এটি কোনও শ্রেণীর অদৃশ্য বা বাহ্যিক শ্রেণীর নিজেই নয়।

সুরক্ষিত থাকলে এটি প্রত্যেকের কাছে দৃশ্যমান যা ব্যক্তিগত যখন এটি দেখতে পেত তবে বহিরাগত শ্রেণীর উপ শ্রেণীর কাছেও দৃশ্যমান।

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}

মূলত আপনি যা চান তা অর্জনের একমাত্র উপায় হ'ল বাইরের শ্রেণিকে নাম স্থানের রূপ হিসাবে ব্যবহার করা এবং সেই শ্রেণীর মধ্যে সীমাবদ্ধ।


@ শুগিওউক: পাবলিক ক্লাস সাব: আউটারকে সিল করা উচিত পাবলিক ক্লাস সাব: আউটার ??? যদিও +1 ... এটি আমার পক্ষে কাজ করে
— IAbstract

0

আপনার যদি একটি একক সমাবেশ হয় তবে আপনি যে সমাবেশটি চান তার যতগুলি নামফলক সংজ্ঞায়িত করতে পারেন তবে আইডিইতে আপনি যে কোনও সংশোধক প্রয়োগ করেন তা বিবেচনা না করে আপনি সর্বদা অন্যান্য নেমস্পেসের ক্লাসগুলি দেখতে সক্ষম হবেন।


0

এটি সরাসরি সম্ভব কিনা তা নিশ্চিত নয় তবে এটি জাল করার কয়েকটি ভাল উপায় হ'ল:

1) এই ধরণের স্টাফগুলির প্রয়োজনীয় ক্লাসগুলি একটি একক শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত যা একটি অভ্যন্তরীণ শ্রেণি হিসাবে সহায়ক শ্রেণি রয়েছে।

2) এক্সটেনশন পদ্ধতিগুলি ব্যবহার করুন এবং তারপরে কেবলমাত্র নামের জায়গার মধ্যে এক্সটেনশন পদ্ধতিগুলি উল্লেখ করুন।

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