স্ট্রাইকস উত্তরাধিকারকে সমর্থন করে না কেন?


128

আমি জানি যে .NET এ স্ট্রাইকগুলি উত্তরাধিকারকে সমর্থন করে না, তবে তারা কেন এইভাবে সীমাবদ্ধ তা ঠিক পরিষ্কার নয় ।

কোন প্রযুক্তিগত কারণে স্ট্র্টকে অন্য স্ট্রাক্ট থেকে উত্তরাধিকার সূত্রে বাধা দেয়?


6
আমি এই কার্যকারিতার জন্য মরে যাচ্ছি না, তবে কাঠামোগত উত্তরাধিকার কার্যকর হবে এমন কয়েকটি ক্ষেত্রে আমি ভাবতে পারি: আপনি পয়েন্ট 2 ডি স্ট্রাক্টকে উত্তরাধিকার সহ একটি পয়েন্ট 3 ডি স্ট্রাক্ট পর্যন্ত প্রসারিত করতে চাইতে পারেন, আপনি মান 323 থেকে উত্তরণ করতে চাইলে এটি 32 থেকে উত্তরাধিকার সূত্রে পেতে পারেন 1 এবং 100 এর মধ্যে, আপনি একটি টাইপ-Def যা একাধিক ফাইল জুড়ে দৃশ্যমান তৈরি করতে চাইতে পারেন, ইত্যাদি (ব্যবহার typeA = typeB কৌতুক শুধুমাত্র ফাইল সুযোগ আছে)
জুলিয়েট

4
আপনি স্ট্যাকওভারফ্লো.com / প্রশ্নগুলি ১০০৮২৩১১ / ১১ পড়তে চাইতে পারেন , যা স্ট্রাক্ট সম্পর্কে আরও কিছুটা ব্যাখ্যা করে এবং সেগুলি কেন একটি নির্দিষ্ট আকারে সীমাবদ্ধ করা উচিত। যদি আপনি স্ট্রাক্টে উত্তরাধিকার ব্যবহার করতে চান তবে আপনার সম্ভবত কোনও বর্গ ব্যবহার করা উচিত।
জাস্টিন 15

1
আর তুমি পড়তে চাইবেন stackoverflow.com/questions/1222935/... যেমন গভীরতা কেন এটা শুধু dotNet প্ল্যাটফর্মে কাজ করা যেতে পারে যায়। তারা শীতকালে এটি একই সমস্যার সাথে সি ++ করে তুলেছে যা পরিচালিত প্ল্যাটফর্মের জন্য বিপর্যয়কর হতে পারে।
ডাইকাম

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

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

উত্তর:


121

মূল্যের ধরণগুলি উত্তরাধিকারকে সমর্থন করতে পারে না তার কারণ অ্যারে of

সমস্যাটি হ'ল পারফরম্যান্স এবং জিসি কারণে, মান ধরণের অ্যারেগুলি "ইনলাইন" সংরক্ষণ করা হয়। উদাহরণস্বরূপ, প্রদত্ত new FooType[10] {...}, যদি FooTypeকোনও রেফারেন্স টাইপ হয় তবে পরিচালিত হিপগুলিতে 11 টি অবজেক্ট তৈরি করা হবে (অ্যারের জন্য একটি, এবং প্রতিটি টাইপের উদাহরণের জন্য 10)। FooTypeপরিবর্তে যদি মান ধরণের হয় তবে পরিচালিত হিপগুলিতে কেবল একটি উদাহরণ তৈরি করা হবে - অ্যারে নিজেই (যেমন প্রতিটি অ্যারের মান অ্যারের সাথে "ইনলাইন" সংরক্ষণ করা হবে)।

এখন, ধরুন আমাদের মান ধরণের সাথে উত্তরাধিকার ছিল। উপরের "ইনলাইন স্টোরেজ" অ্যারের আচরণের সাথে একত্রিত হলে, খারাপ জিনিসগুলি ঘটে, যেমনটি সি ++ তে দেখা যায় ।

