সি # রেফারেন্স এবং একটি পয়েন্টারের মধ্যে পার্থক্য কী?


86

আমি সি # রেফারেন্স এবং পয়েন্টারের মধ্যে পার্থক্যটি বেশ বুঝতে পারি না। তারা দুজনেই স্মৃতিতে কোনও জায়গার দিকে ইঙ্গিত করে না? আমি কেবল পার্থক্যটি বুঝতে পারি যে পয়েন্টারগুলি তেমন চালাক নয়, গাদা থাকা কোনও কিছুর দিকে ইঙ্গিত করতে পারে না, আবর্জনা সংগ্রহ থেকে রেহাই পাওয়া যায় না এবং কেবল স্ট্রাক্ট বা বেস ধরণের রেফারেন্স দিতে পারে।

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

আমি ঠিক পাইনি একটি পয়েন্টার সম্পর্কে এত জটিল কি? এটি মূলত স্মৃতিতে কোনও জায়গার রেফারেন্স তাই না? এটি তার অবস্থানটি ফিরে আসতে পারে এবং সরাসরি সেই লোকেশনের সাথে বস্তুর সাথে ইন্টারেক্ট করতে পারে?

আমি কি একটি বিশাল পয়েন্ট মিস করেছি?


4
সংক্ষিপ্ত উত্তর হ্যাঁ, আপনি যুক্তিসঙ্গত তাৎপর্যপূর্ণ কিছু মিস করেছেন, এবং এটি "... লোকদের পয়েন্টারগুলি বোঝার প্রয়োজন" এই ধারণার কারণ। ইঙ্গিত: সি # এখানে কেবল ভাষা নয়।
jdigital

উত্তর:


51

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

সম্পাদনা: ধারণা, হ্যাঁ। এগুলি কমবেশি একই রকম।


অন্য কোনও কমান্ড নেই যা কোনও সি # রেফারেন্সটিকে জিএস দ্বারা রেফারেন্সের পদক্ষেপে নিয়ে যাওয়া থেকে বাধা দেয়?
রিচার্ড

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

হ্যাঁ, একটি GCHandle.Alloc, বা একটি মার্শাল। অ্যালোকএইচ গ্লোবাল (স্থির অতিক্রম)
সিটিএক

এটি সি # তে স্থিত হয়েছে, সি ++ / সিএলআই
এমএমএক্স

মার্শাল.আলোচএইচ্লোবাল কোনওভাবেই ম্যানেজড হিপগুলিতে মেমরি বরাদ্দ করবে না এবং স্বাভাবিকভাবেই এটি আবর্জনা সংগ্রহের বিষয় নয়।
মিমিএক্স

133

একটি পয়েন্টার এবং একটি রেফারেন্সের মধ্যে একটি সামান্য, তবুও অত্যন্ত গুরুত্বপূর্ণ, পার্থক্য রয়েছে। একটি পয়েন্টার স্মৃতিতে একটি স্থানকে নির্দেশ করে যখন রেফারেন্স মেমরির কোনও বস্তুর দিকে নির্দেশ করে। পয়েন্টারগুলি "সুরক্ষিত টাইপ" এই অর্থে নয় যে আপনি যে মেমরিটি দেখিয়েছেন তার সঠিকতার আপনি গ্যারান্টি দিতে পারবেন না।

উদাহরণস্বরূপ নীচের কোডটি ধরুন

int* p1 = GetAPointer();

এটি এই অর্থে সুরক্ষিত যে গেটএপয়েন্টার অবশ্যই ইনট * এর সাথে সামঞ্জস্যপূর্ণ কোনও প্রকার ফেরত পাঠাতে পারে। তবুও এখনও কোনও গ্যারান্টি নেই যে * পি 1 আসলে কোনও ইনটকে নির্দেশ করবে। এটি একটি চর, ডাবল বা এলোমেলো স্মৃতিতে কেবলমাত্র একটি পয়েন্টার হতে পারে।

