আমার কখন অলস ব্যবহার করা উচিত <T>?


327

আমি এই নিবন্ধটি সম্পর্কে পেয়েছি Lazy: সি # 4.0 - অলসতায় অলসতা

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


42
প্রতিস্থাপিত: get { if (foo == null) foo = new Foo(); return foo; }। এবং এটি ব্যবহারের জন্য লক্ষ লক্ষ সম্ভাব্য জায়গা রয়েছে ...
কर्क ওল

57
নোট করুন যে get { if (foo == null) foo = new Foo(); return foo; }থ্রেড-নিরাপদ নয়, অন্যদিকে Lazy<T>ডিফল্টরূপে থ্রেড-নিরাপদ।
ম্যাথু

23
এমএসডিএন থেকে: গুরুত্বপূর্ণ: অলস সূচনাটি থ্রেড-নিরাপদ, তবে এটি তৈরির পরে অবজেক্টটিকে সুরক্ষা দেয় না। প্রকারের থ্রেডটি নিরাপদ না হলে আপনার অবজেক্টটি অ্যাক্সেস করার আগে লক করতে হবে।
পেড্রো.ও.কিড

উত্তর:


237

আপনি যখন প্রথমে কিছু ব্যবহারের জন্য এটি প্রথমবার ব্যবহার করতে চান তখন আপনি সাধারণত এটি ব্যবহার করেন। এটি সর্বদা ব্যয় করার পরিবর্তে / যখন প্রয়োজন হয় তখন পর্যন্ত এটি তৈরিতে ব্যয় করে।

সাধারণত এটি তখন পছন্দনীয় যখন অবজেক্টটি ব্যবহৃত হতে পারে বা নাও ব্যবহৃত হয় এবং এটি নির্মাণের ব্যয়টি তুচ্ছ-তুচ্ছ হয়।


121
কেন সবসময় অলস ব্যবহার করবেন না?
ট্রুথঅফ 42

44
এটি প্রথম ব্যবহারের জন্য ব্যয় বহন করে এবং এটি করার জন্য কিছু লকিং ওভারহেড (বা না হলে থ্রেড নিরাপত্তার ত্যাগ করতে পারে) ব্যবহার করতে পারে। সুতরাং, এটি সাবধানে চয়ন করা উচিত এবং প্রয়োজন না হলে ব্যবহার করা উচিত নয়।
জেমস মাইকেল হরে

3
জেমস আপনি দয়া করে "এবং নির্মাণের ব্যয়টি তুচ্ছ" এর উপর প্রসারিত করতে পারেন? আমার ক্ষেত্রে আমার ক্লাসে আমার 19 টি সম্পত্তি রয়েছে এবং বেশিরভাগ ক্ষেত্রে কেবল 2 বা 3 টির দিকে নজর দেওয়া প্রয়োজন। সুতরাং আমি প্রতিটি সম্পত্তি ব্যবহার করে বাস্তবায়ন বিবেচনা করছি Lazy<T>। যাইহোক, প্রতিটি সম্পত্তি তৈরি করার জন্য আমি একটি লিনিয়ার ইন্টারপোলেশন (বা একটি বিলাইনার ইন্টারপোলেশন) করছি যা মোটামুটি তুচ্ছ তবে এর কিছু খরচ আছে। (আপনি কি পরামর্শ দিতে যাচ্ছেন যে আমি গিয়ে আমার নিজের পরীক্ষা করবো?)
বেন

3
জেমস, আমার নিজের পরামর্শ নিয়ে আমি নিজের পরীক্ষাটি করেছিলাম। আমার পোস্ট দেখুন
বেন

17
উচ্চতর আউটপুট, স্বল্প ল্যাটেন্সি সিস্টেমগুলিতে ব্যবহারকারীর বিলম্বিতা রোধ করতে আপনি সিস্টেম স্টার্ট-আপকে "শুরু করার সময়" সমস্ত কিছু সূচনা / ইনস্ট্যান্ট করতে চাইতে পারেন want "সর্বদা" অলস ব্যবহার না করার এটি অনেক কারণগুলির মধ্যে একটি।
ডেরিক