এই সিডো-সি # কোডটি বিবেচনা করুন:

struct Base
{
    public int A;
}

struct Derived : Base
{
    public int B;
}

void Square(Base[] values)
{
  for (int i = 0; i < values.Length; ++i)
      values [i].A *= 2;
}

Derived[] v = new Derived[2];
Square (v);

সাধারণ রূপান্তর নিয়ম অনুসারে, Derived[]এটিকে একটি Base[](আরও ভাল বা খারাপের জন্য) রূপান্তরযোগ্য , সুতরাং আপনি যদি উপরের উদাহরণের জন্য s / স্ট্রাক্ট / শ্রেণি / জি হন তবে এটি কোনও সমস্যা ছাড়াই সংকলন এবং প্রত্যাশার মতো চলবে। তবে Baseএবং Derivedযদি মান ধরণের হয় এবং অ্যারে স্টোরের মানগুলিকে ইনলাইন করে থাকে তবে আমাদের সমস্যা আছে।

আমাদের একটি সমস্যা আছে কারণ এটি Square()সম্পর্কে কিছুই জানে না Derived, এটি অ্যারের প্রতিটি উপাদান অ্যাক্সেসের জন্য কেবলমাত্র পয়েন্টার গাণিতিক ব্যবহার করবে, ধ্রুবক পরিমাণে ( sizeof(A)) বাড়িয়ে দেবে । সমাবেশটি অস্পষ্টভাবে হবে:

for (int i = 0; i < values.Length; ++i)
{
    A* value = (A*) (((char*) values) + i * sizeof(A));
    value->A *= 2;
}

