নামফলনের উদ্দেশ্য কী?


263

সংস্করণ 6.0 এর একটি নতুন বৈশিষ্ট্য পেয়েছে nameof , তবে আমি এর উদ্দেশ্য বুঝতে পারি না, কারণ এটি কেবল পরিবর্তনশীল নামটি নেয় এবং এটি সংকলনের একটি স্ট্রিংয়ে পরিবর্তন করে।

আমি ভেবেছিলাম ব্যবহার <T>করার সময় nameof(T)এটির কোনও উদ্দেশ্য থাকতে পারে তবে আমি যখন এটি চেষ্টা করি তখন কেবল Tব্যবহৃত ধরণের পরিবর্তে আমাকে একটি মুদ্রণ করে।

উদ্দেশ্য সম্পর্কে কোন ধারণা?



28
এর Tআগে পাওয়ার উপায় ছিল না । আগে ব্যবহৃত ধরণের পাওয়ার একটি উপায় ছিল।
জন হান্না

প্রথমদিকে এটি ওভারকিলের মতো মনে হয়েছিল এবং আমি এখনও এটি ব্যবহারের জন্য বাধ্যতামূলক কারণ দেখছি না। এমভিসি উদাহরণ হতে পারে?
কোরি অ্যালিক্স

15
নামটির মধ্যে পুনরায় কারখানা / নামকরণ করার সময় অবশ্যই কার্যকর nameof। টাইপস প্রতিরোধেও সহায়তা করে।
বিভিজে

4
অফিসিয়াল ডকুমেন্টেশন nameof এখানে সরানো হয়েছে: docs.microsoft.com/en-us/dotnet/csharp/language-reference/... - এটি কী ব্যবহারের ক্ষেত্রে যা প্রশ্নের একটি প্রশংসনীয় ভাল উত্তর হিসাবে পরিবেশন করা তালিকাবদ্ধ করে।
মার্কাস এর

উত্তর:


322

আপনি যখন কোনও সম্পত্তির নাম পুনঃব্যবহার করতে চান এমন ক্ষেত্রে কী হবে উদাহরণস্বরূপ যখন কোনও সম্পত্তির নামের উপর ভিত্তি করে ব্যতিক্রম ছড়িয়ে দেওয়া বা কোনও PropertyChangedইভেন্ট পরিচালনা করার সময় । এমন অনেকগুলি মামলা রয়েছে যেখানে আপনি সম্পত্তিটির নাম রাখতে চান।

এই উদাহরণটি ধরুন:

switch (e.PropertyName)
{
    case nameof(SomeProperty):
    { break; }

    // opposed to
    case "SomeOtherProperty":
    { break; }
}

প্রথম ক্ষেত্রে, নামকরণ SomeProperty পরিবর্তন করলে সম্পত্তিটির নামও বদলে যায়, বা এটি সংকলন ভেঙে দেয়। শেষ মামলা হয় না।

এটি আপনার কোড সংকলন এবং বাগ মুক্ত রাখার জন্য খুব দরকারী উপায় (সাজানোর)।

( এরিক লিপার্টের খুব সুন্দর একটি নিবন্ধ কেন তৈরি infoofহয়নি, যখন হয়েছে nameof)


1
আমি বিষয়টিটি বুঝতে পারি, কেবল যোগ করেছিলাম যে নামগুলি পুনরায় সংশোধন করার সময় পুনরায় ভাগ করা স্ট্রিংগুলিকে পরিবর্তন করে, ভিএস এর অনুরূপ কার্যকারিতা আছে কিনা তা নিশ্চিত নয়।
অ্যাশ বুর্লাকজেনকো

7
ইহা ছিল. তবে রিশার্পার এবং ভিএস উভয়ই উদাহরণস্বরূপ প্রকল্পগুলিতে কাজ করে না। এটা করে। আসলে, এটিই আরও ভাল সমাধান।
প্যাট্রিক হফম্যান

49
আর একটি সাধারণ ব্যবহারের ক্ষেত্রে এমভিসি ব্যবহার করে রুট করা nameofএবং হার্ড-কোডড স্ট্রিংয়ের পরিবর্তে অ্যাকশনের নাম।
আরজে কুথবার্টসন

