ক্লাস বনাম স্ট্রাক্টস


95

আমি কোডে 100,000 অবজেক্ট তৈরি করতে চলেছি। তারা 2 বা 3 টি বৈশিষ্ট্যযুক্ত, এগুলি ছোট। আমি এগুলিকে জেনেরিক তালিকায় রাখব এবং যখন তারা আসবে আমি তাদের লুপ করব এবং মানটি পরীক্ষা করব aএবং সম্ভবত মানটি আপডেট করব b

শ্রেণি বা কাঠামো হিসাবে এই বিষয়গুলি তৈরি করা কি আরও দ্রুত / উন্নত?

সম্পাদনা

ক। বৈশিষ্ট্যগুলি মান ধরণের (আমার মনে হয় এমন স্ট্রিং ব্যতীত)?

খ। তারা (আমরা এখনও নিশ্চিত না) একটি বৈধ পদ্ধতি থাকতে পারে

সম্পাদনা 2

আমি ভাবছিলাম: গাদা এবং স্ট্যাকের উপরের জিনিসগুলি কি ময়লা ফেলার সংগ্রহকারী দ্বারা সমানভাবে প্রক্রিয়াজাত করা হয়, বা এটি কী অন্যরকম কাজ করে?


4
তাদের কি কেবল সর্বজনীন ক্ষেত্র রয়েছে, নাকি তাদেরও পদ্ধতি আছে? সংখ্যার মতো প্রারম্ভিক ধরণগুলি কি? এগুলি কি কোনও অ্যারেতে থাকবে, বা তালিকায় <T> এর মতো কিছুতে থাকবে?
জেফফারগসন

14
পরিবর্তনীয় স্ট্রাক্টের একটি তালিকা? বেগের জন্য নজর রাখুন।
অ্যান্টনি পেগ্রাম

4
@ অ্যান্টনি: আমি ভীত করছি আমি বেগের রসিকতাটি মিস করছি: -স
মিশেল

5
ভেলোসিরাপটার রসিকতা এক্স কেসিডি থেকে। তবে যখন আপনি 'মান ধরণের স্ট্যাকের উপর বরাদ্দ করা হয়' ভ্রান্ত ধারণা / প্রয়োগের বিশদটি (প্রযোজ্য হিসাবে মুছুন) এর চারপাশে ছুঁড়ে ফেলছেন তখন এটি এরিক লিপার্টের জন্য আপনাকে নজর দেওয়া দরকার ...
গ্রেগ বিচ

উত্তর:


138

শ্রেণি বা কাঠামো হিসাবে এই বিষয়গুলি তৈরি করা কি দ্রুত ?

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

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

এটা কি ভাল শ্রেণী হিসেবে বা struct হিসাবে এই বস্তু তৈরি করবেন?

ক্লাস হতে পারে, স্ট্রাক্ট হতে পারে। থাম্বের নিয়ম হিসাবে: যদি বস্তুটি হয়:
১ ছোট
2. যৌক্তিকভাবে একটি পরিবর্তনযোগ্য মান
৩. সেগুলির অনেকগুলি রয়েছে তবে
আমি এটিকে একটি কাঠামো তৈরির বিষয়ে বিবেচনা করব। নইলে আমি একটি রেফারেন্স টাইপের সাথে লেগে থাকতাম।

আপনার যদি কোনও কাঠামোর কিছু ক্ষেত্র পরিবর্তন করতে হয় তবে সাধারণত একটি কনস্ট্রাক্টর তৈরি করা ভাল যা ক্ষেত্রটি সঠিকভাবে সেট করে পুরো নতুন স্ট্রাক্টটি ফেরত দেয়। এটি সম্ভবত কিছুটা ধীর (এটি পরিমাপ করুন!) তবে যুক্তিযুক্তভাবে যুক্তিযুক্ত হওয়া অনেক সহজ।

গাদা এবং স্ট্যাকের জিনিসগুলি কী আবর্জনা সংগ্রহকারী দ্বারা সমানভাবে প্রক্রিয়াজাত করা হয়?

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

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

