সি # তে ইনলাইন ফাংশন?


276

আপনি কীভাবে সি # তে "ইনলাইন ফাংশন" করবেন? আমি ধারণাটি বুঝতে পারি না বলে মনে করি না। তারা কি বেনামে পদ্ধতির মতো? ল্যাম্বডা ফাংশনের মতো?

দ্রষ্টব্য : উত্তরগুলি সম্পূর্ণরূপে ফাংশনগুলিকে ইনলাইন করার ক্ষমতা নিয়ে কাজ করে , যেমন "একটি ম্যানুয়াল বা সংকলক অপ্টিমাইজেশন যা একটি ফাংশন কল সাইটকে কলির দেহের সাথে প্রতিস্থাপন করে।" আপনি যদি বেনামে (ওরফে ল্যাম্বদা ) ফাংশনে আগ্রহী হন , @ জাল্ফের উত্তর দেখুন বা এই 'ল্যাম্বডা' সবাই কী বলে চলেছে ?


11
এটি শেষ পর্যন্ত সম্ভব - আমার উত্তর দেখুন।
konrad.kruczynski

1
.NET 4.5 এর আগে নিকটতম জিনিসের জন্য প্রশ্ন দেখুন ল্যাম্বদা ফাংশন হিসাবে চলক কীভাবে সংজ্ঞায়িত করবেন । এটি আসলে ইনলাইন হিসাবে সংকলন করছে না তবে এটি ইনলাইন ঘোষণার মতো একটি সংক্ষিপ্ত ফাংশন ঘোষণা। ইনলাইন ব্যবহার করে আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে।
AppFzx

উত্তর:


384

অবশেষে .NET 4.5 এ, সিএলআর একটিকে মান ব্যবহার করে 1 পদ্ধতি ইনলাইন করার ইঙ্গিত / পরামর্শ দেওয়ার অনুমতি দেয় MethodImplOptions.AggressiveInlining। এটি মনোর ট্রাঙ্কেও পাওয়া যায় (আজ প্রতিশ্রুতিবদ্ধ)।

// The full attribute usage is in mscorlib.dll,
// so should not need to include extra references
using System.Runtime.CompilerServices; 

...

[MethodImpl(MethodImplOptions.AggressiveInlining)]
void MyMethod(...)

। আগে এখানে "বল" ব্যবহৃত হত। যেহেতু কয়েকটি ডাউনওয়েট ছিল, তাই আমি এই শব্দটি পরিষ্কার করার চেষ্টা করব। মতামত এবং ডকুমেন্টেশনের মতো, The method should be inlined if possible.বিশেষত মনোকে বিবেচনা করে (যা উন্মুক্ত), কিছুটা মনো-নির্দিষ্ট প্রযুক্তিগত সীমাবদ্ধতা ইনলাইনিং বা আরও সাধারণ একটি (ভার্চুয়াল ফাংশনগুলির মতো) বিবেচনা করে বিবেচনা করা হচ্ছে। সামগ্রিকভাবে, হ্যাঁ, এটি সংকলনের একটি ইঙ্গিত, তবে আমার ধারণা এটির জন্যই বলা হয়েছিল।


17
+1 - ফ্রেমওয়ার্ক সংস্করণ প্রয়োজনীয়তা সম্পর্কে আরও নির্দিষ্ট হতে আপনার উত্তর আপডেট করেছে।
এমব্যাবকক

4
এটি এখনও সম্ভবত একটি বাহিনী ইনলাইন নয়, তবে বেশিরভাগ পরিস্থিতিতে অবশ্যই জিআইটিএসর হিউরিস্টিককে ওভাররাইড করা যথেষ্ট।
কোডসইনচাউস

7
একটি পৃথক পদ্ধতির যা সমস্ত .NET সংস্করণ নিয়ে কাজ করতে পারে তা হ'ল সামান্য খুব বড় পদ্ধতিটিকে দুটি পদ্ধতিতে বিভক্ত করা হয়, একটিটি অন্যটিকে কল করে, যার মধ্যে দুটিও আইএল এর 32 বাইট অতিক্রম করে না। নেট এফেক্টটি হ'ল আসলটি অন্তর্ভুক্ত।
রিক স্ল্যাডকি

4
এটি "ইনলাইনিং" কে জোর করছে না এটি কেবল জেআইটির সাথে কথা বলার চেষ্টা করবে এবং এটি জানাতে চেষ্টা করবে যে প্রোগ্রামার সত্যিকার অর্থে এখানে ইনলাইনিং ব্যবহার করতে চায়, তবে জেআইটি এর চূড়ান্ত শব্দ রয়েছে। তাই এমএসডিএন: সম্ভব হলে পদ্ধতিটি ইনলাইন করা উচিত।
ওরেলে ইরাকি