2
@ সটন আমি নিশ্চিত না আপনি কী জিজ্ঞাসা করছেন আমি তা বুঝতে পেরেছি। এটির মতো ব্যবহার থেকে public class MyController { public ActionResult Index() { return View(nameof(Index)); } }আপনাকে বিরত nameofকরার কিছুই নেই - এবং আপনি অ স্থিতিশীল সদস্যদের ব্যবহার করতে পারেন (উদাহরণস্বরূপ আপনি nameof(MyController.Index)উপরের ক্লাসটি ব্যবহার করে কল করতে পারেন এবং এটি "সূচক" নির্গত করবে)। উদাহরণগুলি msdn.microsoft.com/en-us/library/… এ দেখুন
আরজে কুথবার্টসন

2
আমি কেন তা বিশেষ তা দেখছি না। পরিবর্তনশীল নামগুলি সবসময় একই থাকে, তাই না? আপনার উদাহরণ রয়েছে বা না হোক, পরিবর্তনশীল নামগুলি @ সটনে পরিবর্তন হবে না
প্যাট্রিক হফম্যান

176

এটি সত্যই কার্যকর ArgumentExceptionএবং এর ডেরাইভেটিভগুলির জন্য:

public string DoSomething(string input) 
{
    if(input == null) 
    {
        throw new ArgumentNullException(nameof(input));
    }
    ...

এখন কেউ যদি inputপ্যারামিটারের নামটি পুনরায় সরিয়ে দেয় তবে ব্যতিক্রমটিও আপ টু ডেট থাকবে।

এটি এমন কিছু জায়গায় কার্যকর যেখানে বৈশিষ্ট্য বা পরামিতিগুলির নাম পাওয়ার জন্য আগে প্রতিচ্ছবি ব্যবহার করতে হয়েছিল।

আপনার উদাহরণে nameof(T)টাইপ প্যারামিটারের নাম পাওয়া যায় - এটিও কার্যকর হতে পারে:

throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");

এর আরেকটি ব্যবহার nameofএনামগুলির জন্য - সাধারণত আপনি যদি ব্যবহার করেন এমন এনামের স্ট্রিং নামটি চান .ToString():

enum MyEnum { ... FooBar = 7 ... }

Console.WriteLine(MyEnum.FooBar.ToString());

> "FooBar"

এটি আসলে তুলনামূলকভাবে ধীর। নেট নেট এনাম মান (অর্থাত্ 7) ধরে রাখে এবং রান সময় নামটি খুঁজে পায়।

পরিবর্তে ব্যবহার করুন nameof:

Console.WriteLine(nameof(MyEnum.FooBar))

> "FooBar"

এখন। নেট কম্পাইল করার সময় এনামের নামটি স্ট্রিংয়ের সাথে প্রতিস্থাপন করে।


তবুও আরেকটি ব্যবহার হ'ল INotifyPropertyChangedলগিংয়ের মতো জিনিসগুলির জন্য - উভয় ক্ষেত্রেই আপনি যে সদস্যটির নামটি অন্য একটি পদ্ধতিতে পাস করার জন্য আহ্বান করছেন তা চাই:

// Property with notify of change
public int Foo
{
    get { return this.foo; }
    set
    {
        this.foo = value;
        PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
    }
}

অথবা ...

// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
    Log(nameof(DoSomething), "Message....");
}

9
এবং আপনি এতে একটি দুর্দান্ত বৈশিষ্ট্য রেখেছেন: স্ট্রিং ইন্টারপোলেশন!
প্যাট্রিক হফম্যান

1
@ পেট্রিকহফম্যান এবং typeof(T)এটি একই রকম পরিস্থিতিতে কার্যকর যে সংকলন-সময় চিনির আর একটি অংশ :-)
কিথ

1
একটা জিনিস যা আমি মিস করছি তা হ'ল কিছুটা nameofthismethod। আপনি ব্যবহার করতে পারেন Log.Error($"Error in {nameof(DoSomething)}...")তবে আপনি যদি অন্য পদ্ধতিতে এটি অনুলিপি করে থাকেন তবে খেয়াল করবেন না যে এটি এখনও উল্লেখ করা হচ্ছে DoSomething। সুতরাং এটি স্থানীয় ভেরিয়েবল বা পরামিতিগুলির সাথে পুরোপুরি কাজ করার সময় পদ্ধতি-নামটি একটি সমস্যা।
টিম শেমলেটার

3
আপনি যদি জানেন তবে উপস্থিত থাকলে গুণটি nameOfব্যবহার করবেন [DisplayName]কিনা? জন্য enumউদাহরণস্বরূপ আমি ব্যবহার [DisplayName]MVC প্রকল্পগুলোতে প্রায়ই
লুক টি ব্রায়েন