(হ্যাঁ, এটি ঘৃণ্য সমাবেশ, তবে মূল বিষয়টি হ'ল আমরা কোনও সংগ্রহিত টাইম ব্যবহার করা হচ্ছে তার কোনও জ্ঞান ছাড়াই, পরিচিত সংকলন-সময় ধ্রুবকগুলিতে অ্যারের মাধ্যমে বৃদ্ধি করব))

সুতরাং, যদি এটি প্রকৃতপক্ষে ঘটে থাকে তবে আমাদের মেমরির দুর্নীতির সমস্যা হবে। বিশেষ করে, মধ্যে Square(), values[1].A*=2হবে আসলে পরিবর্তন হতে values[0].B!

ডিবাগ করার চেষ্টা করুন যে !


11
এই সমস্যার বোধগম্য সমাধান হ'ল কাস্ট ফর্ম বেস [] থেকে ডিভেটিড [] কে বাতিল করা। যেমন সংক্ষিপ্ত [] থেকে অন্তর্ [] অবধি কাস্টিং নিষিদ্ধ, যদিও সংক্ষিপ্ত থেকে ইনট পর্যন্ত কাস্টিং সম্ভব is
নিকি

3
+ উত্তর: উত্তরাধিকার সংক্রান্ত সমস্যাটি আমার সাথে ক্লিক করা হয়নি যতক্ষণ না আপনি এটিকে শর্তাবলীর শর্তে রাখেন। অন্য একজন ব্যবহারকারী বলেছেন যে এই সমস্যাটি "আকার কাটা" স্ট্রাক্ট দ্বারা উপযুক্ত আকারে হ্রাস করা যেতে পারে, তবে আমি কাটা কাটা সমাধানের চেয়ে বেশি সমস্যার কারণ হিসাবে দেখছি।
জুলিয়েট

4
হ্যাঁ, তবে এটি "অর্থবোধ করে" কারণ অ্যারে রূপান্তরগুলি অন্তর্নিহিত রূপান্তরগুলির জন্য, সুস্পষ্ট রূপান্তরগুলির জন্য নয়। সংক্ষিপ্ত থেকে আন্ত সম্ভব, তবে একটি কাস্টের প্রয়োজন, সুতরাং এটি বোধগম্য যে সংক্ষিপ্ত [] ইন্টে রূপান্তর করা যায় না [] (রূপান্তর কোডের সংক্ষিপ্তসার, 'এ। সিলেক্ট (এক্স => (ইনট) এক্স))। টোআর্রে ( ) ')। যদি রানটাইম বেইস থেকে ডেরিভেডে castালাকে অনুমতি না দেয় তবে এটি "ওয়ার্ট" হবে, কারণ আইএস রেফারেন্স ধরণের জন্য অনুমোদিত। সুতরাং আমাদের দুটি পৃথক "ওয়ার্ট" সম্ভাব্য রয়েছে - কাঠামোগত উত্তরাধিকার নিষিদ্ধ করুন বা অ্যারে-অফ-ব্যয়ে অ্যারে-অফ-বেসে রূপান্তর করতে নিষেধ করুন।
জোনপ

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

2
'ডবল' থেকে 'বর্গ' থেকে ফাংশনের নাম পরিবর্তন করার প্রয়োজন
জন

69

স্ট্রাক্ট সমর্থিত উত্তরাধিকারের কল্পনা করুন। তারপরে ঘোষণা:

BaseStruct a;
InheritedStruct b; //inherits from BaseStruct, added fields, etc.

a = b; //?? expand size during assignment?

স্ট্রাক্ট ভেরিয়েবলের স্থির আকারের অর্থ হবে না এবং তাই আমাদের রেফারেন্সের ধরণ রয়েছে।

আরও ভাল, এটি বিবেচনা করুন:

BaseStruct[] baseArray = new BaseStruct[1000];

baseArray[500] = new InheritedStruct(); //?? morph/resize the array?

5
সি ++ 'স্লাইসিং' ধারণাটি প্রবর্তন করে এর উত্তর দিয়েছিল, সুতরাং এটি একটি সমাধানযোগ্য সমস্যা। সুতরাং, কাঠামোগত উত্তরাধিকারকে কেন সমর্থন করা উচিত নয়?

1
উত্তরাধিকারসূত্রে স্ট্রাইকগুলির অ্যারেগুলি বিবেচনা করুন এবং মনে রাখবেন যে সি # একটি (মেমরি) পরিচালিত ভাষা। স্লাইসিং বা অন্য কোনও অনুরূপ বিকল্প সিএলআর এর মূলসূত্রগুলিকে ধ্বংস করে দেবে।
কেনান ই কে

4
@ জোনপ: সমাধানযোগ্য, হ্যাঁ। ডিযায়রেবেল? এখানে একটি চিন্তার পরীক্ষা রয়েছে: কল্পনা করুন যে আপনার কাছে বেস ক্লাস ভেক্টর 2 ডি (এক্স, ওয়াই) এবং উত্সভুক্ত শ্রেণি ভেক্টর 3 ডি (এক্স, ওয়াই, জেড) রয়েছে কিনা তা কল্পনা করুন। উভয় শ্রেণীর একটি চৌম্বক সম্পত্তি রয়েছে যা যথাক্রমে স্কয়ার্ট (x ^ 2 + y ^ 2) এবং স্ক্রার্ট (x ^ 2 + y ^ 2 + z ^ 2) গণনা করে। আপনি যদি 'ভেক্টর 3 ডি লিখেন তবে a = ভেক্টর 3 ডি (5, 10, 15); ভেক্টর 2 ডি বি = এ; ',' এ। তারপরে যদি আমরা 'a = (ভেক্টর 3 ডি) বি' লিখি, তবে অ্যাসাইনমেন্টের পূর্বে a.Magnitude এর কি একই মান থাকবে? .NET ডিজাইনাররা সম্ভবত নিজেদের বলেছিল, "না, আমাদের কোনও কিছুই থাকবে না"।
জুলিয়েট

1
কেবল কোনও সমস্যার সমাধান হতে পারে, এর অর্থ এটি সমাধান করা উচিত নয়। কখনও কখনও সমস্যা দেখা দেয় এমন পরিস্থিতি এড়ানো সবচেয়ে ভাল।
ড্যান ডিপ্লো

@ কেক 444: স্ট্রাক্ট Fooউত্তরাধিকারী হওয়ার কারণে একটিকে Barএকটি Fooবরাদ্দ দেওয়া উচিত নয় Bar, তবে কাঠামোটি সেভাবে ঘোষণা করা কয়েক কার্যকর উপকারের অনুমতি দিতে পারে : (1) Barপ্রথম আইটেম হিসাবে বিশেষভাবে নামযুক্ত সদস্য তৈরি করুন Fooএবং Fooএতে অন্তর্ভুক্ত থাকতে হবে সদস্যদের নাম যা সেই সদস্যদের মধ্যে উপন্যাস , সমস্ত রেফারেন্সের সাথে প্রতিস্থাপন না করে , এবং পরিবর্তে একটি গ্রুপ হিসাবে সমস্ত ক্ষেত্র পড়তে এবং লেখার দক্ষতা বজায় রেখে Barকোডটি পরিবর্তে ব্যবহার Barকরার জন্য অভিযোজিত কোডকে অনুমতি দেয় ; ...Foothing.BarMemberthing.theBar.BarMemberBar
সুপারক্যাট

14

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


8
উত্তরাধিকারের সুযোগ নিতে
পলিমারফিজম

সুতরাং, আপনি নেট থেকে বিভিন্ন ধরণের উত্তরাধিকার পেতে চান?
জন স্যান্ডার্স

পলিমারফিজম স্ট্রাইকগুলিতে বিদ্যমান, কেবলমাত্র যখন আপনি এটি একটি কাস্টম স্ট্রাক্টে প্রয়োগ করেন বা যখন টস্ট্রিং () এর একটি কাস্টম বাস্তবায়নের অস্তিত্ব থাকে না তখন ToString () কল করার মধ্যে পার্থক্যটি বিবেচনা করুন।
কেনান ই কে

এর কারণ তারা সকলেই System.Object থেকে প্রাপ্ত। এটি সিস্টেমের পলিমারফিজম বেশি। স্ট্রাক্টের চেয়ে অবজেক্টের ধরণ।
জন স্যান্ডার্স

জেনেরিক ধরণের পরামিতি হিসাবে ব্যবহৃত কাঠামোর সাথে পলিমারফিজম অর্থবহ হতে পারে। পলিমারফিজম ইন্টারফেস প্রয়োগ করে এমন স্ট্রাক্টগুলির সাথে কাজ করে; ইন্টারফেসগুলির সাথে সবচেয়ে বড় সমস্যা হ'ল তারা কাঠামোগত ক্ষেত্রগুলিতে বাইফেরগুলি প্রকাশ করতে পারে না। অন্যথায়, আমি মনে করি সবচেয়ে বড় জিনিসটি "উত্তরাধিকার সূত্রে প্রাপ্ত" স্ট্রাক্টগুলিতে কোনও ধরণের (কাঠামো বা শ্রেণি) থাকার একটি উপায় হতে পারে Fooযা কাঠামোর ধরণের Barক্ষেত্রের Barসদস্যদের নিজস্ব হিসাবে বিবেচনা করতে সক্ষম হবে , যাতে একটি Point3dক্লাস যেমন একটি encapsulate Point2d xyকরতে পারে তবে Xক্ষেত্রটির হয় হয় xy.Xবা হিসাবে উল্লেখ করুন X
সুপারক্যাট

8

ডক্স যা বলে তা এখানে :

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

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

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


4
উত্তরাধিকার না হওয়ার কারণ এটি নয়।
ডাইকাম

আমি বিশ্বাস করি যে উত্তরাধিকারের বিষয়ে এখানে কথা বলা হচ্ছে সেগুলি দুটি স্ট্রাক ব্যবহার করতে সক্ষম হচ্ছে না যেখানে একজন অন্যের কাছ থেকে বিনিময়যোগ্যভাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, তবে পুনরায় ব্যবহার করে এবং একটি কাঠামোকে অন্য কাঠামোর প্রয়োগে যুক্ত করে (যেমন একটি Point3Dথেকে একটি তৈরি করা Point2D; আপনি সক্ষম হবেন না) এর Point3Dপরিবর্তে একটি ব্যবহার করতে Point2D, তবে আপনাকে Point3Dপুরোপুরি স্ক্র্যাচ থেকে পুনরায় সংশোধন করতে হবে না )) আমি যেভাবেই এটির ব্যাখ্যা করব ...
Blixt

