কেন কেউ কখনও সি # তে "ইন" প্যারামিটার সংশোধক ব্যবহার করবেন?


86

সুতরাং, আমি (মনে করি আমি) inপ্যারামিটার সংশোধক কী করে তা বুঝতে পারি। তবে এটি যা করে তা বেশ নিরর্থক বলে মনে হয়।

সাধারণত, আমি মনে করি যে কেবলমাত্র ব্যবহারের একমাত্র কারণ refহ'ল কলিং ভেরিয়েবলটি সংশোধন করা, যা স্পষ্টভাবে নিষিদ্ধ in। সুতরাং inরেফারেন্স দ্বারা পাস করা যুক্তিগতভাবে মান দ্বারা পাস করার সমতুল্য বলে মনে হচ্ছে।

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

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


4
হ্যাঁ, একটি কার্যকারিতা সুবিধা আছে। স্ট্রোকগুলি অনুলিপি না করে রেফারেন্স refদিয়ে পাস করতে ব্যবহৃত হয় । মানে স্ট্রাকটি সংশোধন করা উচিত নয়। in
Panagiotis Kanavos

@ ডিবিসি নং, ইন্টারপের সাথে এটির কোনও সম্পর্ক নেই
পানাজিওটিস কানভোস

4
মান ধরণের জন্য পারফরম্যান্স। সি # 7.2 এর নতুন "ইন" কীওয়ার্ড
সিলভারমাইন্ড

4
এখানে বিস্তারিত আলোচনা । শেষ সতর্কতা নোট করুন:It means that you should never pass a non-readonly struct as in parameter.
Panagiotis Kanavos

আমি শপথ করতে পারতাম এটি একটি সদৃশ, তবে আমি এটি আর খুঁজে পাচ্ছি না
জেএড

উত্তর:


81

in সম্প্রতি সি # ভাষার সাথে পরিচয় হয়েছিল।

inআসলে একটি ref readonly। সাধারণভাবে বলতে গেলে, কেবলমাত্র একটি ব্যবহারের ক্ষেত্রেই inসহায়ক হতে পারে: উচ্চ পারফরম্যান্স অ্যাপ্লিকেশন প্রচুর বড়দের সাথে ডিল করে readonly struct

ধরে নিচ্ছি আপনার কাছে:

readonly struct VeryLarge
{
    public readonly long Value1;   
    public readonly long Value2;

    public long Compute() { }
    // etc
}

এবং

void Process(in VeryLarge value) { }

সেক্ষেত্রে, VeryLargestruct হয় যখন এই struct ব্যবহার আত্মরক্ষামূলক কপি তৈরি ছাড়া বাই-রেফারেন্স পাস হবে Processপদ্ধতি (যেমন যখন কলিং value.Compute()), এবং struct অপরিবর্তনীয়তা কম্পাইলার দ্বারা নিশ্চিত করা হয়।

নোট করুন যে structকোনও inসংশোধকের সাথে অ-পঠনযোগ্য পাস করার ফলে স্ট্রাক্টের পদ্ধতিগুলি কল করার সময় এবং উপরের পদ্ধতিতে বৈশিষ্ট্য অ্যাক্সেস করার সময় সংকলকটি একটি প্রতিরক্ষামূলক অনুলিপি তৈরিProcess করবে, যা কার্য সম্পাদনকে নেতিবাচক প্রভাব ফেলবে!

সত্যিই ভাল এমএসডিএন ব্লগ এন্ট্রি রয়েছে যা আমি সাবধানতার সাথে পড়ার পরামর্শ দিই।

আপনি যদি inসিন্ড্রোডিংয়ের আরও কিছু historical তিহাসিক পটভূমি পেতে চান তবে আপনি এই আলোচনাটি সি # ভাষার গিটহাবের সংগ্রহশালায় পড়তে পারেন ।

সাধারণভাবে, বেশিরভাগ বিকাশকারী সম্মত হন যে প্রবর্তনকে inএকটি ভুল হিসাবে দেখা যেতে পারে। এটি একটি বাহ্যিক ভাষার বৈশিষ্ট্য এবং এটি কেবল উচ্চ-পার্ফ প্রান্ত ক্ষেত্রে কার্যকর হতে পারে।