ঠিক আছ?


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

@Jon: C # এর কম্পাইলার সেরা অনুকূল রূপ const ডেটা কিন্তু কেবলমাত্র ডেটা। আমি জানি না যে জিট সংকলকটি কেবল পাঠযোগ্য ক্ষেত্রগুলিতে কোনও ক্যাচিং অপ্টিমাইজেশন সম্পাদন করে।
এরিক লিপার্ট

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

আমি ডাইভ শুরু করার জন্য সরল- টাল্ক ডট নেট / নেটফ্রেম ওয়ার্ক / ......... এবং আপনার নিজস্ব নিবন্ধ (@ এরিক) পড়ার পরামর্শ দিচ্ছি : বিশদ মধ্যে। আশেপাশে আরও অনেক ভাল নিবন্ধ রয়েছে। বিটিডাব্লু, ১০০,০০০ ছোট ইন-মেমরি আইটেমগুলি প্রক্রিয়াকরণের পার্থক্যটি ক্লাসের জন্য কিছু মেমরি ওভারহেড (~ 2.3 মেগাবাইট) এর মাধ্যমে খুব কমই লক্ষণীয়। এটি সহজ পরীক্ষার মাধ্যমে সহজেই চেক করা যায়।
নিক মার্টিশেচেনকো

23

কখনও কখনও আপনার সাথে structনতুন () কনস্ট্রাক্টরকে কল করার প্রয়োজন হয় না এবং সরাসরি স্বাভাবিকভাবে ক্ষেত্রগুলি এটিকে আরও দ্রুততর করে দেয়।

উদাহরণ:

Value[] list = new Value[N];
for (int i = 0; i < N; i++)
{
    list[i].id = i;
    list[i].isValid = true;
}

তুলনায় প্রায় 2 থেকে 3 গুণ দ্রুত faster

Value[] list = new Value[N];
for (int i = 0; i < N; i++)
{
    list[i] = new Value(i, true);
}

যেখানে দুটি ক্ষেত্র ( এবং ) রয়েছে ValueastructidisValid

struct Value
{
    int id;
    bool isValid;

    public Value(int i, bool isValid)
    {
        this.i = i;
        this.isValid = isValid;
    }
}

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


স্পষ্টতই যখন আপনি দেশীয় সীমানাগুলির উপর মার্শাল মূল্যবোধ করেন তখন জিনিসগুলি অনেক বেশি দ্রুত হয়।
লেপি

আমি listনির্দেশিত কোডটি a এর সাথে কাজ করবে না তা উল্লেখ করে আমি অন্য কোনও নাম ব্যবহার করার পরামর্শ দেব List<Value>
সুপারক্যাট

7

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

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

আরও এখানে:

http://msdn.microsoft.com/en-us/library/aa288471(VS.71).aspx


4
আমি জানি এটি এমএসডিএন-তে বলেছে, তবে এমএসডিএন পুরো ঘটনাটি বলছে না। স্ট্যাক বনাম হিপ একটি বাস্তবায়ন বিশদ এবং স্ট্রাকগুলি সর্বদা স্ট্যাকের উপর যায় না । এটিতে
অ্যান্টনি পেগ্রাম

"... এটি মান দ্বারা পাস হয়েছে ..." রেফারেন্স এবং স্ট্রাক্ট উভয়ই মান দ্বারা পাস করা হয় (যদি না কেউ 'রেফ' ব্যবহার করে) - তবে এটি কোনও মান বা রেফারেন্স পৃথক পৃথক হতে চলেছে, অর্থাত্ স্ট্রাক্টগুলি মান-দ্বারা-মানকে পাশ করেছে , শ্রেণি অবজেক্টগুলি রেফারেন্স-বাই-মান পাস হয় এবং রেফ চিহ্নযুক্ত প্যারামগুলি রেফারেন্স-বাই-রেফারেন্স পাস করে।
পল রুয়ান

