রানটাইমে রেফ এবং আউট এর মধ্যে পার্থক্য কী?


15

সি # রেফারেন্স দ্বারা পাস করার জন্য আর্গুমেন্টগুলি তৈরি করতে refএবং outকীওয়ার্ড সরবরাহ করে । দুজনের শব্দার্থকতা খুব মিল। কেবলমাত্র পার্থক্যটি ফ্ল্যাগেড ভেরিয়েবলের সূচনাতে:

  • refভেরিয়েবলটি ফাংশনে পাস করার আগে আরম্ভ করা দরকার, outতা নয়।
  • outফাংশনের ভিতরে ভেরিয়েবলকে আরম্ভ করার প্রয়োজন refহয় না।

এই দুটি কীওয়ার্ড ব্যবহারের ক্ষেত্রে আরো প্রায় একই আছে, এবং তাদের খুব ঘন ব্যবহার আমি একটি কোড গন্ধ বিবেচিত বিশ্বাস করবে (যদিও মত বৈধ ব্যবহার রয়েছে TryParseএবং TryGetValueনিদর্শন)।

এ কারণেই কেউ ব্যাখ্যা করতে পারে, কেন এই সংকীর্ণ ব্যবহারের ক্ষেত্রে সি # তে দুটি একই ধরণের সরঞ্জাম রয়েছে?

এছাড়াও, এমএসডিএন-তেও বলা হয়েছে যে তাদের রান-টাইম আচরণ বিভিন্ন রকম:

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

তাদের রান-টাইম আচরণ কীভাবে আলাদা?

উপসংহার

উভয় উত্তর সঠিক দেখাচ্ছে, উভয় ধন্যবাদ। আমি জোমরনোর গ্রহণ করেছি কারণ এটি আরও স্পষ্ট।


আমার অনুমান যে তারা উভয়ই refসি ++ তে একইভাবে প্রয়োগ করা হয়েছে; প্রশ্নে বস্তু পয়েন্টার (বা আদিম) পয়েন্টার। অর্থাত Int32.TryParse(myStr, out myInt)(সি #) একইভাবে "চালিত" হয় int32_tryParse(myStr, &myInt)(সি) এর মতো; ত্রুটিগুলি রোধ করতে কম্পাইলার দ্বারা প্রয়োগ করা কিছু প্রতিবন্ধকতাগুলির মধ্যে পার্থক্য। (আমি এটি উত্তর হিসাবে পোস্ট করব না কারণ পর্দার আড়ালে এটি কীভাবে কাজ করে সে সম্পর্কে আমার ভুল হতে পারে, তবে আমি কীভাবে কল্পনা করি এটি কাজ করে [কারণ এটি বোধ হয়])
কোল জনসন

উত্তর:


10

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

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


সুতরাং আমার বোধগম্যতা হল যে সংকলকটি কোনও outপরামিতিটিকে ডিফেরেন্ট করা বা কোনও পরামিতি বরাদ্দ না দেওয়ার মতো জিনিসগুলির জন্য পরীক্ষা করে ref, তবে যে আইএলটি এটি প্রকাশ করে তা কেবল একটি উপায় is এটা কি ঠিক?
অ্যান্ড্রু

BTW, এক সত্য যে এই বলতে পারে out Tএবং ref Tএই ধরনের VB.Net বা সি ++ / CLI হিসাবে অন্যান্য CLI ভাষায় অভিন্নরুপে দেখা যায়।
আছ

@ অ্যান্ড্রুপিলাইজার: সঠিক। ধরে নিই যে কোডটি যে কোনও উপায়ে সংকলন করেছে (যখন আপনি না করা উচিত তখনই আপনি অনুমিত করার চেষ্টা করবেন না), আইএলটি অভিন্ন হবে।
jmoreno

4

এখানে এই বিষয়ের একটি আকর্ষণীয় লিখনআপ যা আপনার প্রশ্নের উত্তর দিতে পারে:

http://www.dotnetperls.com/ref

সুদের পয়েন্ট:

"রেফ এবং আউট এর মধ্যে পার্থক্য সাধারণ ভাষা রানটাইমের মধ্যে নয়, তবে এটি সি # ভাষায়।"

হালনাগাদ:

আমার কাজের সিনিয়র বিকাশকারী কেবল @ জোমরনোর উত্তরটিকে সংযুক্ত করেছেন, সুতরাং আপনি এটি পড়েছেন তা নিশ্চিত করুন!


সুতরাং আমি যদি সঠিকভাবে বুঝতে পারি তবে আইএল স্তরের কোনও পার্থক্য নেই, যা বোঝায় যে তাদের রানের সময় আলাদা আচরণ করতে পারে না। এটি এমএসডিএন যা বলে তার সাথে বিরোধী হবে। তবুও আগ্রহের নিবন্ধ!
গ্যাবার অ্যাঙ্গিয়াল

@ গ্যাবারআঙ্গিয়াল আপনার কি এমএসডিএন নিবন্ধের সাথে কোনও লিঙ্ক আছে বলে মনে হচ্ছে না? মতামত পৃথক হলে এখানে থাকতে
ড্যান

আপনি এখানে যান: এমএসডিএন.মাইক্রোসফটকম /en-gb/library/t3c3bfhx.aspx , তবে এটি আমার প্রশ্নে সবই ছিল :)
গ্যাবার অ্যাঙ্গিয়াল

