সি # তে কীভাবে ইনলাইন ফাংশন করা যায়


98

আমি লিনক টু এক্সএমএল ব্যবহার করছি

new XElement("Prefix", Prefix == null ? "" : Prefix)

তবে এক্সএলএমএল যুক্ত করার আগে আমি উপসর্গটিতে কিছু গণনা করতে চাই, যেমন স্পেসস, বিশেষ অক্ষর, কিছু গণনা ইত্যাদি নির্মূল করা etc

আমি ফাংশন তৈরি করতে চাই না কারণ এগুলি আমার প্রোগ্রামের অন্য কোনও অংশে কোনও সহায়ক হবে না তবে এটি, সুতরাং ইনলাইন ফাংশনগুলি তৈরি করার কোনও উপায় আছে ??


4
নিজেকে কোনও ক্রিয়াকলাপ তৈরি করা থেকে বিরত করবেন না কারণ এটি অন্য কোনও জায়গা থেকে ডাকা হবে না। কোডগুলি সাফ করার জন্য ফাংশনগুলিও ব্যবহার করা যেতে পারে (যদি আপনার বেশ কয়েকটি পৃষ্ঠাগুলির বিস্তৃত একটি বৃহত পদ্ধতি থাকে যা এটি ফাংশনগুলিতে বিভক্ত করে তোলে এটি আরও পাঠযোগ্য করে তোলে) এবং স্ব দস্তাবেজ (কেবলমাত্র কোনও ফাংশনটির নামকরণ পাঠকের কাছে তথ্য পৌঁছে দিতে পারে))
— জো

14
আপনি যদি গুগল থেকে এখানে এসেছেন এবং সি # তে কীভাবে ইনলাইন ফাংশনগুলি অনুকরণ করতে হয় তা জানতে চাইলে এখানে যান: stackoverflow.com/questions/473782/inline-funifications-in-c নীচের উত্তরগুলি "ইনলাইন" ফাংশনগুলির সাথে সম্পর্কিত নয় শব্দের সত্যিকার অর্থে এবং সি # এর সত্যিকারের ইনলাইন ফাংশন নেই তবে উপরের লিঙ্কটি একটি সংকলক অপ্টিমাইজেশন সরবরাহ করে যা ব্যবহার করা যেতে পারে।
— জেমসহক্স

ধন্যবাদ জেমস, প্রশ্নের শিরোনাম বরং সত্যই বিভ্রান্ত করছে।
— জার শারদান

উত্তর:


227

হ্যাঁ, সি # এটি সমর্থন করে। বেশ কয়েকটি সিনট্যাক্স উপলব্ধ।

  • বেনামে পদ্ধতি সি # 2.0 তে যুক্ত করা হয়েছিল:

    Func<int, int, int> add = delegate(int x, int y)
    {
        return x + y;
    };
    Action<int> print = delegate(int x)
    {
        Console.WriteLine(x);
    }
    Action<int> helloWorld = delegate // parameters can be elided if ignored
    {
        Console.WriteLine("Hello world!");
    }
    
  • লাম্বদাস সি # 3.0 এ নতুন এবং দুটি স্বাদে আসে।

    • এক্সপ্রেশন ল্যাম্বডাস:

      Func<int, int, int> add = (int x, int y) => x + y; // or...
      Func<int, int, int> add = (x, y) => x + y; // types are inferred by the compiler
      
    • বিবৃতি ল্যাম্বডাস:

      Action<int> print = (int x) => { Console.WriteLine(x); };
      Action<int> print = x => { Console.WriteLine(x); }; // inferred types
      Func<int, int, int> add = (x, y) => { return x + y; };
      
  • স্থানীয় ফাংশনগুলি সি # 7.0 এর সাথে চালু করা হয়েছে:

    int add(int x, int y) => x + y;
    void print(int x) { Console.WriteLine(x); }
    

এগুলির জন্য মূলত দুটি ভিন্ন ধরণের রয়েছে: Funcএবং Action। Funcএর রিটার্ন মানগুলি কিন্তু Actionনা। এ এর শেষ প্রকারের প্যারামিটারটি Funcরিটার্ন টাইপ; অন্য সবগুলি প্যারামিটারের ধরণ।

বিভিন্ন নামের সাথে একই ধরণের রয়েছে তবে তাদের ইনলাইন ঘোষণার জন্য সিনট্যাক্স একই। এর একটি উদাহরণ Comparison<T>, যা মোটামুটি সমান Func<T, T, int>।

