একটি এমএসআইএল পদ্ধতিতে হিডবাইসিগের উদ্দেশ্য কী?


92

ইল্ডাসম এবং একটি সি # প্রোগ্রাম ব্যবহার করে যেমন

static void Main(string[] args)
{

}

দেয়:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       2 (0x2)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ret
} // end of method Program::Main

হিডবাইসীগ কী নির্মাণ করে?

উত্তর:


156

ইসিএমএ 335 থেকে বিভাগ 1 এর 8.10.4 ধারা:

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

(এটি অবিলম্বে এটি থেকে পরিষ্কার নয়, তবে এর hidebysigঅর্থ "নাম এবং স্বাক্ষর দ্বারা আড়াল করুন"))

বিভাগ 2 এর 15.4.2.2 বিভাগেও:

লুকোচুরিটি সরঞ্জামগুলির ব্যবহারের জন্য সরবরাহ করা হয় এবং VES দ্বারা উপেক্ষা করা হয়। এটি সুনির্দিষ্ট করে যে ঘোষিত পদ্ধতিটি বেস শ্রেণীর ধরণের সমস্ত পদ্ধতি গোপন করে যা একটি মেলে পদ্ধতি পদ্ধতির স্বাক্ষরযুক্ত; বাদ দেওয়া হলে, স্বাক্ষর নির্বিশেষে পদ্ধতিতে একই নামের সমস্ত পদ্ধতি লুকানো উচিত।

উদাহরণ হিসাবে, ধরুন আপনার কাছে রয়েছে:

public class Base
{
    public void Bar()
    {
    }
}

public class Derived : Base
{
    public void Bar(string x)
    {
    }
}

...

Derived d = new Derived();
d.Bar();

এটি বৈধ, কারণ আড়াল Bar(string) হয় নাBar() , কারণ সি # সংকলক ব্যবহার করে hidebysig। যদি এটি শব্দার্থবিজ্ঞানের "নাম দ্বারা আড়াল করুন" ব্যবহার করে, আপনি Bar()প্রকারের কোনও রেফারেন্সে একেবারেই কল করতে সক্ষম হবেন না Derived, যদিও আপনি এখনও এটি বেসে ফেলে দিতে পারেন এবং সেভাবে কল করতে পারেন।

সম্পাদনা করুন: আমি শুধু একটি ডিএলএল উপরে কোড কম্পাইল, এটা ildasming, সরিয়ে এটির চেষ্টা করেছি hidebysigজন্য Bar()এবং Bar(string), এটা আবার ilasming, তারপর কল করতে চাইছেন Bar()অন্যান্য কোড থেকে:

Derived d = new Derived();
d.Bar();

Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments

যাহোক:

Base d = new Derived();
d.Bar();

(কোনও সংকলনের সমস্যা নেই))


4
ইন সারসংক্ষেপ , এটা পার্থক্য Shadowsএবং OverloadsVB.NET হবে।
মার্ক হার্ট

15

এসকিইটির উত্তর অনুসারে, এর কারণ হ'ল জাভা এবং সি # শ্রেণীর ক্লায়েন্টকে বেস নামের ক্লাসগুলি সহ একই নামে কোনও পদ্ধতি কল করার অনুমতি দেয়। যদিও সি ++ দেয় না: উত্পন্ন শ্রেণি যদি বেস শ্রেণিতে একটি পদ্ধতি হিসাবে একই নামের সাথে একটি একক পদ্ধতিও সংজ্ঞায়িত করে, তবে ক্লায়েন্ট সরাসরি বেস ক্লাস পদ্ধতিটি কল করতে পারে না, এমনকি যদি এটি একই আর্গুমেন্ট না নেয়। সুতরাং ওভারলোডিংয়ের উভয় পদ্ধতির সমর্থন করার জন্য বৈশিষ্ট্যটি সিআইএল-এ অন্তর্ভুক্ত করা হয়েছিল।

সি ++ তে আপনি কার্যকরভাবে কোনও usingনির্দেশের সাহায্যে বেস শ্রেণি থেকে ওভারলোডের একটি নামক সেট আমদানি করতে পারেন , যাতে তারা সেই পদ্ধতির নামের জন্য "ওভারলোড সেট" এর অংশ হয়ে যায়।


1

মাইক্রোসফ্ট ডক্স অনুসারে

যখন প্রাপ্ত কোনও শ্রেণীর সদস্যকে সি # newমোডিফায়ার বা ভিজ্যুয়াল বেসিক Shadowsসংশোধক দিয়ে ঘোষনা করা হয় , এটি একই নামের কোনও সদস্যকে বেস শ্রেণিতে লুকিয়ে রাখতে পারে। সি # স্বাক্ষর দ্বারা বেস শ্রেণীর সদস্যদের গোপন করে। এটি হ'ল, যদি বেস শ্রেণীর সদস্যের একাধিক ওভারলোড থাকে তবে কেবল যেটি গোপন থাকে তা হ'ল অভিন্ন স্বাক্ষর। বিপরীতে, ভিজ্যুয়াল বেসিক সমস্ত বেস শ্রেণীর ওভারলোডগুলি আড়াল করে। সুতরাং, ইসহাইডবিসিগfalse ভিজ্যুয়াল বেসিক Shadows সংশোধক trueসহ ঘোষিত সদস্য এবং সি # newসংশোধক হিসাবে ঘোষিত সদস্যের কাছে প্রত্যাবর্তন করে ।

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