11
তুলনা করে, সি ++ এর অন্তর্নিহিত পরামর্শগুলি, এমনকি সংকলক-নির্দিষ্টগুলিও আসলে একটি ইনলাইন জোর করে না: সমস্ত ফাংশনগুলিকে অন্তর্ভুক্ত করা যায় না (পুনরাবৃত্ত ফাংশনগুলির মতো মূল বিষয়গুলি শক্ত, তবে অন্যান্য ক্ষেত্রেও রয়েছে)। হ্যাঁ, এই "যথেষ্ট নয়" বলটি সাধারণ।
ইমন নারবোন

87

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

সি # তে এটি করার কোনও ব্যবস্থা নেই এবং সেগুলি যেখানে সমর্থিত সেগুলি খুব অল্প পরিমাণে ব্যবহার করতে হবে - আপনি কেন না কোথাও ব্যবহার করা উচিত তা যদি না জানেন তবে সেগুলি হওয়া উচিত নয়।

সম্পাদনা: স্পষ্ট করার জন্য, দুটি বড় কারণ সেগুলি খুব কম ব্যবহার করা দরকার:

  1. এটি প্রয়োজনীয় নয় যেখানে ইনলাইন ব্যবহার করে বিশাল বাইনারি তৈরি করা সহজ
  2. সংকলকটি আপনার চেয়ে আরও ভাল জানার ঝোঁক দেয় যখন কোনও পারফরম্যান্সের দিক থেকে, কিছু কিছু অন্তর্ভুক্ত করা উচিত

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


35
সাধারণত আমি মনে করি এটি ঠিক আছে যে সংকলক ইনলাইনিং পরিচালনা করে। তবে এমন পরিস্থিতি রয়েছে যেখানে আমি সংকলক সিদ্ধান্তটিকে ওভাররাইড করতে এবং কোনও পদ্ধতির সাথে ইনলাইন করতে বা না চাই।
মিমি মিমম্ম মিম্ম

7
@ জোয়েল কোহোর্ন: এটি খারাপ অভ্যাস হবে কারণ এটি মডুলারাইজেশন এবং অ্যাক্সেস সুরক্ষা ভঙ্গ করবে। (কোনও শ্রেণীর একটি অন্তর্নিহিত পদ্ধতি সম্পর্কে চিন্তা করুন যা ব্যক্তিগত সদস্যদের অ্যাক্সেস করে এবং কোডের বিভিন্ন বিন্দু থেকে আহ্বান জানানো হয়!)
মিমি মিমি মিমি

9
@ পোমা এটি ইনলাইনিং ব্যবহারের একটি অদ্ভুত কারণ। আমি কার্যকরভাবে এটি প্রমাণিত হবে সন্দেহ।
ক্রিস

56
সংকলকটি ভালভাবে জানার বিষয়ে যুক্তিগুলি কেবল ভুল। এটি 32 আইএল বাইট, পিরিয়ডের চেয়ে বড় কোনও পদ্ধতিকে ইনলাইন করে না। প্রকল্পগুলির জন্য এটি ভয়াবহ (যেমন আমার এবং এগোরেরও উপরে) যা প্রোফাইলার-চিহ্নিত হটস্পটগুলির সাথে আমরা একেবারে কিছুই করতে পারি না। কিছুই না, এটি কোড কাটা এবং পেস্ট করা এবং তাই ম্যানুয়ালি ইনলাইন ব্যতীত। এক কথায়, আপনি যখন সত্যিকারের পারফরম্যান্স চালাচ্ছেন এটি এমন এক ভয়ঙ্কর পরিস্থিতি।
উজ্জ্বল

6
ইনলাইনিং আরও সূক্ষ্ম যে এটি প্রদর্শিত হয়। মেমোরিতে এমন ক্যাশে রয়েছে যা অ্যাক্সেস করার জন্য দ্রুত এবং কোডের বর্তমান অংশটি ভেরিয়েবলের মতো সেই ক্যাশে সংরক্ষণ করা হয়। নির্দেশের পরবর্তী ক্যাশে লাইনটি লোড করা একটি ক্যাশে মিস এবং একক নির্দেশনা যা করতে পারে তার জন্য 10 বা ততবার গুণ ব্যয় হয়। শেষ পর্যন্ত এটি L2 ক্যাশে লোড করতে হবে, এটি আরও বেশি ব্যয়বহুল। সুতরাং ফোলা কোডটি আরও ক্যাশে মিস করতে পারে, যেখানে পুরো সময় একই এল 1 ক্যাশে লাইনে বাসিন্দা থাকে এমন একটি অন্তর্নিহিত ফাংশন কম ক্যাশে মিস এবং সম্ভাব্য দ্রুত কোডের ফলে তৈরি হতে পারে। । নেট এটি আরও জটিল।

