আমার কখন ক্লাসের পরিবর্তে স্ট্রাক ব্যবহার করা উচিত?


303

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

কিছু লোক এটি ভুলে থাকতে পারে:

  1. স্ট্রাক্টের পদ্ধতি থাকতে পারে।
  2. স্ট্রাইকগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না।

আমি স্ট্রাক্ট এবং ক্লাসগুলির মধ্যে প্রযুক্তিগত পার্থক্য বুঝতে পারি, কখন স্ট্রাকটি ব্যবহার করতে হবে তা সম্পর্কে আমার ভাল লাগা নেই।


কেবল একটি অনুস্মারক - এই প্রসঙ্গে বেশিরভাগ লোকেরা কী ভুলে যেতে চান তা হ'ল সি # স্ট্রাক্টগুলিতেও পদ্ধতি থাকতে পারে।
পেটার কে।

উত্তর:


296

এমএসডিএন এর উত্তর রয়েছে: ক্লাস এবং স্ট্রাকচারের মধ্যে নির্বাচন করা

মূলত, পৃষ্ঠাটি আপনাকে একটি 4-আইটেমের চেকলিস্ট দেয় এবং আপনার ধরণের সমস্ত মানদণ্ড পূরণ না করে ক্লাস ব্যবহার করতে বলে।

ধরণের নিম্নলিখিত বৈশিষ্ট্যযুক্ত না হলে কোনও কাঠামো সংজ্ঞায়িত করবেন না:

  • এটি যৌক্তিকভাবে একক মানকে উপস্থাপিত করে, আদিম ধরণের (পূর্ণসংখ্যা, ডাবল এবং আরও কিছু) এর সমান।
  • এটির একটি আকারের আকার 16 বাইটের চেয়ে ছোট।
  • এটি অপরিবর্তনীয়।
  • এটি ঘন ঘন বক্স করতে হবে না।

1
সম্ভবত আমি স্পষ্ট কিছু মিস করছি তবে আমি "অপরিবর্তনীয়" অংশের পিছনে যুক্তিটি যথেষ্ট পাই না। কেন এটি প্রয়োজনীয়? কেউ এটা ব্যাখ্যা করতে পারে?
তামাস সিজনেজে

3
তারা সম্ভবত এটির সুপারিশ করেছে কারণ যদি স্ট্রাক্টটি পরিবর্তনযোগ্য হয় তবে এটি বিবেচনা করে না যে এর রেফারেন্স শব্দার্থবিজ্ঞানের চেয়ে মান শব্দার্থক রয়েছে। পার্থক্য কেবল তখনই গুরুত্বপূর্ণ যদি আপনি অনুলিপি তৈরির পরে অবজেক্ট / স্ট্রাক্টকে পরিবর্তন করেন।
স্টিফেন সি স্টিল

@ ডিআরজোকপু: কিছু পরিস্থিতিতে সিস্টেমটি একটি কাঠামোর অস্থায়ী অনুলিপি তৈরি করবে এবং তারপরে সেই অনুলিপি কোডের সাথে প্রেরণ করার অনুমতি দেবে যা এটি পরিবর্তন করে; যেহেতু অস্থায়ী অনুলিপিটি জেটিসন করা হবে, পরিবর্তনটি হারিয়ে যাবে। এই সমস্যাটি বিশেষত গুরুতর হয় যদি কোনও স্ট্রাক্টের এমন কোনও পদ্ধতি থাকে যা এটির পরিবর্তক করে। আমি দৃ mut়ভাবে এই ধারণার সাথে একমত নই যে পরিবর্তনকে কোনও কিছুকে শ্রেণি তৈরি করার কারণ, যেহেতু - সি # এবং ভিবি.net তে কিছু ঘাটতি থাকা সত্ত্বেও, পরিবর্তনীয় স্ট্রাক্ট দরকারী শব্দার্থকতা সরবরাহ করে যা অন্য কোনও উপায়ে অর্জন করা যায় না; কোনও শ্রেণীর কাছে অপরিবর্তনীয় কাঠামোকে প্রাধান্য দেওয়ার কোনও অর্থগত কারণ নেই।
সুপারক্যাট

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

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