এটা দমন কম্পাইলার তৈরি হওয়া আত্মরক্ষামূলক কপি, অথবা নিছক ম্যানুয়ালি প্রেক্ষিতে অন্যথায় ব্যবহার করেন এ আত্মরক্ষামূলক কপি তৈরি করতে প্রোগ্রামারদের প্রয়োজনীয়তা দূর refঅনুমতি দিয়ে যেমন someProc(in thing.someProperty);বনাম propType myProp = thing.someProperty; someProc(ref myProp);? হয় inএকটি C # এর মত -only ধারণা out, অথবা এটি .NET ফ্রেমওয়ার্ক যোগ করা হয়েছে?
সুপারক্যাট

@ সুপের্যাট, আপনি কোনও সম্পত্তি ব্যবহার করে পাস করতে পারবেন না in, কারণ inকার্যকরভাবে refএকটি বিশেষ বৈশিষ্ট্যযুক্ত। সুতরাং আপনার প্রথম স্নিপেট সংকলন করবে না। @ ভিজুয়ালমেলন, এটি ঠিক, প্রতিরোধমূলক অনুলিপিটি কল করার পদ্ধতিগুলি বা স্ট্রাক্টের বৈশিষ্ট্যগুলিকে অধ্যায়ের হিসাবে স্ট্রাক্ট হিসাবে পাওয়া পদ্ধতিগুলির মধ্যে থেকে অ্যাক্সেস করার সময় ঘটে।
ডায়মানয়েড

@ এডিমনয়েড আপনাকে স্প্যাম্প করার জন্য দুঃখিত, আপনি যা লিখেছেন তা বোঝার জন্য আমার প্রায় 10 টি প্রচেষ্টা হয়েছিল (এবং আমি মনে করি না এটি আপনার ভুল!)
ভিজ্যুয়েলমেলন

4
@ অ্যাডিমানয়েড: উভয়ই inএবং outসেগুলি ধারণাগুলি যা প্রথম থেকেই ফ্রেমওয়ার্কে হওয়া উচিত ছিল (এমন একটি উপায় সহ যা পদ্ধতি এবং বৈশিষ্ট্যগুলি তারা সংশোধন করছে কিনা তা নির্দেশ করতে পারে this)। একটি সংকলক inকোনও অস্থায়ী হোল্ডিংয়ের রেফারেন্স দিয়ে কোনও সম্পত্তি যুক্তিতে প্রেরণ করতে পারে; অন্য ভাষায় রচিত কোনও ফাংশন যদি সেই অস্থায়ী সংশোধন করে, শব্দার্থকাগুলি কিছুটা আইকি হতে পারে তবে এটি তার স্বাক্ষরের সাথে মেলে না এমন ক্রিয়াকলাপের আচরণের দোষ হবে।
সুপারক্যাট

4
@ সুপের্যাট, দয়া করে এখানে কোনও আলোচনা খুলবেন না (আমি যাইহোক। নেট ফ্রেমওয়ার্ক কনসেপ্ট দলে নেই)। উত্তরে একটি দীর্ঘ আলোচনা উল্লেখ করা হয়েছে, এবং এটি গিটহাব আলোচনার উল্লেখ করে অন্য কিছু - আকর্ষণীয় পাঠ্য। বিটিডাব্লু, আপনি ভিবি.এনইটি-তে রেফারেন্স দিয়ে সম্পত্তিগুলি পাস করতে পারেন - সংকলকটি আপনার জন্য সেই অস্থায়ীগুলি তৈরি করে (যা অবশ্যই অস্পষ্ট সমস্যার কারণ হতে পারে)।
ডায়মানয়েড

42

inরেফারেন্স দ্বারা পাস করা যুক্তিগতভাবে মান দ্বারা পাস করার সমতুল্য বলে মনে হচ্ছে।

সঠিক।

কিছু কার্যকারিতা সুবিধা আছে?

হ্যাঁ.

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

একটা নয় প্রয়োজন যে একটি পরিবর্তনশীল একটি বস্তু একটি রেফারেন্স এবং একটি রেফারেন্স উভয় একই আকারের হবে, এবং সেখানে একটি নয় প্রয়োজন যে হয় একটি মেশিন শব্দের আকার বাস্তবে, তবে হ্যাঁ, উভয়ই চালু 32 32 বিট বিট মেশিন এবং 64 বিট মেশিনে 64 বিট 64

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

এখানে একটা নয় প্রয়োজন যে কোনো ধরনের একটি রেফারেন্স সঞ্চয়ের ভার্চুয়াল অ্যাড্রেস হিসাবে প্রয়োগ করা যেতে পারে। রেফারেন্সগুলি সিসিআই স্পেসিফিকেশনটির যথাযথ প্রয়োগের ক্ষেত্রে জিসি টেবিলগুলিতে অস্বচ্ছ হ্যান্ডেলগুলি হতে পারে।

