ডিফলি ভেরিয়েবলগুলি ডিফল্টরূপে কোনও মান দিয়ে শুরু করা হয়?


103

আমি ডেলফিতে নতুন, এবং কী অবজেক্ট ভেরিয়েবল এবং স্ট্যাক ভেরিয়েবলগুলি ডিফল্টরূপে শুরু করা হয়েছিল তা দেখার জন্য আমি কয়েকটি পরীক্ষা চালিয়ে যাচ্ছি:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

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

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


3
দুটি নোট: 1. রেকর্ডগুলি আরম্ভ করা হয় না। ২. রেফারেন্স গণনা করা ভেরিয়েবলগুলি সর্বদা শুরু হয়। ! কিন্ত! কোনও ফাংশন যা একটি স্ট্রিং দেয়, 'ফলাফল' খালি স্ট্রিংটিতে আরম্ভ করা হয় না যেমনটি আপনি আশা করতে পারেন। কারণ 'রেজাল্ট' স্থানীয় ভের নয়। সুতরাং, সর্বদা কর: ফলাফল: = '';
ইন -নেম অফসায়েন্স 27'17


উত্তর:


105

হ্যাঁ, এটি নথিভুক্ত আচরণ:

  • অবজেক্ট ক্ষেত্রগুলি সর্বদা 0, 0.0, '', মিথ্যা, শূন্য বা যা কিছু প্রযোজ্য তাতে শুরু হয়।

  • গ্লোবাল ভেরিয়েবলগুলি সর্বদা 0 ইত্যাদিতে শুরু করা হয়;

  • স্থানীয় রেফারেন্সে গণনা করা * ভেরিয়েবলগুলি সর্বদা শূন্য বা '' এর জন্য আরম্ভ করা হয়;

  • স্থানীয় অ রেফারেন্স-গণনা * ভেরিয়েবলগুলি অবিচ্ছিন্ন করা হয় যাতে আপনি সেগুলি ব্যবহারের আগে আপনাকে কোনও মান নির্ধারণ করতে হয়।

আমার মনে আছে ব্যারি কেলি কোথাও "রেফারেন্স-গণনা" এর জন্য একটি সংজ্ঞা লিখেছিলেন, কিন্তু এটি আর খুঁজে পাচ্ছেন না, এর মধ্যে এটি করা উচিত:

রেফারেন্স-গণনা == যা তারা নিজেরাই রেফারেন্স-গণনা করা হয়, বা প্রত্যক্ষ বা অপ্রত্যক্ষভাবে ক্ষেত্রগুলি (রেকর্ডের জন্য) বা উপাদানগুলি (অ্যারেগুলির জন্য) ধারণ করে যেমন রেফারেন্স-গণনা করা হয়: string, variant, interface বা গতিশীল অ্যারে বা স্ট্যাটিক অ্যারে এই জাতীয় ধরণ রয়েছে।

মন্তব্য:

  • record নিজেই রেফারেন্স-কাউন্ট হয়ে ওঠার পক্ষে যথেষ্ট নয়
  • আমি জেনারিক দিয়ে এখনও চেষ্টা করে দেখিনি

2
গিয়াকোমো নীচের মন্তব্যে যেমন উল্লেখ করেছেন, ডেলফি সহায়তা ফাইলগুলিতে এমএস-সাহায্যে এই সমস্ত ব্যাখ্যা করা হয়েছে: //borland.bds4/bds4ref/html/Variables.htm। ডেলফি ২০০৯-এ আমি "ভেরিয়েবল" এর সাহায্যে অনুসন্ধান করে একই তথ্য পেয়েছি (মজার বিষয় হিসাবে আমি প্রচুর অনুসন্ধানের চেষ্টা করেছি তবে আমি সেটিকে চেষ্টা করে দেখিনি)।
এমবি

8
স্থানীয় ভেরিয়েবলগুলি আরম্ভ হয় ($ 0) যদি তারা কোনও পরিচালিত ধরণের মতো স্ট্রিং, ইন্টারফেস, গতিশীল অ্যারে বা রূপগুলির হয়
ফ্রান্সেস্কা

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