সংক্ষেপে: এটি পলিমারফিজম ছাড়াই উত্তরাধিকারকে সমর্থন করতে পারে । এটা হয় না। আমি বিশ্বাস করি একটি নকশা পছন্দ একজন ব্যক্তির পছন্দ করার সাহায্যকারী নেই classওভার structউপযুক্ত ক্ষেত্রে।
Blixt

3

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

struct A {
    int property;
} // sizeof A == sizeof int

struct B : A {
    int childproperty;
} // sizeof B == sizeof int * 2

যদি এটি সম্ভব হয় তবে এটি নিম্নলিখিত স্নিপেটে ক্রাশ হবে:

void DoSomething(A arg){};

...

B b;
DoSomething(b);

স্থান খ এর আকারের জন্য বরাদ্দ করা হয়, বি আকারের জন্য নয় B.


2
সি ++ এই মামলাটি হ'ল ঠিক আছে, আইআইআরসি। বি এর উদাহরণটি এ এর ​​আকারে ফিট করার জন্য কেটে ফেলা হয় যদি এটি একটি খাঁটি ডেটা টাইপ, যেমন নেট নেট স্ট্রাক্ট হয় তবে খারাপ কিছু ঘটবে না। আপনি যে পদ্ধতিটি A এ ফেরৎ নিয়ে কিছুটা সমস্যা নিয়ে চলেছেন এবং আপনি বিটিতে সেই রিটার্ন মানটি সংরক্ষণ করছেন, কিন্তু এটির অনুমতি দেওয়া উচিত নয়। সংক্ষেপে ,। নেট ডিজাইনাররা চাইলে এটি মোকাবেলা করতে পারে, তবে তারা কোনও কারণে তা করেনি।
rmeadora