2
@ অ্যারোনলস হ্যাঁ, এটি মোটামুটি বিশেষায়িত এবং এমন কিছু নয় যা আপনি প্রায়শই ব্যবহার করেন। তবে এটি throw newসম্পূর্ণ অন্য বিরোধী-প্যাটার্ন - আমি catchজুনিয়র ডেভসগুলির সাথে একটি সাধারণ সমস্যা হিসাবে ওভার ব্যবহারকে খুঁজে পাই কারণ এটি সমস্যাটি ঠিক করার মতো মনে হয় (যখন বেশিরভাগ সময় এটি কেবল লুকিয়ে থাকে)।
কিথ

26

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

লিঙ্কে দেওয়া উদাহরণ থেকে

নাম ছাড়া

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });

নাম সহ

var dog = connection.Query<Dog>($"select {nameof(Dog.Age)} = @Age, {nameof(Dog.Id)} = @Id", new { Age = (int?)null, Id = guid });

3
আমি ড্যাপারকে ভালবাসি এবং আমি সত্যই স্ট্রিং ইন্টারপোরলেশন পছন্দ করি, তবে আইএমও এটি দেখতে খুব খারাপ লাগে। কলামের নাম পরিবর্তন করে কোয়েরি ভাঙ্গার ঝুঁকি যেমন কুরুচিপূর্ণ প্রশ্নের তুলনায় খুব কম মনে হয়। প্রথম দর্শনে আমি বলতে চাই যে আমি ইএফ লিনকিউ কোয়েরি লিখতে পছন্দ করি, বা [টেবিলনাম] এর মতো একটি সম্মেলন অনুসরণ করি [
ড্রাইজিন

@ ডিরিজিন আমি এই জাতীয় প্রশ্নগুলি রোধ করতে ড্যাপার ফ্লুয়েটম্যাপ ব্যবহার করি (এবং উদ্বেগ পৃথক করার জন্যও)
mamuesstack

21

আপনার প্রশ্ন ইতিমধ্যে উদ্দেশ্য প্রকাশ করে। আপনাকে অবশ্যই এটি লগিং বা ব্যতিক্রম ছোঁড়ার জন্য কার্যকর হতে পারে।

উদাহরণ স্বরূপ.

public void DoStuff(object input)
{
    if (input == null)
    {
        throw new ArgumentNullException(nameof(input));
    }
}

এটি ভাল, আমি যদি ভেরিয়েবলের নাম পরিবর্তন করি তবে কোডটি ভেঙে যাবে বা কোনও ভুল বার্তা সহ একটি ব্যতিক্রম ফিরে আসবে


অবশ্যই, ব্যবহারগুলি এই সাধারণ পরিস্থিতিতে সীমাবদ্ধ নয়। আপনি nameofযখনই কোনও ভেরিয়েবল বা সম্পত্তির নাম কোড করা কার্যকর হবে আপনি তা ব্যবহার করতে পারেন ।

আপনি বিভিন্ন বাঁধাই এবং প্রতিবিম্ব পরিস্থিতি বিবেচনা করলে ব্যবহারগুলি বহুগুণ হয়। সময় সংকলনের জন্য রান টাইম ত্রুটিগুলি কী ছিল তা আনার এটি একটি দুর্দান্ত উপায়।


6
@ ইমোটোটোট: তবে, আপনি যদি ভেরিয়েবলটির নাম পরিবর্তন করেন তবে সংকলকটি লক্ষ্য করবে না যে স্ট্রিংটি আর মেলে না।
বা ম্যাপার

1
আমি আসলে পুনঃভাগে ব্যবহার করি যা এটি অ্যাকাউন্টে লাগে তবে আমি আপনার বক্তব্যটি দেখতে পাচ্ছি।
আতিকোট

4
@ আইটোটোট, আমিও তাই করি, তবে রিশার্পার কেবল একটি সতর্কতা তৈরি করে, সংকলক ত্রুটি নয়। একটি নির্দিষ্টতা এবং ভাল পরামর্শের মধ্যে পার্থক্য রয়েছে।
Jodrell

1
@atikot, এবং, Resharper লগিং বার্তা চেক করে না
Jodrell

2
@ জোডরেল: এবং আমার সন্দেহ, এটি অন্যান্য বিভিন্ন ব্যবহারগুলি যাচাই করে না - কোড-ব্যাকডে কীভাবে ডাব্লুপিএফ বাইন্ডিং তৈরি হয়েছিল, কাস্টম OnPropertyChangedপদ্ধতিগুলি (যেগুলি সম্পত্তির নাম পরিবর্তে সরাসরি গ্রহণ করে PropertyChangedEventArgs) বা কোনও নির্দিষ্ট সন্ধানের জন্য প্রতিচ্ছবিতে কল দেয় সদস্য বা টাইপ?
বা ম্যাপার

13

INotifyPropertyChangedইন্টারফেসের সাথে কাজ করার সময় আমি সবচেয়ে সাধারণ ব্যবহারের বিষয়টি ভাবতে পারি । (মূলত ডাব্লুপিএফ এবং বাইন্ডিং সম্পর্কিত সমস্ত কিছু এই ইন্টারফেসটি ব্যবহার করে)

এই উদাহরণটি একবার দেখুন:

public class Model : INotifyPropertyChanged
{
    // From the INotifyPropertyChanged interface
    public event PropertyChangedEventHandler PropertyChanged;

    private string foo;
    public String Foo
    {
        get { return this.foo; }
        set
        {
            this.foo = value;
            // Old code:
            PropertyChanged(this, new PropertyChangedEventArgs("Foo"));

            // New Code:
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(Foo)));           
        }
    }
}