56

আপডেট করুন: প্রতি konrad.kruczynski এর উত্তর নিম্নলিখিত পর্যন্ত এবং 4.0 সহ .NET এর সংস্করণের জন্য সত্য।

আপনি ব্যবহার করতে পারেন MethodImplAttribute বর্গ থেকে প্রতিরোধ inlined হওয়া থেকে একটি পদ্ধতি ...

[MethodImpl(MethodImplOptions.NoInlining)]
void SomeMethod()
{
    // ...
}

... তবে বিপরীতে কাজ করার এবং এটিকে জোর করে চাপানোর কোনও উপায় নেই ।


2
এটি জানতে আগ্রহী, তবে কেন হ্যাক কোনও পদ্ধতিতে প্রবেশ করতে বাধা দেয়? আমি মনিটরের দিকে তাকাতে কিছু সময় ব্যয় করেছি তবে ইনলাইনিং কোনও ক্ষতি করতে পারে তার কোনও কারণ আমি তুলতে পারি না।
কামিলো মার্টিন

3
যদি আপনি একটি কল স্ট্যাক পান (যেমন নুলারফেরান এক্সেকশন) এবং স্পষ্টতই স্ট্যাকের উপরে থাকা পদ্ধতিটি নিক্ষেপ করার কোনও উপায় নেই। অবশ্যই, এর একটি কল থাকতে পারে। তবে কোনটি?
ডিজেন্ডার্স

19
GetExecutingAssemblyএবং GetCallingAssemblyপদ্ধতিটি অন্তর্ভুক্ত কিনা তার উপর নির্ভর করে পৃথক পৃথক ফলাফল দিতে পারে। কোনও পদ্ধতিটিকে অন-ইনলাইনড হতে বাধ্য করা কোনও অনিশ্চয়তা দূর করে।
stusmith

1
@ ডাউনভোটার: আমি যেটা লিখেছি তাতে যদি আপনি দ্বিমত পোষণ করেন তবে আপনাকে কেন মন্তব্য করে একটি মন্তব্য পোস্ট করা উচিত। এটি কেবল সাধারণ সৌজন্যই নয়, আপনি মোট 20+ জবাবের ভোট ডিঙ করেও খুব বেশি অর্জন করতে পারেন না।
বেকন

2
আশা করি আমি +2 করতে পারি কারণ আপনার একা +1: ডি প্রাপ্য।
retrodrone

33

আপনি দুটি পৃথক ধারণা মিশ্রিত করছেন। ফাংশন ইনলাইনিং একটি সংকলক অপ্টিমাইজেশন যা শব্দার্থবিজ্ঞানের উপর কোনও প্রভাব ফেলেনি। কোনও ফাংশন একইভাবে আচরণ করে তবে তা ইনডিল করা হোক বা না হোক।

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

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


20
"কোনও ফাংশন একইভাবে আচরণ করে তবে তা অন্তর্নিহিত হোক বা না হোক" " কিছু দুর্লভ কেস রয়েছে যেখানে এটি সত্য নয়: যথা স্ট্যাক ট্রেস সম্পর্কে জানতে চাওয়া লগিং ফাংশন। তবে আমি আপনার বেস স্টেটমেন্টটিকে খুব বেশি হ্রাস করতে চাই না: এটি সাধারণত সত্য।
জোয়েল কোহর্ন

"এবং এটির দিক দিয়ে আপনি কিছুই করতে পারবেন না" "- সত্য নয়। আমরা যদি কিছু করা হিসাবে কম্পাইলারের কাছে "দৃ strong় পরামর্শ" গণনা না করি তবে আপনি ফাংশনগুলিকে অন্তর্ভুক্ত হওয়া থেকে আটকাতে পারেন।
বার্তোসকেপিপি

21