54

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

আমি স্ট্রাক্ট ব্যবহার করি যখন আমি কোনও পরিচয় ছাড়াই টাইপ চাই। উদাহরণস্বরূপ একটি 3D পয়েন্ট:

public struct ThreeDimensionalPoint
{
    public readonly int X, Y, Z;
    public ThreeDimensionalPoint(int x, int y, int z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

    public override string ToString()
    {
        return "(X=" + this.X + ", Y=" + this.Y + ", Z=" + this.Z + ")";
    }

    public override int GetHashCode()
    {
        return (this.X + 2) ^ (this.Y + 2) ^ (this.Z + 2);
    }

    public override bool Equals(object obj)
    {
        if (!(obj is ThreeDimensionalPoint))
            return false;
        ThreeDimensionalPoint other = (ThreeDimensionalPoint)obj;
        return this == other;
    }

    public static bool operator ==(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
    {
        return p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z;
    }

    public static bool operator !=(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
    {
        return !(p1 == p2);
    }
}

আপনার যদি এই স্ট্রাক্টের দুটি উদাহরণ থাকে তবে সেগুলি মেমরির বা দুটিতে একক টুকরো ডেটা কিনা সেদিকে খেয়াল রাখবেন না। আপনি কেবল তাদের কাছে রাখা মান (মান) সম্পর্কে যত্নশীল care


4
বিট অফ টপিক, তবে যখন আপত্তি থ্রি-ডাইমেনশনাল পয়েন্ট নয় তখন কেন আপনি একটি আর্গুমেন্ট এক্সেক্সপশন নিক্ষেপ করবেন? সেক্ষেত্রে আপনার কি শুধুই মিথ্যা ফিরিয়ে দেওয়া উচিত নয়?
Svish

4
এটা ঠিক, আমি অত্যধিক আগ্রহী ছিল। return falseএখন সেখানে সংশোধন করা উচিত ছিল।
আন্দ্রে রেনিয়া

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

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

ডিডিডিতে একটি মান ধরণের অর্থ এই নয় যে আপনার অগত্যা সি #
দাররাগ

27

বিল ওয়াগনার এর "কার্যকর সি #" বইতে এটি সম্পর্কে একটি অধ্যায় রয়েছে ( http://www.amazon.com/Effective-Specific-Ways-Improve-Your/dp/0321245660 )। তিনি নিম্নলিখিত নীতির ব্যবহার করে শেষ করেছেন:

  1. প্রকারের ডেটা সঞ্চয় করার মূল দায়বদ্ধতা কি?
  2. এর সার্বজনীন ইন্টারফেসটি এমন বৈশিষ্ট্য দ্বারা সম্পূর্ণরূপে সংজ্ঞায়িত হয় যা এর ডেটা সদস্যদের অ্যাক্সেস বা সংশোধন করে?
  3. আপনি কি নিশ্চিত যে আপনার ধরণের কখনও সাবক্লাস হবে না?
  4. আপনি কি নিশ্চিত যে আপনার ধরণের কখনও বহুকর্মী আচরণ করা হবে না?

আপনি যদি 4 টি প্রশ্নের 'হ্যাঁ' উত্তর দেন: একটি স্ট্রাক্ট ব্যবহার করুন। অন্যথায়, একটি ক্লাস ব্যবহার করুন।


1
সুতরাং ... ডেটা ট্রান্সফার অবজেক্টস (ডিটিও) স্ট্রাক্ট হওয়া উচিত?
ক্রুজার

1
আমি হ্যাঁ বলব, যদি এটি উপরে বর্ণিত 4 টি মানদণ্ড পূরণ করে। কেন একটি ডেটা ট্রান্সফার অবজেক্টকে একটি নির্দিষ্ট উপায়ে চিকিত্সা করা দরকার?
বার্ট গিজসেনস

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

1
(2) বাদে সমস্তই দুর্দান্ত নীতিমালা বলে মনে হয়। (২) তিনি কী বোঝাতে চেয়েছিলেন এবং কেন তা বোঝার জন্য তাঁর যুক্তিগুলি দেখতে হবে।
টুলমেকারস্টেভ

1
@ টুলমেকারস্টেভ: আপনাকে তার জন্য বইটি পড়তে হবে। বইয়ের বড় অংশগুলি অনুলিপি / আটকানো মোটামুটি মনে করবেন না।
বার্ট গিজসেন্স

15

আপনি যখন রেফারেন্স-টাইপের পরিবর্তে মান-ধরণের শব্দার্থক চান একটি স্ট্রাক ব্যবহার করুন। স্ট্রাক্টস কপি-বাই-ভ্যালু তাই সাবধান!

পূর্ববর্তী প্রশ্নগুলিও দেখুন, যেমন

.NET এ কাঠামো এবং শ্রেণীর মধ্যে পার্থক্য কী?


11

আমি স্ট্রাক্ট ব্যবহার করব যখন:

  1. কোনও অবজেক্টটি কেবলমাত্র পড়ার কথা (প্রতিটি সময় আপনি কোনও স্ট্রাকটি পাস / অর্পণ করলে এটি অনুলিপি হয়)। মাল্টিথ্রেডেড প্রসেসিংয়ের ক্ষেত্রে কেবল পঠনযোগ্য অবজেক্টগুলি দুর্দান্ত কারণ তারা বেশিরভাগ ক্ষেত্রে লকিংয়ের প্রয়োজন হয় না।

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


10

একটি ক্লাস ব্যবহার করুন যদি:

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

একটি কাঠামো ব্যবহার করুন যদি:

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

5

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


4

যদি কোনও সত্তা অপরিবর্তনীয় হতে চলেছে তবে কাঠামো বা শ্রেণিটি ব্যবহার করা হবে কিনা সে প্রশ্নটি শব্দার্থবিজ্ঞানের পরিবর্তে সাধারনত পারফরম্যান্সের একটি হবে। 32/64-বিট সিস্টেমে ক্লাসের রেফারেন্সগুলিতে ক্লাসের তথ্যের পরিমাণ নির্বিশেষে 4/8 বাইট সংরক্ষণ করতে হয়; শ্রেণীর রেফারেন্স অনুলিপি করতে 4/8 বাইট অনুলিপি করতে হবে। অন্যদিকে, প্রতিটি স্বতন্ত্রশ্রেণীর উদাহরণে 8/16 বাইটের ওভারহেড থাকবে এটির তথ্য এবং এটির রেফারেন্সগুলির মেমরির খরচ ছাড়াও। মনে করুন যে কেউ 500 টি সত্ত্বার একটি অ্যারে চায়, যার প্রত্যেকটিতে চারটি 32-বিট পূর্ণসংখ্যা রয়েছে। সত্তাটি যদি কাঠামোর ধরণ থাকে তবে সমস্ত 500 সত্তা সমস্ত অভিন্ন, সমস্ত আলাদা বা কোথাও কোথাও এর মধ্যে নির্বিশেষে অ্যারেতে 8,000 বাইটের প্রয়োজন হবে। সত্তাটি কোনও শ্রেণির ধরণের হলে 500 রেফারেন্সের অ্যারে 4,000 বাইট লাগবে। যদি সেই সমস্ত রেফারেন্সগুলি বিভিন্ন বস্তুর দিকে নির্দেশ করে তবে অবজেক্টগুলির জন্য অতিরিক্ত 24 বাইট (সমস্ত 500 এর জন্য 12,000 বাইট), মোট 16,000 বাইট প্রয়োজন হবে - স্ট্রাক্ট ধরণের স্টোরেজ ব্যয়ের দ্বিগুণ। অন্যদিকে, কোডটিতে একটি অবজেক্ট ইনস্ট্যান্স তৈরি হয়েছিল এবং তারপরে সমস্ত 500 অ্যারে স্লটে একটি রেফারেন্স অনুলিপি করে, মোট ব্যয় হবে সেই উদাহরণের জন্য 24 বাইট এবং 4, অ্যারের জন্য 000 - মোট 4,024 বাইট। একটি বড় সঞ্চয়। শেষের মতো কয়েকটি পরিস্থিতিও কার্যকর হবে, তবে কিছু ক্ষেত্রে এই জাতীয় ভাগ ভাগ্যকে কার্যকর করার জন্য পর্যাপ্ত অ্যারে স্লটগুলির জন্য কিছু রেফারেন্স অনুলিপি করা সম্ভব হতে পারে।

সত্তাটি যদি পরিবর্তনীয় হতে পারে বলে মনে করা হয়, কোনও শ্রেণি বা কাঠামো ব্যবহার করবেন কিনা তা প্রশ্ন কোনও উপায়ে সহজ। ধরুন, "থিং" হয় স্ট্রাক্ট বা শ্রেণি যার একটি পূর্ণসংখ্যা ক্ষেত্র x নামে থাকে এবং নিম্নলিখিত কোডটি একটি করে:

  জিনিস টি 1, টি 2;
  ...
  t2 = t1;
  t2.x = 5;

কেউ কি উত্তরোক্ত বিবৃতিটি টি 1.xকে প্রভাবিত করতে চায়?

থিং যদি শ্রেণীর ধরণের হয় তবে টি 1 এবং টি 2 সমান হবে, অর্থ টি 1.x এবং টি 2.x সমানও হবে। সুতরাং, দ্বিতীয় বিবৃতি t1.x প্রভাবিত করবে। থিং যদি কাঠামোর ধরণ হয় তবে টি 1 এবং টি 2 বিভিন্ন উদাহরণ হতে পারে, যার অর্থ t1.x এবং t2.x বিভিন্ন পূর্ণসংখ্যাকে বোঝায়। সুতরাং, দ্বিতীয় বিবৃতি t1.x প্রভাবিত করবে না।

পরিবর্তনীয় কাঠামো এবং পরিবর্তনীয় ক্লাসগুলি মৌলিকভাবে বিভিন্ন আচরণ করে, যদিও স্ট্রাক্ট মিউটেশনগুলি পরিচালনা করার ক্ষেত্রে নেট এর কিছুটা তর্ক রয়েছে। যদি কেউ মান ধরণের আচরণ চায় (যার অর্থ "t2 = t1" টি 1 এবং t2 টি পৃথক দৃষ্টান্ত হিসাবে রেখে টি -1 থেকে টি 2-তে ডেটা অনুলিপি করবে), এবং যদি কেউ মানের ধরণের নেট। হ্যান্ডলিংয়ে কিরক দিয়ে বাস করতে পারে তবে ব্যবহার করুন একটি কাঠামো যদি কেউ মান-ধরণের শব্দার্থক শব্দগুলি চায় তবে। নেট এর কিরকগুলি কারও প্রয়োগে ভ্যালু-ধরণের শব্দার্থক পদার্থের কারণ হতে পারে, একটি শ্রেণি ব্যবহার করে এবং বিভ্রান্ত হবে।


3

উপরের চমৎকার উত্তরগুলি ছাড়াও:

কাঠামো মান ধরণের।

এগুলি কখনই কিছুতেই সেট করা যায় না

একটি কাঠামো নির্ধারণ = কিছুই নয়, এর মান মানগুলি তাদের ডিফল্ট মানগুলিতে সেট করবে।


2

যখন আপনার সত্যিকারের আচরণের প্রয়োজন নেই, তবে আপনার সাধারণ অ্যারে বা অভিধানের চেয়ে আরও কাঠামো দরকার।

ফলোআপ এইভাবে আমি সাধারণভাবে স্ট্রাইকগুলি সম্পর্কে ভাবি। আমি জানি তাদের পদ্ধতি থাকতে পারে তবে আমি সামগ্রিক মানসিক পার্থক্য রাখতে চাই।


তুমি কেন এটা বললে? স্ট্রাক্টগুলির পদ্ধতি থাকতে পারে।
এস্তেবান আরায়া

2

@ সিমন যেমন বলেছিলেন, স্ট্রাইকগুলি "মান ধরণের" শব্দার্থক সরবরাহ করে তাই আপনার যদি কোনও অন্তর্নির্মিত ডেটা টাইপের অনুরূপ আচরণের প্রয়োজন হয় তবে একটি কাঠামো ব্যবহার করুন। যেহেতু স্ট্রাইকগুলি অনুলিপি দ্বারা পাস হয় আপনি নিশ্চিত করতে চান যে সেগুলি আকারে প্রায় 16 বাইট।


2

এটি একটি পুরানো বিষয়, তবে একটি সাধারণ বেঞ্চমার্ক পরীক্ষা দিতে চেয়েছিল।

আমি দুটি .cs ফাইল তৈরি করেছি:

public class TestClass
{
    public long ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

এবং

public struct TestStruct
{
    public long ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

বেঞ্চমার্ক চালান:

  • 1 টেস্টক্লাস তৈরি করুন
  • 1 টেস্টস্ট্রাক্ট তৈরি করুন
  • 100 টেস্টক্লাস তৈরি করুন
  • 100 টেস্টস্ট্রাক্ট তৈরি করুন
  • 10000 টেস্টক্লাস তৈরি করুন
  • 10000 টেস্টস্ট্রাক্ট তৈরি করুন

ফলাফল:

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.101
[Host]     : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT  [AttachedDebugger]
DefaultJob : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT


|         Method |           Mean |         Error |        StdDev |     Ratio | RatioSD | Rank |    Gen 0 | Gen 1 | Gen 2 | Allocated |
|--------------- |---------------:|--------------:|--------------:|----------:|--------:|-----:|---------:|------:|------:|----------:|

|      UseStruct |      0.0000 ns |     0.0000 ns |     0.0000 ns |     0.000 |    0.00 |    1 |        - |     - |     - |         - |
|       UseClass |      8.1425 ns |     0.1873 ns |     0.1839 ns |     1.000 |    0.00 |    2 |   0.0127 |     - |     - |      40 B |
|   Use100Struct |     36.9359 ns |     0.4026 ns |     0.3569 ns |     4.548 |    0.12 |    3 |        - |     - |     - |         - |
|    Use100Class |    759.3495 ns |    14.8029 ns |    17.0471 ns |    93.144 |    3.24 |    4 |   1.2751 |     - |     - |    4000 B |
| Use10000Struct |  3,002.1976 ns |    25.4853 ns |    22.5920 ns |   369.664 |    8.91 |    5 |        - |     - |     - |         - |
|  Use10000Class | 76,529.2751 ns | 1,570.9425 ns | 2,667.5795 ns | 9,440.182 |  346.76 |    6 | 127.4414 |     - |     - |  400000 B |

1

হুম ...

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

বেশিরভাগ সময় যখন আমি স্ট্রাক্ট ব্যবহার করি, তখন আমি এগুলি করার জন্য নিজেকে লাথি মেরে শেষ করি, কারণ আমি পরে আবিষ্কার করেছি যে রেফারেন্স সিমেন্টিক্সগুলি বিষয়টিকে কিছুটা সহজ করে তুলেছে।

যাইহোক, উপরে পোস্ট করা এমএসডিএন নিবন্ধের সেই চারটি পয়েন্ট একটি ভাল গাইডলাইন বলে মনে হচ্ছে।


1
আপনার যদি কখনও কখনও কোনও কাঠামোর সাথে রেফারেন্স শব্দার্থের প্রয়োজন হয়, কেবল ঘোষণা করুন class MutableHolder<T> { public T Value; MutableHolder(T value) {Value = value;} }এবং তারপরে একটি MutableHolder<T>পরিবর্তনীয় শ্রেণীর শব্দার্থবিজ্ঞানের সাথে একটি বস্তু হবে (এটি Tস্ট্রাক্ট বা অপরিবর্তনীয় শ্রেণীর ধরণের হলেও ঠিক এটি কাজ করে )।
সুপারক্যাট

1

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


-3

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


স্ট্রাইকগুলিরও পদ্ধতি থাকতে পারে
নিতিন চন্দ্রন

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