আপনি পুরানো উপায়ে দেখতে পাচ্ছেন কোন সম্পত্তি পরিবর্তন হয়েছে তা নির্দেশ করার জন্য আমাদের একটি স্ট্রিং পাস করতে হবে। nameofআমরা সরাসরি সম্পত্তি নাম ব্যবহার করতে পারেন সঙ্গে । এটি বড় চুক্তির মতো মনে হচ্ছে না। কিন্তু কেউ যখন সম্পত্তিটির নাম পরিবর্তন করে তখন কী হবে তা চিত্র দিন Foo। একটি স্ট্রিং ব্যবহার করার সময় বাঁধাই কাজ করা বন্ধ করে দিবে, তবে সংকলক আপনাকে সতর্ক করবে না। নাম ব্যবহার করার সময় আপনি একটি সংকলক ত্রুটি পাবেন যে নামের সাথে কোনও সম্পত্তি / তর্ক নেই Foo

মনে রাখবেন যে কিছু ফ্রেমওয়ার্কগুলি সম্পত্তিটির নাম পেতে কিছু প্রতিবিম্বিত যাদু ব্যবহার করে তবে এখন আমাদের কাছে নাম রয়েছে এটি আর প্রয়োজনীয় নয়


5
যদিও এটি একটি বৈধ পন্থা, তত বেশি সুবিধাজনক (এবং ডিআরওয়াই) পদ্ধতির মাধ্যমে [CallerMemberName]এই ইভেন্টটি বাড়ানোর জন্য কোনও নতুন পদ্ধতির প্যারামে বৈশিষ্ট্যটি ব্যবহার করা হবে ।
ড্রউ নোকস

1
আমি সম্মত হই যে কলারমেমনারনামটিও দুর্দান্ত, তবে এটি একটি পৃথক ব্যবহারের ক্ষেত্রে, যেহেতু (যেমন আপনি বলেছেন) আপনি কেবল এটি পদ্ধতিতে ব্যবহার করতে পারবেন। DRY হিসাবে, আমি নিশ্চিত না যে এর [CallerMemberName]string x = nullচেয়ে ভাল কিনা nameof(Property)। আপনি বলতে পারেন যে সম্পত্তির নামটি দু'বার ব্যবহৃত হয়, তবে মূলত যুক্তিটি কোনও ফাংশনে পৌঁছে। আমার মনে হয় DRY এর সাথে বোঝানো আসলেই নয় :)।
রায় টি।

আসলে আপনি এটি বৈশিষ্ট্য ব্যবহার করতে পারেন। তারাও সদস্য। সুবিধাটি nameofহ'ল সম্পত্তি নির্ধারকটিকে কপিরাইট / পেস্ট বাগের সম্ভাবনা বাদ দিয়ে প্রোপার্টি নামটি মোটেও নির্দিষ্ট করার দরকার নেই।
ড্রয় নোকস

