স্থানীয় ভেরিয়েবলগুলির কেন প্রাথমিককরণ প্রয়োজন, তবে ক্ষেত্রগুলি নেই?


140

আমি যদি আমার ক্লাসের মধ্যে একটি বুল তৈরি করি, ঠিক এর মতো কিছু bool checkএটি মিথ্যাতে ডিফল্ট হয়।

আমি যখন আমার পদ্ধতির মধ্যে একই বুলটি তৈরি করি bool check(ক্লাসের পরিবর্তে), তখন আমি একটি ত্রুটি পেয়েছি "স্বাক্ষরিত স্থানীয় ভেরিয়েবল চেক ব্যবহার"। কেন?


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মার্টিজন পিটারস

14
প্রশ্নটি অস্পষ্ট। "স্পেসিফিকেশন তাই বলে" একটি গ্রহণযোগ্য উত্তর হতে হবে?
এরিক লিপার্ট

4
কারণ এটি যখন জাভাতে এটি অনুলিপি করা হয়েছিল তখনই এটি হয়েছিল। : পি
অ্যালভিন থম্পসন

উত্তর:


177

ইউভাল এবং ডেভিডের উত্তরগুলি মূলত সঠিক; সাতরে যাও:

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

ডেভিডের উত্তরের একজন মন্তব্যকারী জিজ্ঞাসা করেছেন যে স্থির বিশ্লেষণের মাধ্যমে কোনও নিরীক্ষিত ক্ষেত্রের ব্যবহার সনাক্ত করা কেন অসম্ভব; এই উত্তরটি আমি এটিকেই প্রসারিত করতে চাই।

প্রথমে, কোনও চলক, স্থানীয় বা অন্যথায়, কোনও ভেরিয়েবল বরাদ্দ করা হয় বা নিযুক্ত করা হয় না তা সঠিকভাবে নির্ধারণ করা অসম্ভব । বিবেচনা:

bool x;
if (M()) x = true;
Console.WriteLine(x);

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

তাই কি কম্পাইলার স্থানীয়দের জন্য এর পরিবর্তে আছে কার্যকরী একটি আলগোরিদিম যা হয় দ্রুত , এবং overestimates যখন একটি স্থানীয় স্পষ্টভাবে নির্ধারিত করা হয় না। এটি হ'ল এর কিছু ভ্রান্ত ইতিবাচকতা রয়েছে, যেখানে এটি আপনি এবং আমি জানি যদিও এটি "আমি প্রমাণ করতে পারি না যে এই স্থানীয় নিয়োগ করা হয়েছে"। উদাহরণ স্বরূপ:

bool x;
if (N() * 0 == 0) x = true;
Console.WriteLine(x);

