সংকলন সময়ে নামম () মূল্যায়ন করা হয়?


114

সি # 6 এ, আপনি nameof()চলক বা কোনও ধরণের নাম যুক্ত স্ট্রিং পেতে অপারেটরটি ব্যবহার করতে পারেন ।

এটি কি সংকলন-সময়ে, বা কোনও রোজলিন API এর মাধ্যমে রানটাইম এ মূল্যায়ন করা হয়?


রোজলিন হ'ল নতুন সংকলক প্ল্যাটফর্ম। এটি কেবল সংকলন-সময়ে ব্যবহৃত হয়।
পাওলো মোরগাদো

2
@ পাওলো মুরগাদো এটি সত্য নয়, আপনি কাজগুলি করতে রানলিন ব্যবহার করতে পারেন। যেমন লাইভ কোড এডিটর তৈরি করা বা গাছ বা এক্সপ্রেশন বা
কোনও

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

@ ক্রিসমারিসিক, সুতরাং, আপনি যা বলছেন তা হ'ল আপনি রোজলিনকে উত্স থেকে লাইভ কোড তৈরি করতে ব্যবহার করতে পারেন, যে বাইনারি চলছে তার থেকে নয়। এবং আপনি এখনও রোস্লিনকে উত্সগুলি বাইনারিগুলিতে রূপান্তর করতে ব্যবহার করছেন যা থলিস বাইনারিগুলি পরিবর্তন করতে রোজলিন ব্যবহার করবে না। আপনি যদি রানটাইমটিতে অজস্রভাবে রোজলিন ব্যবহার করতে না পারেন তবে আপনি কোনও কোডই সংকলন করতে পারবেন না।
পাওলো মোরগাদো

উত্তর:


119

হ্যাঁ. nameof()সংকলন সময়ে মূল্যায়ন করা হয়। চশমাটির সর্বশেষতম সংস্করণটি দেখছেন:

নাম প্রকাশের একটি ধ্রুবক। সমস্ত ক্ষেত্রে, স্ট্রিং তৈরির জন্য সংকলন-সময়ে নেমফ (...) মূল্যায়ন করা হয় । রানটাইমের সময়ে এর যুক্তিটি মূল্যায়ন করা হয় না এবং এটি অ্যাক্সেসযোগ্য কোড হিসাবে বিবেচনা করা হয় (তবে এটি "অ্যাক্র্যাচ্য কোড" সতর্কতা নির্গত করে না)।

নাম অপারেটর থেকে - v5

আপনি এই ট্রাইরোসলিন উদাহরণ দিয়ে দেখতে পারেন যেখানে এটি:

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");
    }
}

এখানে "সংকলন-সময়" কী? এমএসআইএল-এর সংকলন বা দেশীয় কোডের সংকলন?
ব্যবহারকারী541686

6
@ মেহরদাদ সি # সংকলক আইএল তৈরি করে।
i3arnon

3
দ্রুত প্রশ্ন, আমি কি একটি সুইচ ক্ষেত্রে নাম ব্যবহার করতে পারি?
বানান

2
@ স্পেল হ্যাঁ
i3arnon

58

@ 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একটি স্ট্রিং ভেরিয়েবল ঘোষণার মতো দক্ষ।


4
যদি এমএসআইএলকে সোর্স কোডে বিভক্ত করা হয় তবে ডিকম্পিলারটি এটি nameofঅপারেটর, স্বচ্ছ হার্ডকোডযুক্ত স্ট্রিং নয় তা সনাক্ত করা কত সহজ হবে ?
ADTC

11
এটা একটা ভালো প্রশ্ন! আপনি যদি এটির একটি বিস্তারিত ব্যাখ্যা পেতে চান তবে আপনি এটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করতে পারেন :) .. তবে সংক্ষিপ্ত উত্তরটি হ'ল ডিকম্পিলারটি এটি একটি নামফলক অপারেটর ছিল তা সনাক্ত করতে সক্ষম হবে না, তবে পরিবর্তে একটি স্ট্রিং আক্ষরিক ব্যবহার করবে । আমি যাচাই করেছি যা আইএলএসপিএস এবং রিফ্লেক্টরের ক্ষেত্রে।
ফারিস জ্যাকিনা

2
@ এডটিসি: লোড-এ-স্ট্রিং-অন-দ্য স্ট্যাকের সাথে নামটি পুরোপুরি প্রতিস্থাপন করা হয়েছে, কীভাবে ডিকম্পোলারটি অনুমান করার চেষ্টা করতে পারে যে এটি একটি নামফলক ছিল, এবং একটি সাধারণ ধ্রুবক প্যারামিটার নয়?
কোয়েটজলকোটল

2
সেটা মজাদার. সম্ভবত ডিকম্পিলারটি বর্তমান প্রসঙ্গে (পদ্ধতি / সম্পত্তি / আপনি যে নামটিতে আছেন) এর বিপরীতে স্ট্রিংটি পরীক্ষা করতে পারে। তবুও, এটির জন্য 100% নির্ভরযোগ্য হওয়ার কোনও উপায় নেই - আপনি সর্বোপরি একটি হার্ডকোডযুক্ত স্ট্রিং ব্যবহার করতে পারেন।
গিগি

2
যদিও আমি সম্মত হই যে সংকলনের পরে এটি কোনও নাম হিসাবে আপনি জানতে পারবেন না, আমি এখনও কোনও ইঙ্গিত দেখতে পাচ্ছি না যে আইএলএসপি বা রিফ্লেক্টর সি # 6 সমর্থন করে। যদি মামলাটি না হয় তবে আপনি এটি পরীক্ষা করতে পারবেন না @ মন্ত্রী
মিলি স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.