126

আপনার সিঙ্গলেটগুলি ব্যবহার এড়াতে চেষ্টা করা উচিত, তবে আপনার যদি কখনও প্রয়োজন হয় তবে Lazy<T>অলস, থ্রেড-নিরাপদ সিলেটলেটগুলি কার্যকর করে তোলে:

public sealed class Singleton
{
    // Because Singleton's constructor is private, we must explicitly
    // give the Lazy<Singleton> a delegate for creating the Singleton.
    static readonly Lazy<Singleton> instanceHolder =
        new Lazy<Singleton>(() => new Singleton());

    Singleton()
    {
        // Explicit private constructor to prevent default public constructor.
        ...
    }

    public static Singleton Instance => instanceHolder.Value;
}

38
আমি পড়তে পছন্দ করি না আমি সিলেটলেটগুলি ব্যবহার করার সময় এগুলি ব্যবহার করার চেষ্টা করা উচিত: ডি ... এখন এগুলি কেন এড়ানো উচিত সে সম্পর্কে আমার শিখতে হবে: ডি
বার্ট ক্যালিক্স্টো

24
মাইক্রোসফ্ট তাদের উদাহরণগুলিতে তাদের ব্যবহার বন্ধ করে দিলে আমি সিঙ্গলেটগুলি ব্যবহার বন্ধ করব।
agগলই 22

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

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

সবকিছুরই একটি উদ্দেশ্য থাকে, এমন পরিস্থিতিতে রয়েছে যেখানে সিলেটলেটগুলি একটি ভাল পদ্ধতির এবং পরিস্থিতি যেখানে এটি নয় :) :)
হককি

86

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

বলুন আপনার কাছে এমন একটি সত্তা গ্রাহক রয়েছে যার নাম, ফোন নাম্বার এবং অর্ডারগুলির বৈশিষ্ট্য রয়েছে। নাম এবং ফোন নাম্বার নিয়মিত স্ট্রিং তবে অর্ডারগুলি একটি নেভিগেশন সম্পত্তি যা গ্রাহকরা যে কোনও অর্ডারের একটি তালিকা প্রদান করে।

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

এটি অলস লোডিংয়ের জন্য উপযুক্ত জায়গা কারণ যদি অর্ডার সম্পত্তিটি অলস হয় তবে এটির সত্যিকারের প্রয়োজন না হলে সমস্ত গ্রাহকের অর্ডার আনতে হবে না। অর্ডার সম্পত্তি ধৈর্য সহকারে ঘুমন্ত অবস্থায় আপনি যখন গ্রাহককে কেবল তাদের নাম এবং ফোন নম্বর পেয়েছেন তার জন্য প্রস্তুত থাকতে পারেন, যখন আপনার প্রয়োজন হবে তার জন্য প্রস্তুত।


34
খারাপ উদাহরণ, যেমন অলস লোডিং ইতিমধ্যে ORM তে অন্তর্নির্মিত হয়। অলস লোডিং পেতে আপনার পোকোগুলিতে অলস <T> মান যুক্ত করা শুরু করা উচিত নয়, তবে এটি করার জন্য ORM- নির্দিষ্ট উপায়টি ব্যবহার করুন।
ডিনালন

56
@ ডায়না এই উদাহরণটি একটি ওআরএম-র অন্তর্নির্মিত অলস লোডিংয়ের কথা উল্লেখ করছে কারণ আমি মনে করি এটি সুস্পষ্ট এবং সরল উপায়ে অলস লোডিংয়ের উপযোগিতার উদাহরণ দেয়।
ডেসপারটার

যদি আপনি সত্তা ফ্রেমওয়ার্ক ব্যবহার করছেন তবে তাদের নিজের অলসতা প্রয়োগ করা উচিত? নাকি ইএফ এটি আপনার জন্য করে?
Zapnologica