ধরুন এন () কোনও পূর্ণসংখ্যা ফেরত দেয়। আপনি এবং আমি জানি যে এন () * 0 হবে 0, তবে সংকলক তা জানে না। (দ্রষ্টব্য: সি # 2.0 সংকলক এটি জানত তবে স্পেসিফিকেশনটি বলে না বলে আমি সেই অপটিমাইজেশনটি সরিয়েছি কম্পাইলার যে জানে যে।)

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

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

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

মূলত কোনও ক্ষেত্রের প্রারম্ভকালীন সমগ্র ভার্চুয়াল পদ্ধতি সহ যে কোনও গ্রন্থাগারগুলিতে এখনও ঘোষিত হয়নি যা ঘোষণা করা হবে সহ পুরো প্রোগ্রামের যে কোনও জায়গায় থাকতে পারে :

// Library written by BarCorp
public abstract class Bar
{
    // Derived class is responsible for initializing x.
    protected int x;
    protected abstract void InitializeX(); 
    public void M() 
    { 
       InitializeX();
       Console.WriteLine(x); 
    }
}

এই লাইব্রেরিটি সংকলন করার জন্য এটি একটি ত্রুটি? যদি হ্যাঁ, বারকর্পটি কীভাবে বাগটি ঠিক করার কথা? এক্সকে ডিফল্ট মান নির্ধারণ করে? কিন্তু সংকলকটি ইতিমধ্যে এটি করে।

মনে করুন এই গ্রন্থাগারটি আইনী। যদি FooCorp লিখে

public class Foo : Bar
{
    protected override void InitializeX() { } 
}

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

তাহলে কেন একটি সস্তা বিশ্লেষণ যা পুরো প্রোগ্রামটিকে বিশ্লেষণ করতে হবে না, এবং কেবলমাত্র আরও তীব্রতার চেয়ে বেশি মূল্যায়ন করবে না? ভাল, একটি অ্যালগরিদম প্রস্তাব করুন যা কাজ করে যা সত্যিকারের সংকলন করে এমন একটি সঠিক প্রোগ্রাম লিখতে খুব বেশি কষ্ট দেয় না এবং নকশা দল এটি বিবেচনা করতে পারে। আমি এ জাতীয় কোনও অ্যালগরিদম জানি না।

এখন, মন্তব্যকারী পরামর্শ দেয় "একজন কন্সট্রাক্টর সমস্ত ক্ষেত্র আরম্ভ করার প্রয়োজন"। এটি কোনও খারাপ ধারণা নয়। আসলে, এটি এমন একটি খারাপ-ধারণা নয় যে স্ট্রাক্টগুলির জন্য সি # এর ইতিমধ্যে বৈশিষ্ট্য রয়েছে । একটি কাঠামো নির্মাতাকে কর্টর স্বাভাবিকভাবে ফেরার সময়টির মধ্যে অবশ্যই সমস্ত ক্ষেত্রকে স্পষ্টভাবে বরাদ্দ করা প্রয়োজন; ডিফল্ট কনস্ট্রাক্টর সমস্ত ক্ষেত্রকে তাদের ডিফল্ট মানগুলিতে আরম্ভ করে।

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

জন ক্ষেত্রগুলির সূচনা করার আগে কেবল কোনও ctor এ কল করার পদ্ধতিগুলি নিষিদ্ধ করার পরামর্শ দেয়। সুতরাং, সংক্ষেপে, আমাদের বিকল্পগুলি হ'ল:

  • সাধারণ, নিরাপদ, প্রায়শই ব্যবহৃত প্রোগ্রামিং আইডিয়ামগুলি অবৈধ করুন।
  • একটি ব্যয়বহুল পুরো-প্রোগ্রাম বিশ্লেষণ করুন যা সংকলনটি সম্ভবত সেখানে নেই এমন বাগগুলি সন্ধান করতে কয়েক ঘন্টা সময় নেয়।
  • ডিফল্ট মানগুলিতে স্বয়ংক্রিয় সূচনার উপর নির্ভর করুন।

ডিজাইন দলটি তৃতীয় বিকল্পটি বেছে নিয়েছিল।


1
যথারীতি দুর্দান্ত উত্তর। যদিও আমার একটি প্রশ্ন আছে: কেন স্থানীয় ভেরিয়েবলগুলিতে স্বয়ংক্রিয়ভাবে ডিফল্ট মানগুলি বরাদ্দ করা হয় না? অন্য কথায়, কেন কোনও পদ্ধতির অভ্যন্তরেbool x; সমান হতে পারে না ? bool x = false;
durron597

8
@ durron597: কারণ অভিজ্ঞতা প্রমাণ করেছে যে কোনও স্থানীয়কে কোনও মূল্য নির্ধারণ করতে ভুলে যাওয়া সম্ভবত একটি বাগ a যদি এটি সম্ভবত কোনও বাগ এবং এটি সস্তা এবং সনাক্ত করা সহজ, তবে আচরণটি অবৈধ বা সতর্কবার্তা করার পক্ষে ভাল উত্সাহ রয়েছে।
এরিক লিপার্ট

27

আমি যখন আমার পদ্ধতির মধ্যে একই বুলটি তৈরি করি, তখন বুল চেক (ক্লাসের পরিবর্তে), তখন আমি একটি ত্রুটি পেয়েছি "স্বাক্ষরিত স্থানীয় ভেরিয়েবল চেক ব্যবহার"। কেন?

কারণ সংকলকটি আপনাকে ভুল করতে বাধা দেওয়ার চেষ্টা করছে।

falseমৃত্যুর এই নির্দিষ্ট পথে কোনও পরিবর্তন করার জন্য আপনার পরিবর্তনশীলকে আরম্ভ করা কি কার্যকর হয়? সম্ভবত, বিবেচনা default(bool)করা যাই হোক না কেন মিথ্যা, তবে এটি আপনাকে ঘটছে তা সচেতন হতে বাধ্য করছে। .NET পরিবেশ আপনাকে "আবর্জনা মেমরি" অ্যাক্সেস করতে বাধা দেয়, যেহেতু এটি তাদের ডিফল্টতে কোনও মান শুরু করে। তবে তবুও, কল্পনা করুন যে এটি একটি রেফারেন্স টাইপ ছিল এবং আপনি একটি অ-শূন্য প্রত্যাশার পদ্ধতিতে একটি অবিচ্ছিন্ন (নাল) মানটি পাস করতে এবং রানটাইম সময় একটি এনআরই পেতে পারেন। সংকলকটি কেবল এটি প্রতিরোধ করার চেষ্টা করছে, এটি কখনও কখনও bool b = falseবিবৃতিতে আসতে পারে এই সত্যটি গ্রহণ করে ।

এরিক লিপার্ট একটি ব্লগ পোস্টে এ সম্পর্কে কথা বলেছেন :

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

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


"কল্পনা করুন এটি কোনও রেফারেন্স টাইপ ছিল এবং আপনি এই অবিচ্ছিন্ন অবজেক্টটি এমন কোনও পদ্ধতির কাছে প্রবর্তন করতে পারবেন যে কোনও একটি প্রাথমিকের প্রত্যাশা করে" আপনি কী বোঝাতে চেয়েছিলেন: "ধারণা করুন এটি একটি রেফারেন্স টাইপ ছিল এবং আপনি কোনও রেফারেন্সের পরিবর্তে ডিফল্ট (নাল) দিয়ে যাচ্ছেন অবজেক্ট "?
প্রতিলিপি

@ অনুদানকারক হ্যাঁ একটি পদ্ধতি নন-নাল মান আশা করে। Part অংশটি সম্পাদনা করেছেন। আশা করি এটি এখন আরও পরিষ্কার হয়ে গেছে।
যুবাল ইতজককভ

আমি মনে করি না যে এটি টানা লাইনের কারণে। প্রতিটি শ্রেণীর মনে হয় একটি কনস্ট্রাক্টর থাকতে হবে, কমপক্ষে ডিফল্ট কনস্ট্রাক্টর থাকে। সুতরাং আপনি যখন ডিফল্ট কনস্ট্রাক্টরের সাথে আটকে থাকবেন তখন আপনি ডিফল্ট মান (শান্ত স্বচ্ছ) পাবেন। কোন কনস্ট্রাক্টর সংজ্ঞায়িত করার সময়, আপনি এটির মধ্যে কী করছেন এবং ডিফল্ট মানগুলির জ্ঞান সহ কোন ক্ষেত্রটি শুরু করতে চান তা আপনি প্রত্যাশিত বা অনুমিত হতে পারেন।
পিটার

বিপরীতে: একটি পদ্ধতির মধ্যে একটি ক্ষেত্র নির্বাহের বিভিন্ন পথে ঘোষিত ও নির্ধারিত মান দ্বারা may আপনি ব্যবহার করতে পারেন এমন কোনও ফ্রেমওয়ার্কের ডকুমেন্টেশন বা এমনকি আপনি যে কোডটি বজায় রাখতে পারেন না তার অন্য অংশগুলিতে নজর না দেওয়া পর্যন্ত সহজেই তদারকি করার ব্যতিক্রম থাকতে পারে। এটি কার্যকর করার খুব জটিল পথটি প্রবর্তন করতে পারে। সুতরাং সংকলকগুলি ইঙ্গিত।
পিটার

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

25

স্থানীয় ভেরিয়েবলগুলির কেন প্রাথমিককরণ প্রয়োজন, তবে ক্ষেত্রগুলি নেই?

সংক্ষিপ্ত উত্তরটি হ'ল অবিচ্ছিন্ন স্থানীয় ভেরিয়েবলগুলি অ্যাক্সেসকারী কোডটি স্থির বিশ্লেষণ ব্যবহার করে সংস্থার দ্বারা নির্ভরযোগ্য উপায়ে সনাক্ত করা যায়। যদিও এটি ক্ষেত্রগুলির ক্ষেত্রে নয়। সুতরাং সংকলক প্রথম ক্ষেত্রে প্রয়োগ করে, তবে দ্বিতীয়টি নয়।

স্থানীয় ভেরিয়েবলগুলির কেন প্রাথমিককরণ প্রয়োজন?

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

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

ক্ষেত্রগুলিকে কেন প্রাথমিককরণের প্রয়োজন হয় না?

তাহলে কেন এই বাধ্যতামূলক স্পষ্ট সূচনাটি কোনও শ্রেণীর মধ্যে ক্ষেত্রগুলির সাথে ঘটে না? কেবল কারণ যে স্পষ্ট সূচনাটি নির্মাণের সময় হতে পারে, কোনও সম্পত্তি কোনও আদি সূচনাকারী দ্বারা ডেকে আনা বা এমনকি ঘটনার দীর্ঘকাল পরে ডাকা একটি পদ্ধতি দ্বারা called সংকলক স্থির বিশ্লেষণ ব্যবহার করতে পারবেন না যদি কোডের মাধ্যমে প্রতিটি সম্ভাব্য পথটি আমাদের সামনে ভেরিয়েবলকে সুস্পষ্টভাবে আরম্ভ করা যায় কিনা determine এটির ভুল হওয়াটা বিরক্তিকর হবে, কারণ বিকাশকারীকে বৈধ কোড সহ ছেড়ে যেতে পারে যা সংকলন করে না। সুতরাং সি # এটি একেবারেই প্রয়োগ করে না এবং সিএলআর স্পষ্টভাবে সেট না করা থাকলে স্বয়ংক্রিয়ভাবে ক্ষেত্রগুলিকে একটি ডিফল্ট মান হিসাবে আরম্ভ করতে ছেড়ে যায়।

সংগ্রহের প্রকার সম্পর্কে কী?

স্থানীয় # ভেরিয়েবল ইনিশিয়ালাইজেশন সি # এর প্রয়োগকরণ সীমিত, যা প্রায়শই বিকাশকারীদের ধরে ফেলে। নিম্নলিখিত কোড চারটি লাইন বিবেচনা করুন:

string str;
var len1 = str.Length;
var array = new string[10];
var len2 = array[0].Length;

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


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

@ জনকুগেলম্যান, এর সাধারণ কেস public interface I1 { string str {get;set;} }এবং একটি পদ্ধতি বিবেচনা করুন int f(I1 value) { return value.str.Length; }। যদি এটি কোনও লাইব্রেরিতে বিদ্যমান থাকে তবে সংকলকটি জানতে পারে না যে সেই লাইব্রেরিটির সাথে কী লিঙ্ক করা হবে, এইভাবে উইলটি setআগে বলা হয়েছিল কিনা get, ব্যাকিং ফিল্ডটি স্পষ্টভাবে সূচনা করা যেতে পারে না, তবে এটি এই জাতীয় কোড সংকলন করতে হবে।
ডেভিড আরনো

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

@ জনকুগেলম্যান: আপনার উত্থাপিত বিষয়টি নিয়ে আমি একটি উত্তর পোস্ট করব।
এরিক লিপার্ট

4
এইটা ঠিক না. আমরা এখানে মতবিরোধ থাকার চেষ্টা করছি!
জন কুগেলম্যান

10

উপরের ভাল উত্তর, তবে আমি ভেবেছিলাম যে লোকেরা দীর্ঘ উত্তর পড়তে অলস করার জন্য আমি নিজের মতো করে অনেক সহজ / খাটো উত্তর পোস্ট করব (আমার মতো)।

শ্রেণী

class Foo {
    private string Boo;
    public Foo() { /** bla bla bla **/ }
    public string DoSomething() { return Boo; }
}

প্রপার্টি Booবা থাকতে পারি না কন্সট্রাকটর মধ্যে সক্রিয়া করা হয়েছে। সুতরাং এটি যখন এটি আবিষ্কার return Boo;করে তখন এটি ধরে নেওয়া যায় না যে এটি আরম্ভ করা হয়েছে। এটি কেবল দমন করে ত্রুটিটি করে।

ক্রিয়া

public string Foo() {
   string Boo;
   return Boo; // triggers error
}

{ }অক্ষর কোড একটি ব্লক পরিধি নির্ধারণ করুন। সংকলক স্টাফের উপর { }নজর রেখে এই ব্লকগুলির শাখাগুলি হাঁটাচ্ছে । এটি সহজেই তা বলতে পারেBoo করা হয়নি। ত্রুটিটি তখন ট্রিগার করা হয়।

ত্রুটি কেন বিদ্যমান?

উত্স কোডটি নিরাপদ করতে প্রয়োজনীয় কোডের লাইনের সংখ্যা হ্রাস করতে ত্রুটিটি চালু হয়েছিল। ত্রুটি ছাড়াই উপরেরটি দেখতে এই রকম হবে।

public string Foo() {
   string Boo;
   /* bla bla bla */
   if(Boo == null) {
      return "";
   }
   return Boo;
}

ম্যানুয়াল থেকে:

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

তথ্যসূত্র: https://msdn.microsoft.com/en-us/library/4y7h161d.aspx

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