4
এটি একটি 'আরও ভাল একসাথে' পরিস্থিতি INotifyPropertyChangedব্যবহার করে [CallerMemberNameAttribute]পরিবর্তনের বিজ্ঞপ্তিটি কোনও সম্পত্তি সেটার থেকে পরিষ্কারভাবে উত্থাপিত করার অনুমতি nameofদেয় , যখন সিনট্যাক্সটি পরিবর্তন কোডটি আপনার কোডের আলাদা অবস্থান থেকে পরিষ্কারভাবে উত্থাপিত করতে দেয়।
অ্যান্ড্রু হ্যানলন

9

সর্বাধিক সাধারণ ব্যবহার ইনপুট বৈধকরণে যেমন হবে

//Currently
void Foo(string par) {
   if (par == null) throw new ArgumentNullException("par");
}

//C# 6 nameof
void Foo(string par) {
   if (par == null) throw new ArgumentNullException(nameof(par));
}

প্রথম ক্ষেত্রে, যদি আপনি পদ্ধতি পরিবর্তন refactor সমাবস্থা প্যারামিটার নাম, আপনি সম্ভবত যে পরিবর্তন করার জন্য ভুলবো ArgumentNullExceptionনামের সাথে আপনাকে সে সম্পর্কে চিন্তা করতে হবে না।

আরও দেখুন: নামফ (সি # এবং ভিজ্যুয়াল বেসিক রেফারেন্স)


7

ASP.NET কোর MVC প্রকল্প ব্যবহার nameofমধ্যে AccountController.csএবং ManageController.csসঙ্গে RedirectToActionপদ্ধতি নিয়ামক মধ্যে একটি কর্ম রেফারেন্স।

উদাহরণ:

return RedirectToAction(nameof(HomeController.Index), "Home");

এটি অনুবাদ করে:

return RedirectToAction("Index", "Home");

এবং ব্যবহারকারীকে 'হোম' নিয়ামক হিসাবে 'সূচক' ক্রিয়াতে নিয়ে যায়, অর্থাত্‍ /Home/Index


কেন পুরো-হগ গিয়ে ব্যবহার করবেন না return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));?
সানকাট 2000

@ সানক্যাট 2000 কারণ সেগুলির মধ্যে একটি সংকলনে সম্পন্ন হয়েছে এবং অন্যটি নয়? :)
ডিনারডো

6

যেমন অন্যরা ইতিমধ্যে চিহ্নিত করেছে, nameofঅপারেটরটি নামটি সন্নিবেশ করায় যে উপাদানটি সোর্সকোডে দেওয়া হয়েছিল।

আমি যুক্ত করতে চাই যে রিফ্যাক্টরিংয়ের ক্ষেত্রে এটি সত্যিই ভাল ধারণা কারণ এটি এই স্ট্রিংটি রিফ্যাক্টরিংকে নিরাপদ করে তোলে। পূর্বে, আমি একটি স্থিতিশীল পদ্ধতি ব্যবহার করেছি যা একই উদ্দেশ্যে প্রতিচ্ছবি ব্যবহার করে, তবে এটির রানটাইম পারফরম্যান্সের প্রভাব রয়েছে। nameofঅপারেটর কোন রানটাইম কর্মক্ষমতা প্রভাব রয়েছে; এটি সংকলন সময়ে তার কাজ করে। আপনি MSILকোডটি একবার দেখে নিলে এম্বেডড স্ট্রিংটি দেখতে পাবেন। নিম্নলিখিত পদ্ধতি এবং এর বিচ্ছিন্ন কোড দেখুন।

static void Main(string[] args)
{
    Console.WriteLine(nameof(args));
    Console.WriteLine("regular text");
}

// striped nops from the listing
IL_0001 ldstr args
IL_0006 call System.Void System.Console::WriteLine(System.String)
IL_000C ldstr regular text
IL_0011 call System.Void System.Console::WriteLine(System.String)
IL_0017 ret

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

রানটাইম চলাকালীন নাম নির্ধারণে কিছু কার্যকারিতা ব্যয় হয় তবে অবসন্নতার জন্য এটি নিরাপদ। যদি অপ্রয়োজনীয় প্রয়োজন বা পরিকল্পনা না হয় তবে আমি nameofঅপারেটরটি ব্যবহার করার পরামর্শ দেব ।


5

বিবেচনা করুন যে আপনি আপনার কোডে একটি ভেরিয়েবল ব্যবহার করেছেন এবং ভেরিয়েবলের নাম পাওয়া দরকার এবং এটি মুদ্রণ করে বলতে দিন, আপনার ব্যবহার করা উচিত