7
@ জাপনোলজিকা ইএফ ডিফল্টরূপে আপনার জন্য এটি করে। আসলে, আপনি যদি আগ্রহী লোডিং করতে চান (অলস লোডিংয়ের বিপরীত), আপনাকে অবশ্যই স্পষ্টভাবে ব্যবহার করে EF বলতে হবে Db.Customers.Include("Orders")। এর ফলে অর্ডারটি যুক্ত হওয়ার পরে Customer.Ordersসম্পত্তিটি প্রথম ব্যবহৃত হওয়ার পরিবর্তে সেই মুহূর্তে কার্যকর করা হবে । অলস লোডিং ডিবি কনটেক্সট এর মাধ্যমেও অক্ষম করা যায়।
দেশ্পের্তে

2
প্রকৃতপক্ষে এটি একটি ভাল উদাহরণ, যেহেতু ড্যাপারের মতো কিছু ব্যবহার করার সময় কেউ এই কার্যকারিতা যুক্ত করতে চান।
টবোন

41

আমি Lazy<T>আমার নিজস্ব কোডের কার্যকারিতা উন্নত করতে (এবং এটি সম্পর্কে আরও কিছুটা জানতে) বৈশিষ্ট্যগুলি ব্যবহার করার বিষয়ে বিবেচনা করছি। আমি কখন এটি ব্যবহার করব সে সম্পর্কে উত্তরগুলি খুঁজতে এখানে এসেছি তবে মনে হয় যে আমি যেখানেই যাচ্ছি সেখানে এই জাতীয় বাক্যাংশ রয়েছে:

একটি বৃহত বা সংস্থান-নিবিড় বস্তুর সৃষ্টি স্থগিত করতে অলস সূচনা ব্যবহার করুন বা কোনও সংস্থান-নিবিড় কার্য সম্পাদন বিশেষত যখন প্রোগ্রামের জীবদ্দশায় এই জাতীয় সৃষ্টি বা সম্পাদন না ঘটে execution

থেকে দুটিই MSDN অলস <টি> ক্লাস

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

শেষ পর্যন্ত আমি আমার নিজের পরীক্ষার চেষ্টা করার সিদ্ধান্ত নিয়েছি এবং আমি ভেবেছিলাম যে ফলাফলগুলি এখানে ভাগ করে নেব। দুর্ভাগ্যক্রমে আমি এই ধরণের পরীক্ষাগুলি করার ক্ষেত্রে সত্যই বিশেষজ্ঞ নই এবং তাই উন্নতিগুলির প্রস্তাব দেওয়া মন্তব্য পেয়ে আমি আনন্দিত।

বিবরণ

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

আমি প্রতিটি পদ্ধতির জন্য 20 টি পরীক্ষা বৈশিষ্ট্য (তাদের টি-সম্পত্তি বলতে পারি) দিয়ে একটি পৃথক পরীক্ষার শ্রেণি তৈরি করেছি।

  • গেটইন্টার্প ক্লাস: প্রতিবার কোনও টি-সম্পত্তি পাওয়ার পরে লিনিয়ার ইন্টারপোলেশন চালায়
  • ইনিআইন্টার্প ক্লাস: কনস্ট্রাক্টরের প্রত্যেকের জন্য লিনিয়ার ইন্টারপোলেশন চালিয়ে টি-প্রোপার্টি শুরু করে। গেটটি কেবল একটি ডাবল ফেরত দেয়।
  • ইনিলসি ক্লাস: টি-বৈশিষ্ট্যগুলিকে অলস বৈশিষ্ট্য হিসাবে সেট করুন যাতে সম্পত্তিটি প্রথম পাওয়া গেলে লিনিয়ার ইন্টারপোলেশন একবার চালানো হয়। পরবর্তী গেসগুলি কেবল ইতিমধ্যে গণনা করা ডাবলকে ফিরিয়ে আনতে হবে।

পরীক্ষার ফলাফলগুলি এমএসে পরিমাপ করা হয় এবং এটি 50 টি ইনস্ট্যান্টেশন বা 20 টি সম্পত্তি পায় property প্রতিটি পরীক্ষা তখন 5 বার চালানো হয়েছিল।