Func<string, string, int> compare1 = (l,r) => 1;
Comparison<string> compare2 = (l, r) => 1;
Comparison<string> compare3 = compare1; // this one only works from C# 4.0 onwards

এগুলিকে সরাসরি অনুরোধ করা যেতে পারে যেন এগুলি নিয়মিত পদ্ধতি ছিল:

int x = add(23, 17); // x == 40
print(x); // outputs 40
helloWorld(x); // helloWorld has one int parameter declared: Action<int>
               // even though it does not make any use of it.

4
আমি এই উত্তর বুঝতে পারি না। তার উদাহরণে, তিনি নতুন এক্সইলিমেন্ট ("উপসর্গ", উপসর্গ => নতুনপ্রফিক্স) ইনলাইন ঘোষিত চান। এই সমস্ত উত্তর একটি নতুন ফাংশন ঘোষণার পরিমাণ। শুধু একটি নতুন ফাংশন ঘোষণা করবেন না কেন?
— ম্যাথু জেমস ডেভিস

4
কারণ: 1. পদ্ধতিগতভাবে পড়ার ইনলাইন ফাংশনটির যুক্তি বোঝার জন্য বিভিন্ন ঘোষণাপত্র অনুসন্ধান করার চেয়ে অনেক সহজ 2. প্রায়শই ইনলাইন ফাংশনগুলি ব্যবহার করার সময় আপনাকে কম কোড লিখতে হবে
— ভোলডিমিয়ার

35

সি # 7 স্থানীয় ক্রিয়াকলাপগুলির জন্য সমর্থন যোগ করে

স্থানীয় ফাংশন ব্যবহার করে এখানে পূর্ববর্তী উদাহরণ দেওয়া আছে

void Method()
{
    string localFunction(string source)
    {
        // add your functionality here
        return source ;
    };

   // call the inline function
   localFunction("prefix");
}

29

"ইনলাইন ফাংশন" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে আপনার প্রশ্নের উত্তর হ্যাঁ এবং না। আপনি যদি এই শব্দটি সি ++ বিকাশের মতো ব্যবহার করেন তবে উত্তরটি হ'ল না, আপনি এটি করতে পারবেন না - এমনকি ল্যাম্বডা এক্সপ্রেশনটি একটি ফাংশন কল। যদিও এটি সত্য যে আপনি সি # তে ফাংশন ঘোষণাগুলি প্রতিস্থাপন করতে ইনলাইন ল্যাম্বডা এক্সপ্রেশনগুলি সংজ্ঞায়িত করতে পারেন, সংকলকটি এখনও একটি বেনামী ফাংশন তৈরি করে শেষ করে।

এটি পরীক্ষা করার জন্য আমি এখানে ব্যবহার করেছি এমন কিছু সাধারণ কোড (VS2015):

    static void Main(string[] args)
    {
        Func<int, int> incr = a => a + 1;
        Console.WriteLine($"P1 = {incr(5)}");
    }

সংকলকটি কী উত্পন্ন করে? আমি আইএলএসপিএস নামে একটি নিফটি সরঞ্জাম ব্যবহার করেছি যা প্রকৃত আইএল সমাবেশ উত্পন্ন দেখায়। একবার দেখুন (আমি অনেকগুলি ক্লাস সেটআপ স্টাফ বাদ দিয়েছি)