int myVar = 10;
print("myVar" + " value is " + myVar.toString());

এবং তারপরে যদি কেউ কোডটি পুনরুদ্ধার করে এবং "মাইওয়ার" এর জন্য অন্য নাম ব্যবহার করে, তবে তাকে আপনার কোডের স্ট্রিংয়ের মানটি দেখতে হবে এবং সে অনুযায়ী এটি চেঞ্জ করতে হবে।

পরিবর্তে যদি আপনি ছিল

print(nameof(myVar) + " value is " + myVar.toString());

এটি স্বয়ংক্রিয়ভাবে চুল্লি সাহায্য করবে!


আমি আশা করি একটি বিশেষ ভেরিয়েবল-প্যারামিটার সিনট্যাক্স রয়েছে যা প্রতিটি প্যারামিটারের জন্য একটি করে টিপলস অ্যারে পাস করবে, যেখানে উত্স কোড উপস্থাপনা Type, এবং মান রয়েছে। এটি কোডকে প্রচুর অপ্রয়োজনীয়তা দূর করার জন্য লগিংয়ের পদ্ধতিগুলির পক্ষে সম্ভব করে তোলে।
সুপারক্যাট

5

এমএসডিএন নিবন্ধে আরও কয়েকজনের মধ্যে এমভিসি রাউটিং (উদাহরণটি সত্য যে আমার জন্য ধারণাটি ক্লিক করেছিল) তালিকাভুক্ত করে। (ফর্ম্যাট) বিবরণ অনুচ্ছেদে পড়ে:

  • কোডে ত্রুটিগুলি রিপোর্ট করার সময়,
  • মডেল-ভিউ-কন্ট্রোলার (এমভিসি) লিঙ্কগুলি হুকিং করা,
  • গুলি ছুঁড়ে ফেলা সম্পত্তি, ইত্যাদি পরিবর্তন করেছে,

আপনি প্রায়শই একটি পদ্ধতির স্ট্রিং নাম ক্যাপচার করতে চান । নাম ব্যবহার করে সংজ্ঞা পরিবর্তনের সময় আপনার কোডটি বৈধ রাখতে সহায়তা করে

সংজ্ঞাগুলি উল্লেখ করার জন্য আপনাকে স্ট্রিং আক্ষরিক ব্যবহার করতে হবে যা কোড উপাদানগুলির নাম পরিবর্তন করার সময় ভঙ্গুর কারণ সরঞ্জামগুলি এই স্ট্রিংয়ের অক্ষরগুলি পরীক্ষা করতে জানে না।

গৃহীত / শীর্ষ রেট করা উত্তরগুলি ইতিমধ্যে বেশ কয়েকটি দুর্দান্ত কংক্রিটের উদাহরণ দেয়।


3

nameofঅপারেটরের উদ্দেশ্য হস্তশিল্পের উত্সের নাম সরবরাহ করা।

সাধারণত উত্স নামটি মেটাডেটা নামের একই নাম:

public void M(string p)
{
    if (p == null)
    {
        throw new ArgumentNullException(nameof(p));
    }
    ...
}

public int P
{
    get
    {
        return p;
    }
    set
    {
        p = value;
        NotifyPropertyChanged(nameof(P));
    }
}

তবে এটি সবসময় নাও হতে পারে:

using i = System.Int32;
...
Console.WriteLine(nameof(i)); // prints "i"

বা:

public static string Extension<T>(this T t)
{
    return nameof(T); returns "T"
}

একটি ব্যবহার যা আমি এটি দিয়েছি তা সম্পদ নামকরণের জন্য:

[Display(
    ResourceType = typeof(Resources),
    Name = nameof(Resources.Title_Name),
    ShortName = nameof(Resources.Title_ShortName),
    Description = nameof(Resources.Title_Description),
    Prompt = nameof(Resources.Title_Prompt))]

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


0

ব্যবহারের এক nameofশব্দ সেটিং জন্য Bindingwpf মধ্যে প্রোগ্রামেটিক্যালি

সেট Bindingকরতে আপনাকে Pathস্ট্রিং এবং এর সাথে সেট করতে হবেnameof কীওয়ার্ড , রিফ্যাক্টর বিকল্পটি ব্যবহার করা সম্ভব।