সুবিধাগুলি কি কেবল বড় স্ট্রাকগুলিতে?

বৃহত্তর স্ট্রোকগুলি পাস করার ব্যয় হ্রাস করা বৈশিষ্ট্যের জন্য অনুপ্রেরণামূলক দৃশ্য scenario

নোট করুন যে কোনও গ্যারান্টি নেই যা inকোনও প্রোগ্রামকে আসলে দ্রুত করে তোলে এবং এটি প্রোগ্রামগুলিকে ধীর করে তুলতে পারে। কর্মক্ষমতা সম্পর্কে সমস্ত প্রশ্নের উত্তর অবশ্যই গবেষণামূলক গবেষণার মাধ্যমে দেওয়া উচিত । খুব কম অপ্টিমাইজেশন রয়েছে যা সর্বদা জিতে থাকে ; এটি একটি "সর্বদা জয়" অপ্টিমাইজেশন নয়।

পর্দার পিছনে এমন কিছু সংকলক অপ্টিমাইজেশন রয়েছে যা এটিকে অন্য কোথাও আকর্ষণীয় করে তুলেছে?

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

আমি কেন প্রতিটি প্যারামিটারটি ইন-ইন করব না?

ঠিক আছে, ধরুন আপনি intপরিবর্তে একটি in intপ্যারামিটার তৈরি করেছেন । কি ব্যয় আরোপ করা হয়?

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

মনে করুন এটি একটি doubleএবং আপনি এটিকে একটিতে পরিবর্তন করেন in double। আবার, এখন ভেরিয়েবলটি একটি উচ্চ-পারফরম্যান্স ফ্লোটিং পয়েন্ট রেজিস্টারে নিবন্ধভুক্ত করা যাবে না। এটিতে কেবল পারফরম্যান্সের প্রভাবই পড়ে না, এটি প্রোগ্রামের আচরণও পরিবর্তন করতে পারে! সি # এর চেয়ে বেশি -৪৪-বিট যথার্থতার মধ্যে ভাসমান গাণিতিক করার অনুমতি দেওয়া হয় এবং সাধারণত ভাসা তালিকাভুক্ত করা যায় তবেই তা করে।

এটি একটি নিখরচায় অপ্টিমাইজেশন নয়। বিকল্পগুলির বিরুদ্ধে আপনাকে এর কার্য সম্পাদন করতে হবে। আপনার সেরা বেটটি হ'ল প্রথম স্থানে বড় স্ট্রাক তৈরি না করা, যেমন নকশার নির্দেশিকা নির্দেশ করে suggest


"কি পরিস্থিতিতে [...] সম্ভাব্য পরিস্থিতিতে আপনি কল্পনা করবেন যে কোনও সি # প্রোগ্রামে একটি শারীরিক ঠিকানা অর্থবহ, [...]" " । সি # সাধারণত সেই সিস্টেমে ব্যবহৃত হয় যেগুলিতে মেমরি-ম্যাপযুক্ত I / O রয়েছে এবং রিসেট ভেক্টর ইত্যাদির মতো জিনিসগুলিতে আমি এখানে সাধারণ পুরানো উইন্টেলের বাক্সগুলি সম্পর্কে ভাবছি। X86 প্রসেসর এবং ভিজিএ ফ্রেমবফার সহ। ঠিক আছে, সাধারণত আমরা এগুলি সরাসরি পরিচালনা করি না, তবে আমরা পেরেছি, তাই না?
ওমরল

4
inসব ক্ষেত্রেই মান দিয়ে যাওয়ার পক্ষে কি আসলেই সমান? যদি আমাদের থাকে f(ref T x, in T y)এবং fসংশোধন করে x, এটি yহিসাবে চিহ্নিত হওয়ার সময় একই পরিবর্তন পর্যবেক্ষণ করা উচিত f(ref a,a)। এটি প্রয়োগ হয় যদি fএকটি in T yএবং একটি প্রতিনিধি গ্রহণ করে যা yডাকা হলে সংশোধন করবে । ছাড়া inসাল থেকে শব্দার্থবিদ্যা আলাদা হতে হবে, yএর মান পরিবর্তন আমি মনে করি না হবে, যেহেতু এটি একটি কপি হবেন।
চি

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

