ফাংশন প্যারামিটারে "এটি"


88

এইচটিএমএলহেল্পার্সের জন্য কয়েকটি কোড উদাহরণের দিকে তাকানো এবং আমি ঘোষণাগুলি দেখতে যা দেখতে দেখতে পাই:

public static string HelperName(this HtmlHelper htmlHelper, ...more regular params )

আমি অন্য কোথাও এই ধরণের নির্মাণ দেখে মনে করতে পারি না - কেউ "এই" এর উদ্দেশ্য ব্যাখ্যা করতে পারে? আমি ভেবেছিলাম যে কোনও কিছুকে পাবলিক স্ট্যাটিক ঘোষণা করার অর্থ এই হয়েছিল যে ক্লাসটি তাত্ক্ষণিকভাবে চালানোর দরকার নেই - তবে এই ক্ষেত্রে "এটি" কী?

উত্তর:


214

এটি এক্সটেনশন পদ্ধতিগুলি ঘোষণা করার সিনট্যাক্স, সি # 3.0 এর একটি নতুন বৈশিষ্ট্য।

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

আমাকে একটি উদাহরণ দিতে দাও।

স্ট্রিং ক্লাসে এমন কোনও পদ্ধতি নেই যার নাম গোব্বলগোবল, সুতরাং আসুন একটি এক্সটেনশন পদ্ধতি তৈরি করুন:

public static class StringExtensions
{
    public static void GobbleGobble(this string s)
    {
        Console.Out.WriteLine("Gobble Gobble, " + s);
    }
}

শ্রেণীর নামটি কেবল আমার নামকরণের কনভেনশন, এটির মতো নামকরণের প্রয়োজন নেই, তবে পদ্ধতি হিসাবে এটি স্থির থাকতে হবে।

উপরের পদ্ধতিটি ঘোষণার পরে, আপনি ভিজ্যুয়াল স্টুডিওতে এটি টাইপ করতে পারেন:

String s = "Turkey Baster!";
s.

বিন্দুর পরে, ইন্টেলিজেন্সের জন্য অপেক্ষা করুন, এবং লক্ষ্য করুন যে সেখানে একটি গাবলগোবল পদ্ধতি রয়েছে, কোডটি এইভাবে সম্পূর্ণ করুন:

String s = "Turkey Baster!";
s.GobbleGobble();

গুরুত্বপূর্ণ : ক্লাসটি যেখানে এক্সটেনশন পদ্ধতি হিসাবে ঘোষিত হয়েছে তা পদ্ধতিটি দেখানোর জন্য ইন্টেলিসেন্সের জন্য বর্ধিত সংকলক এবং ইন্টেলিসেন্স প্রসেসরের অবশ্যই উপলব্ধ। যদি আপনি নিজেই গোব্বলগোবলে টাইপ করেন এবং Ctrl+ .শর্টকাট ব্যবহার করেন তবে এটি আপনাকে ফাইলটিতে ডাইরেক্টিভগুলি ব্যবহার করে সঠিকভাবে পেতে সহায়তা করবে না।

লক্ষ্য করুন যে পদ্ধতিটির প্যারামিটারটি অদৃশ্য হয়ে গেছে। সংকলকটি নীরবে গুরুত্বপূর্ণ বিটগুলির চারপাশে চলে যাবে, যা হ'ল:

String s = "Turkey Baster!";
s.GobbleGobble();
^     ^
|     +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method

সুতরাং, উপরোক্ত কোডটি সংকলক দ্বারা এটিতে রূপান্তরিত হবে:

String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);

সুতরাং কল-টাইমে, এটি সম্পর্কে যাদুকর কিছুই নেই, এটি কেবল একটি স্ট্যাটিক পদ্ধতিতে কল।

মনে রাখবেন যে যদি আপনার এক্সটেনশন পদ্ধতিটি একাধিক প্যারামিটার ঘোষণা করে তবে কেবল প্রথমটি thisসংশোধনকারীকে সমর্থন করে এবং বাকিটি সাধারণভাবে পদ্ধতি কলের অংশ হিসাবে নির্দিষ্ট করতে হবে:

public static void GobbleGobble(this string value, string extra)
{                                            |              |
    ...                                      |              |
}                                            |              |
                                             |              |
+--------------------------------------------+              |
|                                                           |
v                                                           |
s.GobbleGobble("extra goes here");                          |
                        ^                                   |
                        |                                   |
                        +-----------------------------------+

লিনকের কারণে কিছু অংশে এক্সটেনশান পদ্ধতি যুক্ত করা হয়েছিল, যেখানে সি # এর লিনক সিনট্যাক্স খেলতে থাকা বস্তুর জন্য যথাযথভাবে নামকরণের এক্সটেনশন পদ্ধতিগুলি সন্ধান করবে, যার অর্থ আপনি সঠিক প্রসারকে ঘোষণা করে কোনও ধরনের শ্রেণিতে লিনক-সমর্থন "পরিচয়" করতে পারবেন পদ্ধতি। অবশ্যই, পূর্ণ লিনক সমর্থন অনেক কাজ, তবে এটি সম্ভব।

এছাড়াও, নিজের দ্বারা বর্ধিতকরণ পদ্ধতিগুলি সত্যিই দরকারী, তাই এটি পড়ুন।

