এই প্রশ্নটি 23 ই জুন 2011 এ আমার ব্লগের বিষয় ছিল । মহান প্রশ্নের জন্য ধন্যবাদ!
সি # টিম এটি সি # 7-র জন্য বিবেচনা করছে details বিশদের জন্য https://github.com/dotnet/roslyn/issues/5233 দেখুন ।
আপডেট: বৈশিষ্ট্যটি এটি সি # 7 এ তৈরি করেছে!
আপনি সঠিক; .NET এমন পদ্ধতিগুলি সমর্থন করে যা ভেরিয়েবলগুলিতে পরিচালিত রেফারেন্সগুলি ফিরিয়ে দেয় । .NET স্থানীয় ভেরিয়েবলগুলিকে সমর্থন করে যা অন্যান্য ভেরিয়েবলের পরিচালিত রেফারেন্স ধারণ করে। (তবে লক্ষ করুন যে .NET ক্ষেত্র বা অ্যারেগুলিকে সমর্থন করে না যা অন্যান্য ভেরিয়েবলের পরিচালিত রেফারেন্স ধারণ করে কারণ এটি অতিরিক্তভাবে আবর্জনা সংগ্রহের গল্পকে জটিল করে তোলে Also এছাড়াও "ভেরিয়েবলের জন্য পরিচালিত রেফারেন্স" প্রবন্ধটি বস্তুতে রূপান্তরিত নয় , এবং তাই এটি ব্যবহার করা যেতে পারে না জেনেরিক প্রকার বা পদ্ধতিতে যুক্তিগুলি টাইপ করুন))
মন্তব্যকারী "আরপিএম 1984" কোনও কারণে এই সত্যটির জন্য প্রশংসা চেয়েছিল। RPM1984 আমি আপনাকে নেট .NET এর বৈশিষ্ট্য সম্পর্কে তথ্যের জন্য CLI স্পেসিফিকেশন পার্টিশন I ধারা 8.2.1.1, "পরিচালিত পয়েন্টার এবং সম্পর্কিত প্রকারগুলি" পড়তে উত্সাহিত করি।
সি # এর একটি সংস্করণ তৈরি করা সম্পূর্ণভাবে সম্ভব যা এই দুটি বৈশিষ্ট্যই সমর্থন করে। আপনি তখন মত জিনিস করতে পারে
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
এবং তারপরে এটি কল করুন
int a = 123;
int b = 456;
ref int c = ref Max(ref a, ref b);
c += 100;
Console.WriteLine(b); // 556!
আমি অনুগতভাবে জানি যে সি # এর এমন একটি সংস্করণ তৈরি করা সম্ভব যা এই বৈশিষ্ট্যগুলিকে সমর্থন করে কারণ আমি এটি করেছি । উন্নত প্রোগ্রামাররা, বিশেষত লোকেরা যাতে পরিচালনা না করা সি ++ কোড পোর্ট করে, প্রায়শই আমাদের আরও সি ++ জিজ্ঞাসা করেন - যেমন পয়েন্টারগুলি ব্যবহার করে এবং পুরো জায়গা জুড়ে মেমরি পিন করার বড় হাতুড়িটি না পেয়ে রেফারেন্স সহ জিনিসগুলি করার ক্ষমতা। পরিচালিত রেফারেন্সগুলি ব্যবহার করে আপনি আপনার আবর্জনা সংগ্রহের পারফরম্যান্সের মূল্য পরিশোধ না করে এই সুবিধাগুলি পান।
আমরা এই বৈশিষ্ট্যটি বিবেচনা করেছি, এবং অন্যান্য অভ্যন্তরীণ দলগুলিকে তাদের প্রতিক্রিয়া জানাতে এটি যথেষ্ট পরিমাণে প্রয়োগ করেছি। তবে আমাদের গবেষণার উপর ভিত্তি করে এই মুহুর্তে আমরা বিশ্বাস করি যে বৈশিষ্ট্যটির সত্যিকারের সমর্থিত ভাষার বৈশিষ্ট্য তৈরি করার জন্য পর্যাপ্ত পরিমাণ আবেদন বা বাধ্যমূলক ব্যবহারের কেস নেই । আমাদের অন্যান্য উচ্চতর অগ্রাধিকার রয়েছে এবং সীমিত পরিমাণ সময় এবং প্রচেষ্টা উপলব্ধ রয়েছে, তাই আমরা শীঘ্রই এই বৈশিষ্ট্যটি আর যাচ্ছি না।
এছাড়াও, এটি সঠিকভাবে করার জন্য সিএলআর-তে কিছু পরিবর্তন প্রয়োজন। এই মুহুর্তে সিএলআর রিফ্রিং পদ্ধতিগুলি আইনী তবে যাচাইযোগ্য নয় বলে বিবেচনা করে কারণ আমাদের এমন একটি সনাক্তকারী নেই যা এই পরিস্থিতি সনাক্ত করে:
ref int M1(ref int x)
{
return ref x;
}
ref int M2()
{
int y = 123;
return ref M1(ref y); // Trouble!
}
int M3()
{
ref int z = ref M2();
return z;
}
এম 3 এম 2 এর স্থানীয় ভেরিয়েবলের বিষয়বস্তু ফেরত দেয় তবে সেই পরিবর্তনশীলটির জীবনকাল শেষ হয়ে গেছে! এমন একটি সনাক্তকারী লিখতে সম্ভব যা রেফ-রিটার্নের ব্যবহারগুলি নির্ধারণ করে যা পরিষ্কারভাবে স্ট্যাক সুরক্ষা লঙ্ঘন করে না । আমরা যা করবো তা হল এই জাতীয় একটি ডিটেক্টর লিখুন এবং যদি ডিটেক্টর স্ট্যাক সুরক্ষা প্রমাণ করতে না পারে, তবে আমরা প্রোগ্রামের সেই অংশে রেফ রিটার্ন ব্যবহারের অনুমতি দেব না। এটি করা কোনও বিশাল পরিমাণে দেব কাজ নয়, তবে আমরা সত্যিই সমস্ত কেস পেয়েছি তা নিশ্চিত করার জন্য টেস্টিং দলগুলির উপর এটি অনেক বোঝা। এটি কেবলমাত্র অন্য একটি জিনিস যা বৈশিষ্ট্যের ব্যয় এমন পর্যায়ে বৃদ্ধি করে যেখানে এখনই সুবিধাগুলি ব্যয়কে ছাড়িয়ে যায় না।
আপনি যদি এই বৈশিষ্ট্যটি কেন চান তা যদি আপনি আমার জন্য বর্ণনা করতে পারেন তবে আমি সত্যিই এটির প্রশংসা করব । তারা কেন এটি চায় সে সম্পর্কে আমাদের সত্যিকারের গ্রাহকদের কাছ থেকে যত বেশি তথ্য রয়েছে, সম্ভবত এটি কোনও দিন এটি পণ্যটিতে পরিণত করবে। এটি খুব সুন্দর একটি বৈশিষ্ট্য এবং যথেষ্ট আগ্রহ থাকলে আমি এটি কোনওভাবে গ্রাহকদের কাছে পেতে সক্ষম হতে চাই।
(সম্পর্কিত প্রশ্নগুলিও দেখুন কি সি # তে চলকটির কোনও রেফারেন্স ফেরানো সম্ভব? এবং আমি কি সি ++ এর মতো সি # ফাংশনের অভ্যন্তরে কোনও রেফারেন্স ব্যবহার করতে পারি? )