@ উইলসন: আপনি যে বিষয়ে কথা বলছেন তার একটি উদাহরণ দেখতে আমি পছন্দ করব; সি # তে যারা এই ধরণের জিনিস করার চেষ্টা করে তাদের আমি জানি না। "সিস্টেম সি #" -র কয়েক বছর ধরে কিছু কথা হয়েছে যার দ্বারা নিম্ন-স্তরের সিস্টেম উপাদানগুলি লেখার জন্য একটি উচ্চ-স্তরের পরিচালিত ভাষা ব্যবহার করা যেতে পারে, তবে আমি নিজে কখনও এ জাতীয় কোডটি দেখিনি।
এরিক লিপার্ট

4
@চি: এটা ঠিক। আপনি যদি ভেরিয়েবল এলিয়াসিং সহ বিপজ্জনক গেমগুলি খেলেন তবে আপনি সমস্যায় পড়তে পারেন। এটি করতে গিয়ে যদি ব্যাথা হয় তবে তা করবেন না। উদ্দেশ্য এর in"রেফারেন্স দ্বারা, কেবলমাত্র পাস" এর ধারণা প্রতিনিধিত্ব করতে, যা কথাটি মান পাশ সমতূল্য হয় যখন আপনি বুদ্ধিমানের আচরণ
এরিক লিপার্ট

6

এখানে. একটি পাস করার সময় struct, inকীওয়ার্ডটি একটি অপ্টিমাইজেশনের অনুমতি দেয় যেখানে কম্পাইলারটি কেবলমাত্র পয়েন্টারটি পাস করতে হবে, বিন্যাসটি সামগ্রী পরিবর্তন করার ঝুঁকি ছাড়াই। শেষটি গুরুত্বপূর্ণ - এটি একটি অনুলিপি অপারেশন এড়ায়। বড় স্ট্রাক্টগুলিতে এটি একটি বিশ্বকে আলাদা করতে পারে can


4
এটি কেবল প্রশ্নটি যা বলেছে তার পুনরাবৃত্তি করছে এবং এটি জিজ্ঞাসিত প্রকৃত প্রশ্নের উত্তর দেয় না।
পরিবেশন করুন

কেবলমাত্র পঠনযোগ্য স্ট্রাইকগুলিতে। অন্যথায়
সংকলকটি

4
আসলে না. এটি একটি পারফর্ম্যান্স ইবেনেফিট রয়েছে তা নিশ্চিত করে। প্রদত্ত যে ল্যাঙ্গাউজের মাধ্যমে পরিচালিত পারফরম্যান্সে IN তৈরি করা হয়েছিল, হ্যাঁ, এটিই কারণ। এটি একটি অপ্টিমাইজেশনকে (পঠনযোগ্য স্ট্রাইকগুলিতে) অনুমতি দেয়।
টমটম

4
@ টমটম অ্যাগেইন, যা ইতিমধ্যে প্রশ্নটি কভার করেছে । এটি যা জিজ্ঞাসা করে তা হ'ল, "তাহলে, কেবল বৃহত্তর স্ট্রাক্টগুলিতেই সুবিধাটি রয়েছে, বা পর্দার অন্তর্ভুক্ত কিছু সংকলক অপ্টিমাইজেশন রয়েছে যা এটি অন্য কোথাও আকর্ষণীয় করে তুলেছে? যদি পরবর্তীটি হয় তবে কেন আমি প্রতিটি পরামিতিটি একটি করে রাখব না?" এটি কীভাবে জিজ্ঞাসা করছে না এটি কীভাবে এটি বৃহত্তর স্ট্রাক্টের জন্য আসলেই উপকারী বা ঠিক যখন একেবারেই উপকারী। এটি কেবল জিজ্ঞাসা করছে যে এটি ছোট স্ট্রাকগুলির জন্য উপকারী (এবং তারপরে যদি হ্যাঁ হয় তবে অনুসরণ করে)। আপনার কোনও প্রশ্নের উত্তর নেই।
পরিবেশন করুন

2

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


2

মধ্যে এটি # 7.2 গ কেবলমাত্র রেফারেন্স

এর অর্থ আপনি কেবলমাত্র কাঠামোর রেফারেন্স পাস করে রেফ কেসের অনুরূপ ফাংশন স্ট্যাকের পুরো অবজেক্টটি পাস করবেন না

কিন্তু অবজেক্টের মান পরিবর্তন করার প্রচেষ্টা সংকলক ত্রুটি দেয়।

এবং হ্যাঁ এটি যদি আপনি বড় স্ট্রাকচার ব্যবহার করেন তবে কোডের কার্যকারিতাটি অনুকূল করতে পারবেন।

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