1
আপনার ডসোমথিংয়ের () জন্য, কোনও সমস্যা হওয়ার সম্ভাবনা নেই কারণ (সি ++ শব্দার্থবিজ্ঞান অনুমান করে) 'বি' একটি উদাহরণ তৈরি করতে "কাটা" হবে। <i> অ্যারে </ i> এর সমস্যাটি। আপনার বিদ্যমান A এবং B স্ট্রাইক এবং একটি <c> ডোজোমিংথিং (এ [] আরগ) g আরগ [1]। প্রপার্টি = 1;} </c> পদ্ধতি বিবেচনা করুন। যেহেতু মান ধরণের অ্যারেগুলি "ইনলাইন" মানগুলি সংরক্ষণ করে, তাই ডসোমিংথিং (প্রকৃত = নতুন বি [2]}}) প্রকৃত [0]। শিশুদের সেট সেট করতে পারে, প্রকৃত নয় [1]। ব্যক্তিগত। এইটা খারাপ.
জোনপ

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

এটি লক্ষ করা উচিত যে "উত্পন্ন ধরণের অ্যারে" সমস্যাটি সি ++ তে নতুন নয়; দেখতে parashift.com/c++-faq-lite/proper-inheritance.html#faq-21.4 (C ++ অ্যারেগুলির মন্দ হয় ;-)!
jonp

@ জন: "উত্পন্ন ধরণের অ্যারে এবং বেস ধরণের মিশ্রণ না পাওয়া" সমস্যার সমাধানটি যথারীতি হ'ল ডোন দো ডট। যে কারণে সি ++ এ অ্যারেগুলি মন্দ (আরও সহজেই মেমরির দুর্নীতির অনুমতি দেয়), এবং কেন। নেট মূল্যমানের সাথে উত্তরাধিকারকে সমর্থন করে না (সংকলক এবং জেআইটি এটি ঘটতে পারে না তা নিশ্চিত করে)।
জোনপ করুন