10
এই নিবন্ধটি বেশ কয়েকটি মূল বিষয়গুলিতে বিভ্রান্ত করছে এবং আমি এমএসডিএন টিমটিকে এটি সংশোধন করতে বা মুছতে বলেছি।
এরিক লিপার্ট

4
@ সুপের্যাট: আপনার প্রথম পয়েন্টটি সম্বোধন করার জন্য: বৃহত্তর পয়েন্টটি হ'ল পরিচালিত কোডে যেখানে কোনও মানের সাথে একটি মান বা রেফারেন্স সংরক্ষণ করা হয় তা মূলত অপ্রাসঙ্গিক । আমরা একটি মেমরি মডেল তৈরি করতে কঠোর পরিশ্রম করেছি যা বেশিরভাগ সময় বিকাশকারীদের রানটাইমকে তাদের পক্ষে স্মার্ট স্টোরেজ সিদ্ধান্ত নিতে দেয়। এই পার্থক্যগুলি খুব বেশি গুরুত্বপূর্ণ যখন সেগুলি বোঝার ব্যর্থতার বিপর্যয়কর পরিণতি ঘটে যেমন এটি সি তে ঘটে; সি # তে তেমন কিছু নয়।
এরিক লিপার্ট

4
@ সুপের্যাট: আপনার দ্বিতীয় পয়েন্টটি সম্বোধন করার জন্য, কোনও পরিবর্তনীয় স্ট্রাক্ট বেশিরভাগই খারাপ নয়। উদাহরণস্বরূপ, অকার্যকর এম () {এস এস = নতুন এস (); s.Blah (); এন (গুলি); । রিফ্যাক্টর এতে: অকার্যকর ডোব্লাহ (এস)। এস.ব্লাহ (); } অকার্যকর এম (এস এস = নতুন এস (); দোব্লাহ (গুলি); এন (গুলি);}। এটি সবেমাত্র একটি বাগ প্রবর্তন করেছে কারণ এস একটি পরিবর্তনীয় কাঠামো immediately আপনি তত্ক্ষণাত বাগটি দেখতে পেয়েছেন? বা এস যে সত্য তা সত্য কোনও পরিবর্তনীয় কাঠামো আপনার কাছ থেকে বাগটি আড়াল করে?
এরিক লিপার্ট

6

স্ট্রাক্টের অ্যারেগুলি মেমরির একটি সংক্ষিপ্ত ব্লকে স্তূপের উপর উপস্থাপিত হয়, যেখানে বস্তুর একটি অ্যারে প্রকৃত অবজেক্টের সাথে নিজেকে অন্যত্র অন্যত্র রেফারেন্সের একটি সংক্ষিপ্ত ব্লক হিসাবে উপস্থাপন করা হয়, সুতরাং উভয় বস্তুর জন্য এবং তাদের অ্যারে রেফারেন্সের জন্য মেমরির প্রয়োজন হয় ।

এই ক্ষেত্রে, আপনি এগুলিকে একটিতে রেখে দিচ্ছেন List<>(এবং একটি List<>অ্যারেতে ব্যাক করা আছে) এটি স্ট্রাকগুলি ব্যবহার করা আরও দক্ষ, স্মৃতি ভিত্তিক হবে।

(তবে সাবধান, বড় অ্যারেগুলি বড় অবজেক্ট হিপগুলিতে তাদের পথটি খুঁজে পাবে যেখানে তাদের জীবনকাল দীর্ঘকালীন থাকলে আপনার প্রক্রিয়াটির স্মৃতি পরিচালনার উপর বিরূপ প্রভাব ফেলতে পারে Remember এছাড়াও মনে রাখবেন যে সেই স্মৃতিই কেবল বিবেচ্য নয়))


আপনি এটি ব্যবহার করতে refকীওয়ার্ড ব্যবহার করতে সক্ষম হবেন ।
লেপি

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

