কেন সি # তে যাদু পদ্ধতি প্রয়োগ করা হয়েছিল?


16

সি # তে, আমি কোনও ইন্টারফেসের ব্যাক আপ না করে এই সমস্ত যাদু পদ্ধতিগুলি পপ আপ করতে দেখছি। কেন এটি বেছে নেওয়া হয়েছিল?

আমাকে ব্যাখ্যা করতে দাও.

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

এখন, স্পষ্টতই, (কখন তা নিশ্চিত নয়), এই ইন্টারফেসগুলির আর প্রয়োজন নেই। এটির জন্য ঠিক নামকরণের রূপান্তর থাকা দরকার।

আরেকটি উদাহরণ একটি পদ্ধতি নামে না থাকার কোন বস্তুর awaitable করছে ঠিক GetAwaiter যা কয়েক নির্দিষ্ট বৈশিষ্ট্য আছে।

কেন একটি ইন্টারফেস না তারা করেছিল IEnumerableবা INotifyPropertyChangedস্ট্যাটিক্যালি এই "ম্যাজিক" ব্যাকআপ নিতে পারেন?

আমি এখানে কী বলতে চাইছি তার উপর আরও বিশদ:

http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/

যাদু পদ্ধতির সুবিধাগুলি এবং কনস কী, এবং অনলাইনে কোথাও কোথাও এমন কোনও সিদ্ধান্ত রয়েছে যেখানে এই সিদ্ধান্ত কেন নেওয়া হয়েছে সে সম্পর্কে আমি কিছু খুঁজে পেতে পারি?


4
আপনি যদি বন্ধ না হতে চান তবে "জাদু কেন খারাপ" আপনার নিজের ব্যক্তিগত মতামত সম্পাদনা করা উচিত।
ডগএম

2
যদি আপনি জানতে চান যে অ্যান্ডারস হেজলসবার্গ কেন এটি করেছে, আপনাকে তাকে জিজ্ঞাসা করতে হবে। আমি কেবল আপনাকে বলতে পারি যে আমি কেন এটি করতাম এবং এটি ফরওয়ার্ডস-সামঞ্জস্যের জন্য। এক্সটেনশন পদ্ধতিগুলি আপনাকে বিদ্যমান ধরণেরগুলিতে "জাল" পদ্ধতি যুক্ত করার অনুমতি দেয় তবে কোনও এক্সটেনশন ইন্টারফেস নেই। যদি আপনার জন্য কোনও ইন্টারফেসের প্রয়োজন হয়, বলুন, async/ await, তবে এটি কেবল কোডের সাথে কাজ করবে যা .NET 4.5 পরে কার্যকর ছিল একটি লক্ষ্যমাত্রার হয়ে ওঠার জন্য যথেষ্ট প্রসারিত হয়ে উঠেছে… যা মূলত এখন। তবে পদ্ধতি কলগুলিতে বিশুদ্ধভাবে সিনট্যাক্টিক অনুবাদ আমাকে সত্যতার awaitপরে বিদ্যমান ধরণের ক্ষেত্রে কার্যকারিতা যুক্ত করতে দেয় ।
জার্গ ডব্লু মিট্টাগ

2
নোট করুন যে এটি মূলত অবজেক্ট-ওরিয়েন্টেশন প্রয়োগ করা হয়েছে: যতক্ষণ না কোনও বস্তু যথাযথ বার্তাগুলিতে সাড়া দেয় ততক্ষণ এটি সঠিক ধরণের হিসাবে বিবেচিত হয়।
Jörg ডব্লু মিটাগ

7
আপনার "পূর্বে" এবং "এখন" পিছিয়ে রয়েছে - যাদু পদ্ধতিটি foreachপ্রথমদিকে লুপের ব্যাক কার্যকারিতা হিসাবে প্রয়োগ করা হয়েছিল । সেখানে কখনো বস্তু বাস্তবায়নে ক্ষেত্রে আবশ্যক হয়েছে IEnumerableজন্য foreachকাজ করতে। এটি সবেমাত্র এটি করার কনভেনশন হয়েছে।
জেসি সি স্লিকার 21

2
@ গুলবুলার এখান থেকেই আমি ধারণাটি পেয়েছি: ব্লগস.এমএসএনএন / বি / অ্যারিক্লিপার্ট / অর্চিভ / ২০১ive / ২০১6 / 06/30 / ......... (এবং কিছুটা কম পরিমাণে এরিক্লিপার্ট.কম / 2013/03/22/… )
জেসি সি স্লিকার 2

উত্তর:


16

সাধারণত "ম্যাজিক পদ্ধতি" ব্যবহার করা হয় যখন কোনও ইন্টারফেস তৈরি করা সম্ভব হয় না যা একইভাবে কাজ করবে।