উদাহরণস্বরূপ, যদি আপনি IsEnableআপনার নির্ভরতা সম্পত্তি UserControlএবং তোমাদের তা জুড়তে অনুমতি চান IsEnableকিছু CheckBoxআপনার UserControl, আপনি এই দুটি কোডের ব্যবহার করতে পারেন:

CheckBox chk = new CheckBox();
Binding bnd = new Binding ("IsEnable") { Source = this };
chk.SetBinding(IsEnabledProperty, bnd);

এবং

CheckBox chk = new CheckBox();
Binding bnd = new Binding (nameof (IsEnable)) { Source = this };
chk.SetBinding(IsEnabledProperty, bnd);

এটি স্পষ্টতই প্রথম কোডটি রিফ্যাক্টর করতে পারে না তবে এটি আলাদা আলাদা ...


0

আগে আমরা এরকম কিছু ব্যবহার করতাম:

// Some form.
SetFieldReadOnly( () => Entity.UserName );
...
// Base form.
private void SetFieldReadOnly(Expression<Func<object>> property)
{
    var propName = GetPropNameFromExpr(property);
    SetFieldsReadOnly(propName);
}

private void SetFieldReadOnly(string propertyName)
{
    ...
}

কারণ - সময় সুরক্ষা সঙ্কলন। কেউ নিঃশব্দে সম্পত্তিটির নাম পরিবর্তন করতে এবং কোড লজিক ভাঙতে পারে না। এখন আমরা নেমফ () ব্যবহার করতে পারি।


0

আপনি এএসপি.নেট এমভিসি ব্যবহার করার সময় এর সুবিধা রয়েছে। আপনি যখন এইচটিএমএল সহায়তাকারীটিকে কিছু নিয়ন্ত্রণ তৈরি করতে ব্যবহার করেন তখন এটি এইচটিএমএল ইনপুটটির নাম বৈশিষ্ট্যযুক্ত সম্পত্তির নাম ব্যবহার করে:

@Html.TextBoxFor(m => m.CanBeRenamed)

এটি এমন কিছু তৈরি করে:

<input type="text" name="CanBeRenamed" />

সুতরাং এখন, যদি আপনার সম্পত্তি বৈধকরণ পদ্ধতিতে যাচাই করতে হয় তবে আপনি এটি করতে পারেন:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
  if (IsNotValid(CanBeRenamed)) {
    yield return new ValidationResult(
      $"Property {nameof(CanBeRenamed)} is not valid",
      new [] { $"{nameof(CanBeRenamed)}" })
  }
}

আপনি যদি রিফ্যাক্টরিং সরঞ্জাম ব্যবহার করে আপনার সম্পত্তিটির নাম পরিবর্তন করেন তবে আপনার বৈধতা ভঙ্গ হবে না।


0

এর আরেকটি ব্যবহারের ক্ষেত্রে nameofট্যাব পৃষ্ঠাগুলি পরীক্ষা করা হয়, সূচীটি পরীক্ষার পরিবর্তে আপনি ট্যাব পৃষ্ঠাগুলির Nameবৈশিষ্ট্যটি নিম্নলিখিত হিসাবে পরীক্ষা করতে পারেন :

if(tabControl.SelectedTab.Name == nameof(tabSettings))
{
    // Do something
}

কম অগোছালো :)


0

আমি দেখতে পেয়েছি যে nameofআমার অ্যাপ্লিকেশনগুলিতে খুব দীর্ঘ এবং জটিল এসকিউএল স্টেটমেন্টের পঠনযোগ্যতা বৃদ্ধি করে। এটি ভেরিয়েবলগুলি সেই স্ট্রিংয়ের সমুদ্রের বাইরে দাঁড় করায় এবং আপনার এসকিউএল স্টেটমেন্টগুলিতে ভেরিয়েবলগুলি কোথায় ব্যবহৃত হয় তা নির্ধারণের আপনার কাজটি সরিয়ে দেয়।

public bool IsFooAFoo(string foo, string bar)
{
    var aVeryLongAndComplexQuery = $@"SELECT yada, yada
    -- long query in here
    WHERE fooColumn = @{nameof(foo)}
    AND barColumn = @{nameof(bar)}
    -- long query here";


    SqlParameter[] parameters = {
        new SqlParameter(nameof(foo), SqlDBType.VarChar, 10){ Value = foo },
        new SqlParameter(nameof(bar), SqlDBType.VarChar, 10){ Value = bar },
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.