এখানে কয়েকটি লিঙ্ক রয়েছে:


6
আমি অবশ্যই "গব্বল গব্বল ম্যাজিক" শব্দটি ব্যবহার করা শুরু করব।
ক্রিস

ইউটিউব আবারও লিঙ্কটি ভেঙেছে, youtube.com/watch?v=Bz_heb9Rz2g , এখনও @ 1: 00 এ এবং তার পরেও।
লাসে ভি কার্লসেন

এই ধরণের সংকলক যাদুগুলি একটি ভাষা শিখতে অসুবিধে করে।
ডন দিলঙ্গা

8

এক্সটেনশন পদ্ধতির পরে, আমি এগুলিকে পাগলের মতো ব্যবহার করছি .. এখানে আমি নিয়মিত ব্যবহার করছি এমন কয়েকটি ..

public static T ChangeType<T>(this object obj)
{
  return (T)Convert.ChangeType(obj, typeof(T));
}

এই মত কাজ করে ..

int i = "123".ChangeType<int>();
bool valid = "bool".ChangeType<bool>();
int id = dataSet.Tables[0].Rows[0]["Id"].ChangeType<int>();

হ্যাঁ, এটি প্রতিটি একক অবজেক্টের উপরে প্রদর্শিত, বিরক্তিকর হতে পারে তবে যেহেতু আমি এটি প্রতিটি ডাটা টাইপের জন্য ব্যবহার করি, তাই এটি প্রতিটি ডাটা টাইপের জন্য এটির সদৃশ করার চেয়ে কেবল এটি কোনও বস্তু সংযুক্ত করতে সহায়তা করে।

public static string ToXml(this object serializableObject)
{
    var aMemStr = new MemoryStream();
    try
    {
        var serializer = new XmlSerializer(serializableObject.GetType());
        serializer.Serialize(new XmlTextWriter(aMemStr, null), serializableObject);
        return Encoding.UTF8.GetString(aMemStr.ToArray());
    }
    finally { if (aMemStr != null) { aMemStr.Dispose(); } }
}

string xml = dataSet.ToXml();

public static T ToObject<T>(this string xmlString)
{
    var aStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString));
    try { return (T)new XmlSerializer(typeof(T)).Deserialize(aStream); }
    finally { if (aStream != null) { aStream.Dispose(); aStream = null; } }
}

DataSet dataSet = xml.ToObject<DataSet>();

6

এটি এক্সটেনশনমিথদের জন্য ব্যবহৃত হয়। মূলত আপনি এইচটিএমএল হেল্পার অবজেক্টে হেল্পেরনামকে 'আঠালো' করেন যাতে আপনি বলতে পারেন:

new HtmlHelper().HelperName(...more regular params);

4

এটি একটি এক্সটেনশন পদ্ধতি হবে। মূল ক্লাসের বাইরে থাকা স্থিতিশীল পদ্ধতিগুলির মাধ্যমে তারা আপনাকে কোনও শ্রেণি "বাড়ানোর" অনুমতি দেয়।

উদাহরণস্বরূপ, বলুন যে আপনার কাছে একটি সহায়ক স্ট্রিং পদ্ধতি রয়েছে যা আপনি সর্বদা ব্যবহার করেন ...

public int CountAllAs(string orig)
{
    return orig.ToLowerInvariant().ToArray().Count(c => c == 'a');
}

এবং আপনি এটি কল ...

string allAs = "aaaA";
int count = CountAllAs(allAs);

এটা খুব খারাপ না. তবে একটি ছোট পরিবর্তন দিয়ে আপনি এটিকে একটি এক্সটেনশন পদ্ধতিতে পরিণত করতে পারেন এবং কলটি কিছুটা সুন্দর হবে:

public static int CountAllAs(this string orig)
{
    return orig.ToLowerInvariant().ToArray().Count(c => c == 'a');
}

এবং তারপর এটি কল ...

string allAs = "aaaA";
int count = allAs.CountAllAs();

3

এক্সটেনশন পদ্ধতি ...

... কার্যকারিতা অন্তর্ভুক্ত করার একটি দুর্দান্ত উপায় হ'ল আপনি যেখানে ডেকরেটার প্যাটার্নটি ব্যবহার করছেন তবে আপনার সমস্ত কোড রিফ্যাক্টর করার ব্যথা বা সাধারণ কোনও আলাদা নাম ব্যবহারের ব্যথা ব্যতীত।

public static class Extensions
{
     public static string RemoveComma(this string value)
     {
         if (value == null) throw new ArgumentNullException("value");
        return value.Replace(",", "");
    }
}  

সুতরাং আপনি আপনার অ্যাপ্লিকেশনের যে কোনও জায়গায় এই কোডটি ব্যবহার করতে পারেন।

Console.WriteLine(“Hello, My, Friend”.RemoveComma())

>> Hello My Friend

সুতরাং এই কমান্ড অ্যাট্রিবিউটটির অর্থ সেই প্রকারটি যা এক্সটেনশনটি "যুক্ত" হবে এবং আপনাকে মানটির সাথে এমনভাবে কাজ করতে দেয় যেন এটি প্যারামিটার হিসাবে পাস হয়েছিল।

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