foreachসি # 1.0 এ প্রথম যখন পরিচয় হয়েছিল (সেই আচরণটি অবশ্যই সাম্প্রতিক কিছু নয়), এর জন্য যাদু পদ্ধতিগুলি ব্যবহার করতে হয়েছিল, কারণ কোনও জেনেরিক ছিল না। মূলত বিকল্পগুলি হ'ল:

  1. নন-জেনেরিক ব্যবহার করুন IEnumerable এবং IEnumeratorএটি objectএস এর সাথে কাজ করে , যার অর্থ বক্সিং মানের ধরণের। যেহেতু এর তালিকার মতো কোনও কিছুর পুনরাবৃত্তি intখুব দ্রুত হওয়া উচিত এবং অবশ্যই প্রচুর আবর্জনা বাক্সযুক্ত মান তৈরি করা উচিত নয়, এটি ভাল পছন্দ নয়।

  2. জেনেরিকের জন্য অপেক্ষা করুন। এর অর্থ সম্ভবত বিলম্ব করা হবে। নেট 1.0 (বা কমপক্ষে foreach) 3 বছরেরও বেশি সময় ধরে।

  3. যাদু পদ্ধতি ব্যবহার করুন।

সুতরাং, তারা বিকল্প # 3 বেছে নিয়েছে এবং এটি পিছনে সামঞ্জস্যতার কারণে আমাদের সাথে থেকে গেছে, যদিও নেট নেট ২.০, প্রয়োজনীয় IEnumerable<T> কাজ করবে।


সংগ্রহের প্রারম্ভিকগণ প্রতিটি সংগ্রহের ধরণে আলাদা দেখতে পারেন। তুলনা করাList<T> :

public void Add(T item)

এবং Dictionary<TKey, TValue> :

public void Add(TKey key, TValue value)

আপনার কোনও একক ইন্টারফেস থাকতে পারে না যা কেবলমাত্র প্রথম ফর্মটির জন্য সমর্থন করবে List<T> এবং কেবল দ্বিতীয়টির জন্য সমর্থন করবে Dictionary<TKey, TValue>


লিনকিউ পদ্ধতিগুলি সাধারণত এক্সটেনশন পদ্ধতি হিসাবে প্রয়োগ করা হয় (যাতে প্রয়োগ করা সমস্ত ধরণের জন্য যেমন লিংক টু অবজেক্টের কেবলমাত্র একক প্রয়োগ হতে পারে IEnumerable<T>) যার অর্থ ইন্টারফেস ব্যবহার করা সম্ভব নয়।


জন্য await, GetResult()পদ্ধতিটি হয় voidবা কোনও প্রকারে ফিরে আসতে পারে T। আবার, আপনার কাছে একটি একক ইন্টারফেস থাকতে পারে না যা উভয়ই পরিচালনা করতে পারে। যদিও awaitআংশিকভাবে ইন্টারফেস-ভিত্তিক: প্রতীক্ষককে প্রয়োগ INotifyCompletionকরতে হবে এবং প্রয়োগ করতেও পারে ICriticalNotifyCompletion


1
আপনি কি নিশ্চিত হন যে তারা সি # 1.0 এর জন্য "তারা বিকল্প # 3" পছন্দ করেছেন? আমার স্মৃতিচারণ এটি হ'ল বিকল্পটি ১ 1. এটি দাবি করা হয়েছিল, সি # কোডটি কোডটি জাভাটির চেয়ে আংশিক কারণে এর চেয়ে অনেক ভাল কাজ করে fore
গবলার

1
foreachসি # 1.2 এর জন্য ডকুমেন্টেশন (সি # 1.0 এর জন্য এমএসডিএন-তে কিছুই নেই) বলছে যে foreach"প্রয়োগ করে এমন কোনও ধরণের মূল্যায়ন IEnumerableযা কোনও GetEnumeratorপদ্ধতি ঘোষনা করে ।" এবং আমি নিশ্চিত না যে আপনি কী বোঝাতে চেয়েছেন, আনবক্সিং সি # তে সর্বদা স্পষ্ট থাকে।
সোভিক

1
@ গাবলুমার এবং ডিসি ২০০১ থেকে সি # এর জন্য ইসিএমএ স্পেসিফিকেশন (যার অর্থ এটি সি # 1.0 এর জন্য রয়েছে) আরও বলেছে যে (§15.8.4): "একটি টাইপ সি একটি সংগ্রহের ধরণ হিসাবে বলা হয় যদি এটি সিস্টেমটি প্রয়োগ করে I বা নীচের সমস্ত মানদণ্ড পূরণ করে সংগ্রহের ধরণটি প্রয়োগ করে […] ”।
এসভিচ

1
@ এসভিক সিকোয়েন্সের উপাদানগুলিতে foreach(T x in sequence)সুস্পষ্ট ক্যাসেট প্রয়োগ Tকরে। সুতরাং যদি সিকোয়েন্সটি কোনও সমতল IEnumerableএবং Tমান ধরণের হয় তবে তা আপনার কোডে কোনও স্পষ্ট কাস্ট না লিখে আনবক্স করবে। সি # এর একটি কুরুচিপূর্ণ অংশ।
কোডসইনচাউস

@ কোডসআইনচোওস "অটো-আনবক্সিং" বেশ সাধারণ মনে হচ্ছে, আমি বুঝতে পারি নি যে এটি এই নির্দিষ্ট বৈশিষ্ট্যটির উল্লেখ করেছে। (আমি অনুমান করি আমার থাকা উচিত, যেহেতু আমরা কথা বলছিলাম foreach))
সুইভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.