3

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

এই বলে, সিসিলের একটি নাম এটি সঠিকভাবে পেরেক করেছে।

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


3

স্ট্যাকের উপর স্ট্রোকগুলি বরাদ্দ করা হয়। এর অর্থ মান শব্দার্থকগুলি বেশ নিখরচায় এবং স্ট্রাক্ট সদস্যদের অ্যাক্সেস করা খুব সস্তা। এটি পলিমারফিজম প্রতিরোধ করে না।

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

ক্ষেত্র যুক্ত সম্পর্কে কি?

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

struct A
{
    public int Integer1;
}

struct B : A
{
    public int Integer2;
}

A a = new B();

এটি স্ট্যাকের কিছু অজানা অংশ ওভাররাইট করবে।

বিকল্পটি হ'ল রানটাইমটির জন্য এটি রোধ করার জন্য কেবলমাত্র কোনও এ ভেরিয়েবলের মাপের (এ) বাইট লিখে prevent

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

কাঠামোগত উত্তরাধিকার রাখা এটি পুরোপুরি নিরাপদ, যতক্ষণ আপনি বহুত্বপূর্ণভাবে স্ট্রাইক ব্যবহার করবেন না, বা উত্তরাধিকার সূত্রে আপনি ক্ষেত্রগুলি যুক্ত করবেন না ততক্ষণ। তবে এগুলি ভয়াবহভাবে কার্যকর নয়।


1
প্রায়। আর কেউই স্ট্যাকের রেফারেন্সে স্লাইসিং সমস্যার কথা উল্লেখ করেনি, কেবল অ্যারের ক্ষেত্রে রেফারেন্সে। এবং অন্য কেউ উপলভ্য সমাধানগুলি উল্লেখ করেনি।
ব্যবহারকারীর 38001

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

@ ব্যবহারকারী 38001 "স্ট্যাকগুলিতে স্ট্রাক্টগুলি বরাদ্দ করা হয়" - যদি না তারা ক্ষেত্রটি না হয় তবে যে ক্ষেত্রে এগুলি গাদাতে বরাদ্দ করা হয়।
ডেভিড ক্লেম্পফনার

2

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


সংকলক জানে কী আছে। রেফারেন্সিং সি ++ এটি উত্তর হতে পারে না।
হেন্ক হোল্টারম্যান

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

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

স্ট্রাক্টগুলি মান ধরণের কারণ, কোনও অবজেক্ট শিরোনামের সাথে এটি প্রয়োজনীয় নয় কারণ রান-টাইম সর্বদা অন্যান্য মান ধরণের (একটি সীমাবদ্ধতা) হিসাবে সামগ্রীটি অনুলিপি করে। এটি একটি শিরোলেখ দিয়ে বোঝা যাবে না, কারণ রেফারেন্স-ধরণের ক্লাসগুলির জন্য এটিই: পি
সিসিলের একটি নাম রয়েছে


0

আইএল একটি স্ট্যাক-ভিত্তিক ভাষা, সুতরাং যুক্তি সহ একটি পদ্ধতি কল করা এরকম কিছু হয়:

  1. স্ট্যাকের উপর যুক্তিটি পুশ করুন
  2. পদ্ধতিটি কল করুন।

পদ্ধতিটি চললে, এটি যুক্তি পেতে স্ট্যাকের বাইরে কিছু বাইট পপ করে। এটা ঠিক জানে কতটা বাইট পপ অফ করতে কারণ আর্গুমেন্টটি একটি রেফারেন্স টাইপ পয়েন্টার (সর্বদা 4-বাইটে 32-বিট) বা এটি একটি মান ধরণের যার জন্য আকার সর্বদা সঠিকভাবে পরিচিত is

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

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


1
সি ++ সমাধান করেছে যে, বাস্তব সমস্যার জন্য এই উত্তরটি পড়ুন: stackoverflow.com/questions/1222935/...
Dykam
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.