18
@ উইমেনব্রিংক আমি আপনাকে ভুল বলে মনে করি। সূচনাটি এর মধ্যে করা হয় না TObject.Create, এটি একটি শূন্য পদ্ধতি, তবে এর মধ্যে class function TObject.InitInstance(Instance: Pointer): TObject;কোনও কনস্ট্রাক্টর কল করার আগে সর্বদা ডেকে আনা হয়, এমনকি পুরানো ডেলফি সংস্করণগুলির জন্যও। আপনার মন্তব্য আইএমএইচও ভুল এবং বিভ্রান্তিকর।
আরনৌদ বোচেজ

7
ভুলে যাবেন না যে কোনও ফাংশন যা একটি স্ট্রিং দেয়, 'রেজাল্ট' খালি স্ট্রিংটিতে আরম্ভ করা হয় না যেমনটি আপনি আশা করতে পারেন। কারণ 'রেজাল্ট' স্থানীয় ভের নয়।
InNameOfScience

27

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

আপনি বিশ্বব্যাপী ভেরিয়েবলগুলি শূন্য-আরম্ভের উপর নির্ভর করতে পারেন।


21

শ্রেণীর ক্ষেত্রগুলি ডিফল্ট শূন্য। এটি নথিভুক্ত যাতে আপনি এটির উপর নির্ভর করতে পারেন। স্থানীয় স্ট্যাক ভেরিয়েবলগুলি অনির্ধারিত হয় স্ট্রিং বা ইন্টারফেস না থাকলে এগুলি শূন্যে সেট করা থাকে।


ধন্যবাদ। "শূন্য" আমাকে কিছুটা বিভ্রান্ত করছে - এর অর্থ কী স্ট্রিংগুলি '', এবং ইন্টারফেসগুলি শূন্য হয়?
এমবি

4
হ্যাঁ, ঠিক তাই শূন্যস্থান = 0 (এসেম্বলার পর্যায়ে) এবং '' = নীল (ডেলফি কনভেনশন)।
gabr

1
"স্ট্রিং বা ইন্টারফেস না হওয়া পর্যন্ত" বাস্তবতার সম্পূর্ণ বিবরণ নয়। গতিশীল অ্যারেগুলি উদাহরণস্বরূপ, শুরু করা হয়। আরও সাধারণভাবে, নিয়মটি হ'ল স্থানীয়ভাবে হলেও পরিচালিত (রেফারেন্স-গণনা) প্রকারের ভেরিয়েবলগুলি আরম্ভ করা হয়।
Andreas Rejbrand

16

পার্শ্ব নোটের মতো (যেমন আপনি ডেলফিতে নতুন): গ্লোবাল ভেরিয়েবলগুলি ঘোষণা করার সাথে সাথে সরাসরি শুরু করা যেতে পারে:

var myGlobal:integer=99;

2
যেহেতু 10.3 একই স্থানীয় ভেরিয়েবলগুলিতে প্রযোজ্য
এডিজস কোলেস্নিকোভিস

1
এবং যদি স্পষ্টভাবে না করা হয় তবে এগুলি 0, 0.0, মিথ্যা, শূন্য, [], ইত্যাদি থেকে শুরু করা হয়
আন্দ্রেয়াস রেজব্রান্ড

7

সংক্ষেপে অধ্যায় 2 এর রে লিশনার্স ডেলফির একটি উদ্ধৃতি এখানে

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

এটি সত্য যে স্থানীয়-ইন-স্কোপ ভেরিয়েবলগুলি আরম্ভ করা দরকার ... আমি উপরে মন্তব্যটি ব্যবহার করব যে "গ্লোবাল ভেরিয়েবলগুলি আরম্ভ করা হয়" সন্দেহাতীত হিসাবে উল্লেখ করা হয় যতক্ষণ না রেফারেন্স সরবরাহ করা হয় - আমি বিশ্বাস করি না।