একটি রেফারেন্স তবে একটি নির্দিষ্ট অবজেক্টের দিকে নির্দেশ করে। অবজেক্টগুলি মেমোরির আশেপাশে সরানো যেতে পারে তবে রেফারেন্সটি অবৈধ করা যাবে না (যদি না আপনি असुरक्षित কোড ব্যবহার করেন)। পয়েন্টারের তুলনায় রেফারেন্সগুলি এই ক্ষেত্রে অনেক বেশি নিরাপদ।

string str = GetAString();

এই ক্ষেত্রে str এর দুটি রাষ্ট্রের মধ্যে একটি রয়েছে 1) এটি কোনও বস্তুর দিকে নির্দেশ করে না এবং তাই নাল বা 2) এটি একটি বৈধ স্ট্রিংকে নির্দেশ করে। এটাই. সিএলআর বিষয়টি নিশ্চিত হওয়ার নিশ্চয়তা দেয়। এটি কোনও পয়েন্টারের জন্য নাও পারে এবং নাও পারে।


13

একটি রেফারেন্স হ'ল "বিমূর্ত" পয়েন্টার: আপনি কোনও রেফারেন্স দিয়ে পাটিগণিত করতে পারবেন না এবং আপনি এর মান সহ কোনও নিম্ন-স্তরের কৌশল খেলতে পারবেন না।


8

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

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


5

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

এছাড়াও, পয়েন্টারগুলি কেবল অনিরাপদ প্রসঙ্গে ব্যবহারযোগ্য।


5

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

এর অর্থ, একটি রেফারেন্স সম্বলিত একটি চলক হ'ল একটি পয়েন্টার-আকারের মেমরির ব্লকের যা কোনও বস্তুর সাথে একটি পয়েন্টার ধারণ করে। তবে, এই ভেরিয়েবলটি একইভাবে ব্যবহার করা যাবে না যেভাবে পয়েন্টার ভেরিয়েবল ব্যবহার করা যায়। সি # (এবং সি, এবং সি ++, ...) এ একটি পয়েন্টারকে অ্যারের মতো সূচিযুক্ত করা যেতে পারে, তবে একটি রেফারেন্স করতে পারে না। সি # তে, কোনও আবর্জনা সংগ্রহকারী দ্বারা একটি রেফারেন্স ট্র্যাক করা হয়, একটি পয়েন্টার হতে পারে না। সি ++ এ, একটি পয়েন্টারকে পুনরায় নিয়োগ দেওয়া যেতে পারে, কোনও রেফারেন্স দিতে পারে না। সিনট্যাক্টিক্যালি এবং সিনটিক্যালি পয়েন্টার এবং রেফারেন্সগুলি একেবারেই আলাদা, তবে যান্ত্রিকভাবে, তারা একই রকম।


অ্যারে জিনিসটি আকর্ষণীয় মনে হচ্ছে, আপনি মূলত যেখানে পয়েন্টারটিকে অ্যারের মতো মেমরির অবস্থানটি অফসেট করতে বলতে পারেন যখন আপনি রেফারেন্স সহ এটি করতে অক্ষম হন? কখন যে দরকারী হবে তা ভাবতে পারছেন না তবে আকর্ষণীয় কম।
রিচার্ড