আপনি কি সি ++ অর্থে ইনলাইন ফাংশন বলতে চান? কোন সাধারণ ক্রিয়াকলাপের সামগ্রীগুলি স্বয়ংক্রিয়ভাবে কলসাইটে ইনলাইন অনুলিপি করে? শেষ প্রভাবটি হ'ল কোনও ফাংশন কল করার সময় কোনও ফাংশন কল আসলে ঘটে না।

উদাহরণ:

inline int Add(int left, int right) { return left + right; }

যদি তাই হয় তবে এটির সমতুল্য কোনও সি # নেই।

অথবা আপনি কি অন্য কোনও ফাংশনের মধ্যে ঘোষিত ফাংশন বলতে চান? যদি তা হয় তবে হ্যাঁ, সি # বেনামে পদ্ধতি বা ল্যাম্বডা এক্সপ্রেশনগুলির মাধ্যমে এটি সমর্থন করে।

উদাহরণ:

static void Example() {
  Func<int,int,int> add = (x,y) => x + y;
  var result = add(4,6);  // 10
}

21

কোডির ঠিক আছে, তবে আমি একটি ইনলাইন ফাংশন একটি উদাহরণ দিতে চাই।

ধরা যাক আপনার এই কোডটি রয়েছে:

private void OutputItem(string x)
{
    Console.WriteLine(x);

    //maybe encapsulate additional logic to decide 
    // whether to also write the message to Trace or a log file
}

public IList<string> BuildListAndOutput(IEnumerable<string> x)
{  // let's pretend IEnumerable<T>.ToList() doesn't exist for the moment
    IList<string> result = new List<string>();

    foreach(string y in x)
    {
        result.Add(y);
        OutputItem(y);
    }
    return result;
}

কম্পাইলার জাস্ট-ইন-টাইম অপটিমাইজার বারবার স্ট্যাক OutputItem () করার জন্য একটি কল স্থাপন এড়াতে কোড পরিবর্তন করতে চয়ন করতে পারেন যাতে যদি এই পরিবর্তে মত কোড লিখেছিলাম তাই হয়তো হবে:

public IList<string> BuildListAndOutput(IEnumerable<string> x)
{
    IList<string> result = new List<string>();

    foreach(string y in x)
    {
        result.Add(y);

        // full OutputItem() implementation is placed here
        Console.WriteLine(y);   
    }

    return result;
}

এই ক্ষেত্রে, আমরা বলব আউটপুট আইটেম () ফাংশনটি অন্তর্ভুক্ত ছিল। মনে রাখবেন যে এটি অন্য স্থান থেকেও আউটপুট আইটেম () কল করা হলেও এটি করতে পারে।

সম্ভবত একটি দৃশ্যাবলী প্রদর্শিত হতে সম্পাদিত lined


9
শুধু যদিও স্পষ্ট করার জন্য; এটি জেআইটিই ইনলাইনিং করে; সি # সংকলক নয়
মার্ক Gravell

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

7

হ্যাঁ ঠিক, পার্থক্যটি হ'ল এটি কোনও মান দেয়।

সরলীকরণ (এক্সপ্রেশন ব্যবহার না করে):

List<T>.ForEach একটি পদক্ষেপ নেয়, এটি কোনও ফেরতের ফলাফল আশা করে না।

সুতরাং একটি Action<T>প্রতিনিধি যথেষ্ট হবে .. বলুন:

List<T>.ForEach(param => Console.WriteLine(param));

বলার মতোই:

List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });

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

যেখানে হিসাবে

List<T>.Where ফলাফল প্রত্যাশা করে একটি ফাংশন নেয়।

সুতরাং একটি Function<T, bool>আশা করা হবে:

List<T>.Where(param => param.Value == SomeExpectedComparison);

যা একই:

List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });

আপনি এই পদ্ধতিগুলিকে ইনলাইনও ডিক্লেয়ার করতে পারেন এবং এগুলি ভেরিয়েবলগুলিতে স্বাক্ষর করতে পারেন:

Action myAction = () => Console.WriteLine("I'm doing something Nifty!");

myAction();

অথবা

Function<object, string> myFunction = theObject => theObject.ToString();

string myString = myFunction(someObject);

আশা করি এটা কাজে লাগবে.


2

এমন কিছু অনুষ্ঠান রয়েছে যেখানে আমি কোডটিকে বাধ্যতামূলক করতে বাধ্য করতে চাই না।

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

আমি জানি যে এই সাহায্যকারী ফাংশনগুলি ইন-রেখাযুক্ত হওয়া উচিত কারণ কোডটি এমনভাবে লেখা যদি এটি কোনও মানুষের দ্বারা বোঝার দরকার না হয়। আমি অবশ্যই এই ক্ষেত্রে নিশ্চিত করতে চাই যে ওভারহেডে কল করার কোনও ফাংশন ছিল না।