সম্পাদনা করুন ... ব্যারি কেলি বলেছেন যে আপনি তাদের শূন্য-প্রাথমিকের উপর নির্ভর করতে পারেন, এবং যেহেতু তিনি ডেলফি সংকলক দলের হয়ে আছেন আমি বিশ্বাস করি যে দাঁড়িয়ে আছে :) ধন্যবাদ ব্যারি।


1
ডেলফি 2006 সালে আপনি এটি এখানে খুঁজে পেতে পারেন: এমএস-সহায়তা: //borland.bds4/bds4ref/html/Variables.htm "আপনি যদি স্পষ্টভাবে কোনও বিশ্বব্যাপী পরিবর্তনশীল সূচনা না করেন তবে সংকলক এটি 0 এ সূচনা করে Ob ক্ষেত্রগুলি) ০. এও শুরু করা হয়েছে
গিয়াকোমো দেগলি এস্পোস্টি

"আমি বিশ্বাস করি না" এর কারণে অবহেলিত। এটি প্রোগ্রামিং, ধর্ম নয়। এবং গিয়াকোমো ঠিক সত্য প্রকাশ করেছেন।
InNameOfS বিজ্ঞান

6

গ্লোবাল ভেরিয়েবল এবং অবজেক্ট ইনস্ট্যান্স ডেটা (ক্ষেত্রগুলি) সর্বদা শূন্য থেকে শুরু করা হয়। পদ্ধতি এবং পদ্ধতিতে স্থানীয় ভেরিয়েবলগুলি উইন 32 ডেলফিতে আরম্ভ করা হয় না; আপনি কোডে তাদের কোনও মূল্য নির্ধারণ না করা পর্যন্ত তাদের বিষয়বস্তু অপরিজ্ঞাত।


5

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


4
অবশ্যই আপনি করতে পারেন. এবং আপনার উচিত। প্রতিটি কনস্ট্রাক্টরে 0 / '' / মিথ্যা / শূন্যে সবকিছু শুরু করা কেবল অপ্রয়োজনীয়। অন্যদিকে গ্লোবাল ভেরিয়েবলগুলি সূচনা করা এত মূর্খ নয় - আমি একবারে তাদের আরম্ভ করা হয় কিনা তা মনে করতে পারি না (কারণ আমি সেগুলি খুব বেশি ব্যবহার করছি না)।
gabr

2
যদি ডেল্ফি আপনাকে ঘোষনা করার সাথে সাথে একই পরিবর্তে কোনও পরিবর্তনশীল সূচনা করতে দেয় (যেমন var fObject: TObject = nil) আমি মানতে চাই যে মানটির সাথে আরম্ভ করা সম্ভবত একটি ভাল ধারণা। তবে আমার কাছে প্রতিটি অবজেক্ট ফিল্ডের জন্য কনস্ট্রাক্টরে এটি করা কিছুটা মনে হচ্ছে।
এমবি

4

ডেলফি 2007 সহায়তা ফাইল থেকে:

MS-সহায়তা: //borland.bds5/devcommon/variables_xml.html

"আপনি যদি বিশ্বব্যাপী সুস্পষ্টভাবে স্পষ্টভাবে আরম্ভ না করেন, সংকলক এটি 0 এ সূচনা করে" "


3

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


1
শূন্য সর্বদা একটি আইনী মান, এটি এনামের 1 ম মান। আপনি এটি অর্ডের সাথে দেখতে পাচ্ছেন (মাইফার্সটাইমভ্যালু)।
ফ্রান্সেসকা

এটি গণনা করা টাইপের প্রথম মানটি ফেরত দেবে।
স্কামরাডেট

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

2
@ ফ্রানসোইস: আপনি যদি আপনার TOneTwoThree = (One=1, Two=2, Three=3);
এনামকে এভাবেই

0

নতুনভাবে প্রবর্তিত (যেহেতু ডেল্ফি 10.3) ইনলাইন ভেরিয়েবল প্রাথমিক মানগুলির নিয়ন্ত্রণকে আরও সহজ করে তুলছে।

procedure TestInlineVariable;
begin
  var index: Integer := 345;
  ShowMessage(index.ToString);
end;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.