@ জোন আর্টাস: এলওএইচ সংক্রামিত হয় না। যে কোনও দীর্ঘস্থায়ী বস্তু এলওএইচটিকে মুক্ত মেমরির অঞ্চলে আগে এবং তার পরে অঞ্চলে ভাগ করবে। বরাদ্দকরণের জন্য সুসংগত স্মৃতি প্রয়োজন এবং যদি এই অঞ্চলগুলি বরাদ্দের জন্য যথেষ্ট পরিমাণে বড় না হয় তবে আরও মেমরি এলওএইচ বরাদ্দ করা হয় (যেমন আপনি এলওএইচ খণ্ডন পাবেন)।
পল রুয়ান

4

যদি তাদের মান শব্দার্থবিজ্ঞান থাকে, তবে আপনার সম্ভবত একটি কাঠামো ব্যবহার করা উচিত। যদি তাদের রেফারেন্স শব্দার্থবিজ্ঞান থাকে, তবে আপনার সম্ভবত একটি ক্লাস ব্যবহার করা উচিত। ব্যতিক্রম রয়েছে, যা বেশিরভাগ মান শব্দার্থক থাকলেও শ্রেণি তৈরির দিকে ঝুঁকে থাকে তবে সেখান থেকে শুরু হয়।

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

সম্পাদনা করুন:

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

ব্যক্তিগত নেস্টেড স্ট্রাক্টগুলির সাথে যুক্তিসঙ্গত ব্যতিক্রম হতে পারে, যেখানে সেই স্ট্রাক্টের সমস্ত ব্যবহার খুব সীমিত সুযোগের মধ্যে সীমাবদ্ধ। এটি যদিও এখানে প্রযোজ্য নয়।

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


3

সর্বোত্তম সমাধান হ'ল পরিমাপ করা, আবার পরিমাপ করা, তারপরে আরও কিছু পরিমাপ করা। আপনি কী করছেন তার বিশদ থাকতে পারে যা "ইউজ স্ট্রাক্টস" বা "ক্লাস ব্যবহার" এর মত সরল, সহজ উত্তর দিতে পারে।


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

3

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

আমি মনে করি স্ট্রাক্ট-বনাম-শ্রেণির বিভ্রান্তির বেশিরভাগ কারণ এই যে স্ট্রাকচারগুলির দুটি খুব ব্যবহারের ক্ষেত্রে রয়েছে, যার নকশার দিকনির্দেশগুলি খুব আলাদা হওয়া উচিত, তবে এমএস নির্দেশিকা তাদের মধ্যে পার্থক্য করে না ish কখনও কখনও এমন কিছুর প্রয়োজন হয় যা বস্তুর মতো আচরণ করে; সেক্ষেত্রে এমএসের নির্দেশিকা বেশ যুক্তিসঙ্গত, যদিও "16 বাইট সীমা" সম্ভবত 24-22 এর মতো হওয়া উচিত। কখনও কখনও, যাইহোক, যা প্রয়োজন তা হল ভেরিয়েবলগুলির সমষ্টি। এই উদ্দেশ্যে ব্যবহৃত স্ট্রাক্টটিতে কেবলমাত্র সরকারী ক্ষেত্রগুলি এবং সম্ভবত একটি Equalsওভাররাইড, ToStringওভাররাইড এবংIEquatable(itsType).Equalsবাস্তবায়ন. ক্ষেত্রের সমষ্টি হিসাবে কাঠামোগুলি অবজেক্টস নয় এবং এটি ভান করা উচিত নয়। কাঠামোর দৃষ্টিকোণ থেকে, ক্ষেত্রের অর্থ "এই ক্ষেত্রটিতে লেখা শেষ জিনিস" এর চেয়ে বেশি বা কম কিছুই হওয়া উচিত নয়। কোনও অতিরিক্ত অর্থ ক্লায়েন্ট কোড দ্বারা নির্ধারণ করা উচিত।