পরীক্ষার 1 ফলাফল: ইনস্ট্যান্টেশন (গড় 50 টি ইনস্ট্যান্টেশন)

Class      1        2        3        4        5        Avg       %
------------------------------------------------------------------------
GetInterp  0.005668 0.005722 0.006704 0.006652 0.005572 0.0060636 6.72
InitInterp 0.08481  0.084908 0.099328 0.098626 0.083774 0.0902892 100.00
InitLazy   0.058436 0.05891  0.068046 0.068108 0.060648 0.0628296 69.59

পরীক্ষা 2 ফলাফল: প্রথম পান (গড়ে 20 টি সম্পত্তি পাওয়া যায়)

Class      1        2        3        4        5        Avg       %
------------------------------------------------------------------------
GetInterp  0.263    0.268725 0.31373  0.263745 0.279675 0.277775 54.38
InitInterp 0.16316  0.161845 0.18675  0.163535 0.173625 0.169783 33.24
InitLazy   0.46932  0.55299  0.54726  0.47878  0.505635 0.510797 100.00

পরীক্ষা 3 ফলাফল: দ্বিতীয় প্রাপ্তি (গড় 20 টি সম্পত্তি পায়)

Class      1        2        3        4        5        Avg       %
------------------------------------------------------------------------
GetInterp  0.08184  0.129325 0.112035 0.097575 0.098695 0.103894 85.30
InitInterp 0.102755 0.128865 0.111335 0.10137  0.106045 0.110074 90.37
InitLazy   0.19603  0.105715 0.107975 0.10034  0.098935 0.121799 100.00

পর্যবেক্ষণ

GetInterpপ্রত্যাশা অনুযায়ী তাত্ক্ষণিকভাবে দ্রুত হয় কারণ এটি কিছু করছে না। InitLazyযতো তাড়াতাড়ি instantiate হয় InitInterpবোঝা যায় যে অলস বৈশিষ্ট্য স্থাপনে ওভারহেড দ্রুত আমার রৈখিক ক্ষেপক হিসাব চেয়ে। যাইহোক, আমি এখানে কিছুটা বিভ্রান্ত কারণInitInterp 20 টি রৈখিক ইন্টারপোলেশন করা উচিত (এটির টি-প্রোপার্টি সেট আপ করতে) তবে এটি কেবলমাত্র 0.09 এমএস নিচ্ছে ইনস্ট্যান্টিয়েটে (পরীক্ষা 1), তুলনায়GetInterp মাত্র এক লিনিয়ার ইন্টারপোলেশন করতে 0.28 এমএস লাগবে প্রথমবার (পরীক্ষা 2), এবং দ্বিতীয় বার এটি করতে 0.1 এমএস (পরীক্ষা 3)।

প্রথমবার কোনও সম্পত্তি পেতে InitLazyপ্রায় 2 গুণ বেশি সময় লাগেGetInterpInitInterp এটি দ্রুততম, কারণ এটি ইনস্ট্যান্টেশনের সময় এর বৈশিষ্ট্যগুলি জনবসতিযুক্ত করে। (কমপক্ষে এটি করা উচিত ছিল তবে এটি কেন একক রৈখিক দ্রবীণের চেয়ে তাত্ক্ষণিক ফলাফল এত তাড়াতাড়ি হয়েছিল? ঠিক কখন এই ঘূর্ণনগুলি করছে?)

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

উপসংহার

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


26
আপনার আউটপুট পুনরুত্পাদন করার জন্য আপনার টেস্ট কোডটি পোস্ট করা উচিত, কারণ আপনার কোডটি না জেনে কোনও পরামর্শ দেওয়া শক্ত হবে
WiiMaxx