2

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


3
"ননসেন্স, সংকলকটি জানার কোনও উপায় নেই" জাইটি ফাংশন কলগুলির রিয়েলটাইম প্রোফাইলিং করে ..
ব্রায়ান গর্ডন

3
। নেট জাইটি সংকলন সময়ে 2-পাসের স্ট্যাটিক বিশ্লেষণের সাথে যা সম্ভব তার চেয়ে রান-টাইমে আরও অনুকূল করতে পরিচিত। "পুরাতন স্কুল" কোডারদের বোঝার জন্য শক্ত অংশটি হ'ল জেআইটি, সংকলক নয়, দেশীয় কোড তৈরির জন্য দায়বদ্ধ। সংকলক নয়, জেআইটি ইনলাইন পদ্ধতিগুলির জন্য দায়বদ্ধ।
শন উইলসন

1
আমার সোর্স কোড ছাড়াই আপনি যে কোডটি কল করেছেন তার সংকলন করা আমার পক্ষে সম্ভব এবং জেআইটি কলটি ইনলাইন করতে পারে। সাধারণত আমি সম্মত হই, তবে আমি একজন মানুষ হিসাবে বলব আপনি এখন আর সরঞ্জামগুলি অতিক্রম করতে সক্ষম নন।
শন উইলসন

1

আমি জানি এই প্রশ্নটি সি # সম্পর্কে। তবে, আপনি এফ # দিয়ে .NET এ ইনলাইন ফাংশন লিখতে পারেন। দেখুন: এফ # তে `ইনলাইন` ব্যবহার করুন


আমাকে এখান থেকে পুনঃনির্দেশিত করা হয়েছিল: স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

0

না, সি # তে এ জাতীয় কোনও নির্মাণ নেই, তবে। নেট জেআইটি সংকলক জেআইটি সময় ইনলাইন ফাংশন কল করার সিদ্ধান্ত নিতে পারে। তবে সত্যই আমি জানি না যে এটি সত্যিই এই ধরনের অপটিমাইজেশন করছে।
(আমি মনে করি এটি করা উচিত :-))


0

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

এটি এখনও অপ্টিমাইজ করার জন্য কেবল একটি ঘোষণামূলক ইঙ্গিত, যদিও একটি আবশ্যক আদেশ নয়।


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

-7

লাম্বদা এক্সপ্রেশন হ'ল ইনলাইন ফাংশন! আমি মনে করি, যে সি # এর ইনলাইন বা এর মতো কোনও অতিরিক্ত বৈশিষ্ট্য নেই!


9
আমি আপনাকে হ্রাস করি নি, তবে দয়া করে প্রশ্নগুলি পড়ুন এবং এলোমেলো উত্তর পোস্ট করার আগে আপনি সেগুলি বুঝতে পেরেছেন তা নিশ্চিত করুন। en.wikedia.org/wiki/Inline_function
কামিলো মার্টিন

1
এই উত্তরটি যেমন তৈরি করা হয়েছে ততটা খারাপ নয় - ওপি 'ফাংশন ইনলাইনিং' বনাম 'ল্যাম্বদা ফাংশন' সম্পর্কে অস্পষ্ট, এবং দুর্ভাগ্যক্রমে এমএসডিএন ল্যাম্বডাসকে "ইনলাইন স্টেটমেন্ট" বা "ইনলাইন কোড" হিসাবে উল্লেখ করে । যাইহোক, কনরাডের উত্তর অনুসারে কোনও পদ্ধতিতে ইনলাইন করা সম্পর্কে সংকলককে ইঙ্গিত করার একটি বৈশিষ্ট্য রয়েছে
স্টুয়ার্টলসি

-7

সি # পাইথনের মতো ডায়নামিক ভাষাগুলি যেভাবে ইনলাইন পদ্ধতিগুলি (বা ফাংশন) সমর্থন করে না। তবে বেনামে পদ্ধতি এবং ল্যাম্বডাস একই ধরণের উদ্দেশ্যে ব্যবহার করা যেতে পারে যখন আপনাকে নীচের উদাহরণের মতো ধারণ পদ্ধতিতে কোনও ভেরিয়েবল অ্যাক্সেস করতে হবে need

static void Main(string[] args)
{
    int a = 1;

    Action inline = () => a++;
    inline();
    //here a = 2
}

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