উদাহরণস্বরূপ, যদি কোনও চলক-সমষ্টিগত কাঠামোর সদস্য থাকে Minimumএবং Maximum, স্ট্রাক্ট নিজেই কোনও প্রতিশ্রুতি দেয় না Minimum <= Maximum। যে কোডটি প্যারামিটার হিসাবে এই জাতীয় কাঠামোটি গ্রহণ করে তার আচরণ করা উচিত যেমন এটি পৃথক Minimumএবং Maximumমানগুলি পাস করা হয়েছিল । যে প্রয়োজনীয়তা এর Minimumচেয়ে বড় নয় Maximumসেগুলি প্রয়োজনের মতো বিবেচনা করা উচিত যা কোনও Minimumপরামিতি পৃথকভাবে পাস হওয়াগুলির চেয়ে বড় নয় Maximum

কখনও কখনও বিবেচনা করার জন্য একটি দরকারী প্যাটার্ন হ'ল ExposedHolder<T>শ্রেণীর সংজ্ঞাযুক্ত কিছু রয়েছে:

class ExposedHolder<T>
{
  public T Value;
  ExposedHolder() { }
  ExposedHolder(T val) { Value = T; }
}

যদি কারও কাছে একটি থাকে List<ExposedHolder<someStruct>>, যেখানে someStructএকটি পরিবর্তনশীল-সমষ্টিগত কাঠামো থাকে, তবে কেউ এর মতো কাজ করতে পারে myList[3].Value.someField += 7;তবে myList[3].Valueঅন্য Valueকোডকে দেওয়া এটির পরিবর্তনের কোনও উপায় দেওয়ার পরিবর্তে বিষয়বস্তু সরবরাহ করবে। বিপরীতে, যদি একটি ব্যবহার List<someStruct>করে তবে এটি ব্যবহার করা প্রয়োজন var temp=myList[3]; temp.someField += 7; myList[3] = temp;। যদি কেউ একটি পরিবর্তনীয় শ্রেণীর ধরণ ব্যবহার করে তবে myList[3]বাইরের কোডের বিষয়বস্তু প্রকাশ করার জন্য সমস্ত ক্ষেত্রকে অন্য কোনও বস্তুর অনুলিপি করা দরকার require যদি এক একটি অপরিবর্তনীয় বর্গ প্রকার, বা একটি "অবজেক্ট শৈলী" struct হয় ব্যবহার করা হয়, এটি একটি নতুন দৃষ্টান্ত যা ভালো ছিল গঠন করা প্রয়োজন হবে myList[3]ছাড়াsomeField যা ভিন্ন ছিল, এবং তারপর তালিকায় যে নতুন ইনস্ট্যান্স সংরক্ষণ করি।

একটি অতিরিক্ত নোট: আপনি যদি বৃহত সংখ্যক অনুরূপ জিনিসগুলি সঞ্চয় করে থাকেন তবে এগুলি সম্ভবত কাঠামোগত নেস্টেড অ্যারেগুলিতে সংরক্ষণ করা ভাল হতে পারে, পছন্দ হিসাবে প্রতিটি অ্যারের আকার 1K এবং 64K বা এর মধ্যে রাখার চেষ্টা করছেন। স্ট্রাকচারের অ্যারেগুলি বিশেষ, সেই সূচকে কোনও তার মধ্যে কোনও কাঠামোর জন্য সরাসরি রেফারেন্স এনে দেয়, তাই কেউ "a [12] .x = 5;" বলতে পারেন। যদিও কেউ অ্যারের মতো অবজেক্টগুলি সংজ্ঞায়িত করতে পারে, সি # তাদের অ্যারের সাথে এ জাতীয় সিনট্যাক্স ভাগ করার অনুমতি দেয় না।


1

ক্লাস ব্যবহার করুন।

একটি সাধারণ নোটে। আপনি যখন তাদের মান তৈরি করে আপডেট করবেন না কেন?


1

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


0

ঠিক আছে, আপনি যদি সামগ্রিকভাবে স্ট্রাক্টের সাথে যান তবে স্ট্রিং থেকে মুক্তি পান এবং স্থির আকারের চর বা বাইট বাফার ব্যবহার করুন।

এটা আবার: পারফরম্যান্স।

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