1
আমি বিশ্বাস করি যে মূল বাণিজ্যটি মেমরির ব্যবহার (অলস) এবং সিপিইউ ব্যবহারের (অলস নয়) মধ্যে। কারণ lazyকিছু অতিরিক্ত বুক-কিপিং InitLazyকরতে হবে, অন্যান্য সমাধানগুলির চেয়ে বেশি মেমরি ব্যবহার করবে। এটি প্রতিটি অ্যাক্সেসের ক্ষেত্রেও সামান্য পারফরম্যান্স হিট করতে পারে, এটি ইতিমধ্যে এর কোনও মূল্য আছে কিনা তা যাচাই করে; চতুর কৌশলগুলি ওভারহেডটি সরিয়ে ফেলতে পারে তবে এটির জন্য আইএল এর বিশেষ সমর্থন প্রয়োজন। (হাস্কেল প্রতিটি অলস মানের একটি ফাংশন কল করে এটি করেন; মানটি তৈরি হওয়ার পরে এটি একটি ফাংশন দ্বারা প্রতিস্থাপিত হয় যা প্রতিবার সেই মানটি ফেরত দেয়))
জপফ

14

ম্যাথিউ পোস্ট করা উদাহরণের দিকে কেবল নির্দেশ করতে

public sealed class Singleton
{
    // Because Singleton's constructor is private, we must explicitly
    // give the Lazy<Singleton> a delegate for creating the Singleton.
    private static readonly Lazy<Singleton> instanceHolder =
        new Lazy<Singleton>(() => new Singleton());

    private Singleton()
    {
        ...
    }

    public static Singleton Instance
    {
        get { return instanceHolder.Value; }
    }
}

অলস জন্মের আগে আমরা এটি এইভাবে করতাম:

private static object lockingObject = new object();
public static LazySample InstanceCreation()
{
    if(lazilyInitObject == null)
    {
         lock (lockingObject)
         {
              if(lazilyInitObject == null)
              {
                   lazilyInitObject = new LazySample ();
              }
         }
    }
    return lazilyInitObject ;
}

6
আমি সর্বদা এটির জন্য একটি আইওসি ধারক ব্যবহার করি।
জোভেন

1
আমি এই জন্য একটি আইওসি ধারক বিবেচনা উপর দৃ strongly়ভাবে সম্মত। তবে আপনি যদি একটি সাধারণ অলস সূচনাপ্রাপ্ত বস্তু চান তবে সিঙ্গেলটনও বিবেচনা করুন যে আপনার যদি থ্রেডের প্রয়োজন না হয় তবে এটির সাহায্যে ম্যানুয়ালি এটি করা যদি নিরাপদ হয় কীভাবে অলস নিজেকে পরিচালনা করে তার পারফরম্যান্সের ওভারহেডকে বিবেচনা করা উচিত।
থুলানী চিভান্দিকওয়া

12

এমএসডিএন থেকে:

একটি বৃহত বা রিসোর্স-ইন্সিটিভ অবজেক্ট তৈরি করা বা কোনও রিসোর্স-নিবিড় টাস্কের সম্পাদন স্থগিত করার জন্য অলসতার একটি উদাহরণ ব্যবহার করুন, বিশেষত যখন প্রোগ্রামের জীবদ্দশায় এই ধরনের সৃষ্টি বা সম্পাদনা না ঘটে।

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


-2

অলস লোডিংয়ের আর্কিটেকচারটি বোঝার জন্য আপনার এই উদাহরণটি দেখতে হবে

private readonly Lazy<List<int>> list = new Lazy<List<int>>(() =>
{
    List<int> configList = new List<int>(Thread.CurrentThread.ManagedThreadId);
    return configList;
});
public void Execute()
{
    list.Value.Add(0);
    if (list.IsValueCreated)
    {
        list.Value.Add(1);
        list.Value.Add(2);

        foreach (var item in list.Value)
        {
            Console.WriteLine(item);
        }
    }
    else
    {
        Console.WriteLine("Value not created");
    }
}

-> আউটপুট -> 0 1 2

তবে যদি এই কোডটি "list.Value.Add (0) লিখতে না পারে;"

আউটপুট -> মান তৈরি করা হয়নি

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