এটি প্রধান কাজ:

        IL_001f: stloc.0
        IL_0020: ldstr "P1 = {0}"
        IL_0025: ldloc.0
        IL_0026: ldc.i4.5
        IL_0027: callvirt instance !1 class [mscorlib]System.Func`2<int32, int32>::Invoke(!0)
        IL_002c: box [mscorlib]System.Int32
        IL_0031: call string [mscorlib]System.String::Format(string, object)
        IL_0036: call void [mscorlib]System.Console::WriteLine(string)
        IL_003b: ret

এই লাইনগুলি IL_0026 এবং IL_0027 দেখুন? এই দুটি নির্দেশাবলী 5 নম্বর লোড এবং একটি ফাংশন কল। তারপরে IL_0031 এবং IL_0036 ফর্ম্যাট করুন এবং ফলাফলটি মুদ্রণ করুন।

এবং এখানে ফাংশন বলা হয়:

        .method assembly hidebysig 
            instance int32 '<Main>b__0_0' (
                int32 a
            ) cil managed 
        {
            // Method begins at RVA 0x20ac
            // Code size 4 (0x4)
            .maxstack 8

            IL_0000: ldarg.1
            IL_0001: ldc.i4.1
            IL_0002: add
            IL_0003: ret
        } // end of method '<>c'::'<Main>b__0_0'

এটি সত্যিই একটি সংক্ষিপ্ত ফাংশন, তবে এটি একটি ফাংশন।

এটি কি অপ্টিমাইজ করার কোনও প্রচেষ্টা মূল্য? নাহ। হতে পারে আপনি যদি এটি কয়েক সেকেন্ডে কয়েকবার কল করে থাকেন তবে যদি পারফরম্যান্সটি গুরুত্বপূর্ণ হয় তবে কাজটি করার জন্য আপনার সি / সি ++ তে লিখিত নেটিভ কোডটি কল করা বিবেচনা করা উচিত।

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

"অকালীন অপটিমাইজেশন হ'ল প্রোগ্রামিংয়ে সমস্ত মন্দ (বা এর বেশিরভাগ অংশে) এর মূলে" " - ডোনাল্ড নুথ

"এমন একটি প্রোগ্রাম যা সঠিকভাবে চালিত হয় না তার দ্রুত চালানোর প্রয়োজন হয় না" - মি


4
সি # ফাংশনগুলি ইনলাইন করার জন্য এটি শীর্ষস্থানীয় গুগল হিট। আপনি বলছেন "সম্ভবত আপনি যদি এটি সেকেন্ডে কয়েকবার কল করে" এবং কী অনুমান করুন - আমি এটিকে সেকেন্ডে 4 মিলিয়ন বার কল করছি, তাই হ্যাঁ ... ইনলাইনিং সম্ভবত দরকারী হবে (এবং কোড পাঠযোগ্যতা বনাম কী পরিমাণ বাড়িয়ে তোলে? আমি করতে যাচ্ছি: ১ function টি স্থানে একটি ফাংশনের ম্যানুয়াল তালিকাভুক্তকরণ)।
— আদম

17

হ্যাঁ.

আপনি বেনামে পদ্ধতি বা ল্যাম্বডা এক্সপ্রেশন তৈরি করতে পারেন :

Func<string, string> PrefixTrimmer = delegate(string x) {
    return x ?? "";
};
Func<string, string> PrefixTrimmer = x => x ?? "";

আপনার উত্তরের জন্য ধন্যবাদ, আপনি উত্তরটি, লাম্বা একটিতে আরও কিছুটা ব্যাখ্যা করতে পারেন, মানে codeফানক <স্ট্রিং, স্ট্রিং> প্রিফিক্সট্রিমার = x => এক্স ?? ""; codeআমি এটি নতুন এবং আমি সত্যিই খুব ভালভাবে বুঝতে পারি না এমএসডিএন ডক
— জো ডিকসন

4
@ জো: x ?? ""নাল- কোলেসিং অপারেটর। msdn.microsoft.com/en-us/library/ms173224.aspx
— SLaks

ইন x => (something), xএকটি প্যারামিটার, এবং (something)এটির মান `
— স্ল্যাक्स


4
@ হেলফ্রস্ট: প্রশ্নটি পড়ুন। তিনি সি ++ - স্টাইলের ইনলাইন ফাংশনগুলি সম্পর্কে জিজ্ঞাসা করছেন না। আমি ফাংশন তৈরি করতে চাই না কারণ
— এগুলি

5

আপনি ফানক ব্যবহার করতে পারেন যা একটি প্যারামিটার রয়েছে এমন একটি পদ্ধতি আবদ্ধ করে এবং ট্র্যাসল্ট প্যারামিটার দ্বারা নির্দিষ্ট ধরণের মান প্রদান করে।

void Method()
{
    Func<string,string> inlineFunction = source => 
    {
        // add your functionality here
        return source ;
     };


    // call the inline function
   inlineFunction("prefix");
}

4

কেবল ইনসাইড পদ্ধতিগুলিই নয়, এটি ক্লাসের অভ্যন্তরেও ব্যবহার করা যেতে পারে।

class Calculator
    {
        public static int Sum(int x,int y) => x + y;
        public static Func<int, int, int>  Add = (x, y) => x + y;
        public static Action<int,int> DisplaySum = (x, y) => Console.WriteLine(x + y);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.