1
এসবের সাথে কী stringকরার আছে?
রবার্ট হার্ভে

এটি নিবন্ধ থেকে একটি প্যারাফ্রেজ। দ্বিতীয় লাইন সরানোর জন্য আপডেট করা হয়েছে ..
ড্যান

2

রানটাইম ? একেবারে কিছুই নয়। আপনি কেবল রেফ বা আউটআউট কীওয়ার্ডের মাধ্যমে একই পরামিতিগুলির সাথে পৃথক হওয়া কোনও পদ্ধতিকে ওভারলোড করতে পারবেন না।

এটি সংকলনের চেষ্টা করুন এবং আপনি একটি সংকলন ত্রুটি পাবেন "একই স্বাক্ষরযুক্ত পদ্ধতি ইতিমধ্যে ঘোষণা করা হয়েছে":

    private class MyClass
    {
        private void DoSomething(out int param)
        {
        }
        private void DoSomething(ref int param)
        {
        }
    }

এই প্রশ্নের উত্তর দিতে: "... এত সংকীর্ণ ব্যবহারের ক্ষেত্রে সি # তে দুটি একই ধরণের সরঞ্জাম কেন আছে?"

একটি কোড পঠনযোগ্যতা এবং এপিআই অবস্থান থেকে একটি বিশাল পার্থক্য আছে। এপিআইর গ্রাহক হিসাবে আমি জানি যে যখন "আউট" ব্যবহার করা হয় তখন এপিআই আউট প্যারামিটারের উপর নির্ভর করে না। এপিআই বিকাশকারী হিসাবে আমি "আউট" পছন্দ করি এবং কেবল যখন প্রয়োজন (বিরল!) কেবল তখনই "রেফ" ব্যবহার করি। একটি দুর্দান্ত আলোচনার জন্য এই রেফারেন্সটি দেখুন:

/programming/1516876/when-to-use-ref-vs-out

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

    private class MyClass
    {
        internal void DoSomething(out int param)
        {
            param = 0;
        }
    }

00000000 ধাক্কা ebp
00000001 পর্ণ ebp, ESP
00000003 ধাক্কা EDI
00000004 ধাক্কা Esi
00000005 ধাক্কা ebx
00000006 সাব ESP, 34h
00000009 XOR EAX, EAX
0000000b পর্ণ DWORD কাজ খুঁজছেন এরকম [ebp-10h], EAX
0000000e পর্ণ DWORD কাজ খুঁজছেন এরকম [ebp-1CH], EAX
00000011 মুভ ডওয়ার্ট
পিটিআর [ ইবিপি -3 সিএইচ], এক্সএক্স 00000014 মোভ ডুওয়ার্ট পিটিআর [ইবিপি
-40 এইচ], এডিএক্স 00000017 সিএমপি ডুয়ার্ট পিটিআর ডিএস: [008B1710h], 0
0000001e জে 00000025
00000020 কল 6E6B601E
00000025 নোট প্যারাম
= 0;
00000026
মোভ ইক্স, ডওয়ার্ট পিটিআর [ ইবিপি -40 এইচ ] 00000029 জোর এডেক্স, এডিএক্স
0000002b পর্ণ DWORD কাজ খুঁজছেন এরকম [EAX], EdX
}
0000002d nop
0000002e কর্মদিবসের ESP, [ebp-0Ch]
00000031 পপ ebx
00000032 পপ Esi
00000033 পপ EDI
00000034 পপ ebp
00000035 অবঃ

আমি কি সমাবেশটি সঠিকভাবে পড়ছি?


আপনি যা লিখছেন তা সঠিক, তবে দয়া করে মনে রাখবেন যে এটি কোনও স্পষ্ট প্রভাব নয় যে কোনও রানটাইম পার্থক্য নেই কারণ এই ওভারলোডটি অনুমোদিত নয়।
গ্যাবার অ্যাঙ্গিয়াল

আহ - ভাল পয়েন্ট! কেউ কি উপরের কোডটি বিচ্ছিন্ন করতে পারেন এবং আমাকে সঠিক বা ভুল প্রমাণ করতে পারেন? আমি সমাবেশ পড়তে ভয়ানক, তবে জানতে আগ্রহী।
শ্রোকেন

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