যদি পি একটি ইন্টি * হয় (কোনও ইনট এর পয়েন্টার), তবে (পি + 1) হল ঠিকানাটি পি + 4 বাইট দ্বারা চিহ্নিত করা হয় (কোনও প্রকারের আকার)। এবং পি [1] * (পি + 1) এর সমান (এটি হ'ল 4 টি বাইট পেজে ঠিকানাটি "অবজ্ঞা") করে। বিপরীতে, অ্যারে রেফারেন্সের সাথে (সি # তে), [] অপারেটর একটি ফাংশন কল করে।
পি ড্যাডি

5

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

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

অন্যদিকে একটি রেফারেন্স হ'ল জিসি সম্পর্কে জানার মতো একটি "পরিচালিত পয়েন্টার"। এটি এখনও কোনও সামগ্রীর ঠিকানা, তবে এখন জিসি লক্ষ্যটির বিশদ জানে, সুতরাং এটি এটিকে চারপাশে স্থানান্তর করতে, সংযোগগুলি করতে পারে, চূড়ান্ত করতে পারে, নিষ্পত্তি করতে পারে এবং পরিচালিত পরিবেশ যা করতে পারে এমন সমস্ত সুন্দর জিনিস of

প্রধান পার্থক্যটি, আপনি কীভাবে এবং কেন তাদের ব্যবহার করবেন তা is পরিচালিত ভাষায় বিস্তৃত ক্ষেত্রে, আপনি কোনও অবজেক্ট রেফারেন্স ব্যবহার করতে যাচ্ছেন। পয়েন্টার ইন্টারপ করার জন্য কার্যকর হয়ে ওঠে এবং সত্যিই দ্রুত কাজের জন্য বিরল প্রয়োজন।

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


একটি ছোটখাটো বাচ্চা যা সম্ভবত আপনার এখানে "পরিচালিত পয়েন্টার" বলা উচিত নয় - এমনকি ভয়ের উদ্ধৃতি সহও - কারণ এটি আইএল-তে কোনও অবজেক্ট রেফারেন্সের থেকে একেবারেই আলাদা। যদিও সি ++ / সিএলআই-তে পরিচালিত পয়েন্টারগুলির জন্য সিনট্যাক্স রয়েছে, তারা সাধারণত সি # থেকে অ্যাক্সেসযোগ্য নয়। আইএলে, তারা (অর্থাত্) ldloca এবং ldarga নির্দেশাবলী সহ প্রাপ্ত হয়।
গ্লেন স্লেডেন

5

একটি পয়েন্টার অ্যাপ্লিকেশনের ঠিকানা স্পেসে যে কোনও বাইটকে নির্দেশ করতে পারে। .NET পরিবেশ দ্বারা একটি রেফারেন্স শক্তভাবে সীমাবদ্ধ এবং নিয়ন্ত্রিত এবং পরিচালনা করা হয়।


1

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


1

পয়েন্টারগুলির ওপরে উল্লেখগুলির সবচেয়ে বড় সুবিধা হ'ল বৃহত্তর সরলতা এবং পঠনযোগ্যতা। সর্বদা হিসাবে যখন আপনি কোনও বিষয় সহজ করেন তবে আপনি স্বাচ্ছন্দ্য এবং নিয়ন্ত্রণের ব্যয়ে স্বল্প-স্তরের জিনিসগুলি পান (যেমন অন্যান্য লোকেরা উল্লেখ করেছেন)।

পয়েন্টারগুলি প্রায়শই 'কুশ্রী' বলে সমালোচিত হয়।

class* myClass = new class();

এখন যতবার আপনি এটি ব্যবহার করেন আপনাকে প্রথমে হয় সেটিকে প্রথমে dereferences করতে হবে

myClass->Method() or (*myClass).Method()

কিছু পাঠযোগ্যতা হারাতে এবং জটিলতা সত্ত্বেও, লোকেরা এখনও পয়েন্টারগুলি প্রায়শই প্যারামিটার হিসাবে ব্যবহার করার প্রয়োজন ছিল যাতে আপনি প্রকৃত বস্তুটি (মান অনুসারে পরিবর্তনের পরিবর্তে) পরিবর্তন করতে পারেন এবং বিশাল বস্তু অনুলিপি না করার কর্মক্ষমতা অর্জনের জন্য।

আমার কাছে এই কারণেই পয়েন্টারগুলির মতো একই সুবিধা প্রদানের জন্য পয়েন্টারগুলির বিন্যাস ছাড়াই প্রথম স্থানে রেফারেন্সগুলি 'জন্মগ্রহণ' হয়েছিল। এখন আপনি আসল বস্তুটি (কেবল এটির মান নয়) পাস করতে পারেন এবং আপনার সাথে অবজেক্টের সাথে ইন্টারঅ্যাক্ট করার আরও একটি সহজ পাঠযোগ্য এবং সাধারণ উপায় রয়েছে।

MyMethod(&type parameter)
{
   parameter.DoThis()
   parameter.DoThat()
}

সি ++ জাভা রেফারেন্সগুলি সি # / জাভা রেফারেন্সের থেকে পৃথক হয়েছে যে একবার আপনি যখন এটির জন্য কোনও মান নির্ধারণ করেন, আপনি এটি পুনরায় বরাদ্দ করতে পারবেন না (এবং এটি ঘোষণার পরে এটি নির্ধারণ করতে হবে)। এটি কনস্ট পয়েন্টার (পয়েন্টার যা অন্য কোনও বস্তুর কাছে পুনরায় নির্দেশ করতে পারে না) ব্যবহার করার মতোই ছিল।

জাভা এবং সি # খুব উচ্চ স্তরের, আধুনিক ভাষাগুলি যা বহু বছর ধরে সি / সি ++ তে জমে থাকা অনেকগুলি আবছা পরিষ্কার করেছিল এবং পয়েন্টারগুলি অবশ্যই পরিষ্কার করার দরকার ছিল of

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

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

# 1: আপনি মান দ্বারা উত্তরণ করছেন না আপনি যখন পয়েন্টার ব্যবহার করেন আপনি জানেন যে পয়েন্টারটি কেবল একটি ঠিকানা রাখে, এটি। পরিবর্তনশীল নিজেই প্রায় খালি এবং এজন্য যুক্তি হিসাবে পাস করা খুব সুন্দর। পারফরম্যান্স লাভের পাশাপাশি আপনি প্রকৃত অবজেক্টের সাথে কাজ করছেন যাতে আপনার যে কোনও পরিবর্তন অস্থায়ী হয় না

# 2: পলিমারফিজম / ইন্টারফেস যখন আপনার একটি রেফারেন্স থাকে যা একটি ইন্টারফেস টাইপ এবং এটি কোনও অবজেক্টের দিকে নির্দেশ করে, আপনি কেবলমাত্র সেই ইন্টারফেসের পদ্ধতিগুলিকে কল করতে পারেন যদিও বস্তুর আরও অনেক ক্ষমতা থাকতে পারে। বস্তুগুলিও একই পদ্ধতিগুলি ভিন্নভাবে প্রয়োগ করতে পারে।

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

আমি মনে করি না যে প্রত্যেকের জন্য পয়েন্টার দিয়ে শুরু করা জরুরী, তবে কী গুরুত্বপূর্ণ তা হল তারা বুঝতে পারে যে কেন মূল্য-প্রকারের পরিবর্তে রেফারেন্সগুলি ব্যবহার করা হয় এবং এটি বোঝার সর্বোত্তম উপায় হল এর পূর্বসূর, পয়েন্টারটি দেখার জন্য।


4
ব্যক্তিগতভাবে, আমি মনে করি সি # একটি উন্নততর ভাষা হত যদি অধিকাংশ জায়গায় ব্যবহার .ব্যবহৃত ->কিন্তু foo.bar(123)স্ট্যাটিক পদ্ধতি একটি কল সঙ্গে সমার্থক ছিল fooClass.bar(ref foo, 123)। যে মত জিনিস অনুমতি দেওয়া হবে myString.Append("George"); [যা সংশোধন হবে পরিবর্তনশীল myString ], এবং মধ্যে অর্থ আরও সুস্পষ্ট পার্থক্য তৈরি myStruct.field = 3;এবং myClassObject->field = 3;
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.