সি # 6 এ, আপনি nameof()
চলক বা কোনও ধরণের নাম যুক্ত স্ট্রিং পেতে অপারেটরটি ব্যবহার করতে পারেন ।
এটি কি সংকলন-সময়ে, বা কোনও রোজলিন API এর মাধ্যমে রানটাইম এ মূল্যায়ন করা হয়?
সি # 6 এ, আপনি nameof()
চলক বা কোনও ধরণের নাম যুক্ত স্ট্রিং পেতে অপারেটরটি ব্যবহার করতে পারেন ।
এটি কি সংকলন-সময়ে, বা কোনও রোজলিন API এর মাধ্যমে রানটাইম এ মূল্যায়ন করা হয়?
উত্তর:
হ্যাঁ. nameof()
সংকলন সময়ে মূল্যায়ন করা হয়। চশমাটির সর্বশেষতম সংস্করণটি দেখছেন:
নাম প্রকাশের একটি ধ্রুবক। সমস্ত ক্ষেত্রে, স্ট্রিং তৈরির জন্য সংকলন-সময়ে নেমফ (...) মূল্যায়ন করা হয় । রানটাইমের সময়ে এর যুক্তিটি মূল্যায়ন করা হয় না এবং এটি অ্যাক্সেসযোগ্য কোড হিসাবে বিবেচনা করা হয় (তবে এটি "অ্যাক্র্যাচ্য কোড" সতর্কতা নির্গত করে না)।
আপনি এই ট্রাইরোসলিন উদাহরণ দিয়ে দেখতে পারেন যেখানে এটি:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
এতে সংকলিত এবং সংক্রামিত হয়:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
এটির রান-টাইম সমতুল্য:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
মন্তব্যে যেমন উল্লেখ করা হয়েছিল, তার অর্থ এই যে আপনি যখন nameof
জেনেরিক প্রকারে টাইপ পরামিতি ব্যবহার করেন, তখন কেবলমাত্র প্যারামিটারের নামের পরিবর্তে প্রকৃত গতিশীল টাইপের নাম টাইপ প্যারামিটার হিসাবে ব্যবহার করার আশা করবেন না। আমার স্নাতকের:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
@ I3arnon দ্বারা প্রদত্ত উত্তরটি সংকলন-সময়ে মূল্যায়ন করা হয় এমন একটি প্রমাণ দিয়ে সমৃদ্ধ করতে চেয়েছিলাম ।
ধরে নেওয়া যাক আমি nameof
অপারেটরটি ব্যবহার করে কনসোলের একটি ভেরিয়েবলের নাম মুদ্রণ করতে চাই :
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
এমএসআইএল উত্পন্ন উত্সাহটি পরীক্ষা করে দেখবেন আপনি এটি একটি স্ট্রিং ঘোষণার সমতুল্য কারণ স্ট্রিংয়ের একটি অবজেক্ট রেফারেন্স ldstr
অপারেটরটি ব্যবহার করে স্ট্যাকের দিকে ঠেলাঠেলি করে :
IL_0001: ldstr "Gigi"
IL_0006: stloc.0
IL_0007: ldstr "firstname"
IL_000c: stloc.1
IL_000d: ldloc.1
IL_000e: call void [mscorlib]System.Console::WriteLine(string)
আপনি খেয়াল করবেন যে প্রথম নামটির স্ট্রিং ঘোষণা করে এবং nameof
অপারেটরটি ব্যবহার করে এমএসআইএলে একই কোড উত্পন্ন হয় যার অর্থ nameof
একটি স্ট্রিং ভেরিয়েবল ঘোষণার মতো দক্ষ।
nameof
অপারেটর, স্বচ্ছ হার্ডকোডযুক্ত স্ট্রিং নয় তা সনাক্ত করা কত সহজ হবে ?