বক্সিং এবং আনবক্সিং কী এবং বাণিজ্য বন্ধ কী কী?


135

আমি একটি পরিষ্কার, সংক্ষিপ্ত এবং সঠিক উত্তর খুঁজছি looking

আদর্শভাবে আসল উত্তর হিসাবে, যদিও ভাল ব্যাখ্যার লিঙ্কগুলি স্বাগত।


2
এটি কি আসলেই ভাষা-অজ্ঞাতবিদ?
হেন্ক হলটারম্যান

3
@ হেনকহোল্টারম্যান এটি অবশ্যই ভাষা নির্দিষ্ট নয় যদিও এটি সমস্ত ভাষার সাথেও প্রাসঙ্গিক নয় - উদাহরণস্বরূপ, বেশিরভাগ গতিশীল টাইপ করা ভাষার ক্ষেত্রে এই পার্থক্য অপ্রাসঙ্গিক হবে। আমি নিশ্চিত নই যে এর পরিবর্তে কোন ট্যাগটি ব্যবহার করা যেতে পারে - language-but-not-type-agnostic? static-language-agnostic? আমি নিশ্চিত নই যে এসও'র পার্থক্য প্রয়োজন; যদিও মেটা জন্য ভাল প্রশ্ন হতে পারে।
কিথ

উত্তর:


189

বক্সযুক্ত মানগুলি এমন ডেটা স্ট্রাকচার যা আদিম ধরণের * এর চারপাশে ন্যূনতম মোড়ক থাকে । Boxed মান সাধারণত বস্তু পয়েন্টার হিসেবে সংরক্ষণ করা হয় গাদা

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

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

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

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

** আমি এই উত্তরটিতে জাভা, হাস্কেল এবং সি # তেও মনোনিবেশ করছি, কারণ এটি আমি জানি। এটি মূল্যবান কিসের জন্য, পাইথন, রুবি এবং জাভাস্ক্রিপ্টের সকলের একচেটিয়াভাবে বাক্সযুক্ত মান রয়েছে। এটি "সবকিছুই একটি বস্তু" পদ্ধতির *** নামেও পরিচিত।

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


কেন একটি বাক্সিত মান হলেও, সিএলআর বা ফর্ম বক্সিংয়ের মানগুলি যা লাভ করে তাতে কী লাভ হয়?
PositiveGuy

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

2
জাভাস্ক্রিপ্টে তাই টাইপড অ্যারে (নতুন ইউআইএনটি 32 অ্যারে ইত্যাদি) বলা হয়েছে যা আনবক্সড ইনট এবং ফ্লোটের অ্যারে হয়।
nponeccop


72

বক্সিং এবং আনবক্সিং একটি আদিম মানকে অবজেক্ট ওরিয়েন্টেড র্যাপার ক্লাসে (বক্সিং) রূপান্তর করার বা একটি অবজেক্ট ওরিয়েন্টেড র্যাপার ক্লাস থেকে কোনও মানকে আদিম মানের (আনবক্সিং) এ রূপান্তর করার প্রক্রিয়া।

উদাহরণস্বরূপ, জাভাতে, আপনি যদি একটি intমান সংরক্ষণ Integerকরতে চান তবে আপনাকে কোনও মানকে (বক্সিং) রূপান্তর করতে হবে Collectionকারণ আদিমগুলি একটি Collection, কেবলমাত্র বস্তুতে সংরক্ষণ করা যায় না । তবে আপনি যখন এটিকে ফিরিয়ে আনতে চান তখন আপনি Collectionমানটি একটি হিসাবে intএবং না হিসাবে পেতে চাইলে Integerআপনি এটি আনবক্স করতে পারবেন না।

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

আজকাল এটি জাভা (এবং অন্যান্য ভাষার) "অটোবক্সিং / স্বতঃবক্সিং" বৈশিষ্ট্যের প্রসঙ্গে সবচেয়ে বেশি আলোচিত। এখানে অটোবক্সিংয়ের একটি জাভা কেন্দ্রিক ব্যাখ্যা


23

ইন। নেট:

প্রায়ই আপনাকে, কি পরিবর্তনশীল ধরণ একটি ফাংশন গ্রাস করবে উপর নির্ভর করতে পারবে না যাতে আপনি একটি বস্তু পরিবর্তনশীল যা সর্বনিম্ন বিভাজকদের থেকে প্রসারিত করে ব্যবহার করতে হবে - নেট এ এই হল object

তবে objectএটি একটি শ্রেণি এবং রেফারেন্স হিসাবে এর বিষয়বস্তু সংরক্ষণ করে।

List<int> notBoxed = new List<int> { 1, 2, 3 };
int i = notBoxed[1]; // this is the actual value

List<object> boxed = new List<object> { 1, 2, 3 };
int j = (int) boxed[1]; // this is an object that can be 'unboxed' to an int

যদিও এই উভয়ই একই তথ্য রাখে দ্বিতীয় তালিকাটি বৃহত্তর এবং ধীর। দ্বিতীয় তালিকার প্রতিটি মান আসলে একটি রেফারেন্স objectযা হোল্ড করে int

এটিকে বক্সযুক্ত বলা হয় কারণ এটি intদ্বারা মোড়ানো থাকে object। যখন এর কাস্ট intব্যাকটি আনবক্স করা হয় - তার মানটিতে ফিরে রূপান্তর।

মান ধরণের জন্য (যেমন সমস্ত structs) এটি ধীর এবং সম্ভাব্যভাবে আরও অনেক বেশি স্থান ব্যবহার করে।

রেফারেন্সের ধরণের জন্য (যেমন সমস্ত classes) এটি কোনও সমস্যার তুলনায় অনেক কম, কারণ সেগুলি যাইহোক রেফারেন্স হিসাবে সংরক্ষণ করা হয়।

একটি বক্সযুক্ত মান ধরণের আরও সমস্যা হ'ল এটি মানের চেয়ে বাক্সের সাথে কাজ করছেন তা স্পষ্ট নয়। যখন আপনি দুটি তুলনা করেন structsতখন আপনি মানগুলি তুলনা করছেন, তবে আপনি যখন দুটি তুলনা করেন classesতখন (ডিফল্টরূপে) আপনি রেফারেন্সটি তুলনা করেন - অর্থাত্ এগুলি কি একই উদাহরণ?

বক্সযুক্ত মান ধরণের সাথে ডিল করার সময় এটি বিভ্রান্তিকর হতে পারে:

int a = 7;
int b = 7;

if(a == b) // Evaluates to true, because a and b have the same value

object c = (object) 7;
object d = (object) 7;

if(c == d) // Evaluates to false, because c and d are different instances

চারপাশে কাজ করা সহজ:

if(c.Equals(d)) // Evaluates to true because it calls the underlying int's equals

if(((int) c) == ((int) d)) // Evaluates to true once the values are cast

যাইহোক বক্সযুক্ত মানগুলি নিয়ে কাজ করার সময় সাবধান হওয়া অন্য জিনিস to


1
Vb.net- তে সাম্যবাদী শব্দার্থবিদ্যার পার্থক্য আরও স্পষ্ট, Objectসমতা অপারেটর বাস্তবায়ন করে না, তবে শ্রেণির ধরণের Isঅপারেটরের সাথে তুলনা করা যেতে পারে ; বিপরীতে, Int32সাম্যতা অপারেটরের সাথে ব্যবহার করা যেতে পারে, তবে তা নয় Is। এই পার্থক্যটি আরও পরিষ্কার করে দেয় যে কী ধরণের তুলনা করা হচ্ছে।
সুপারক্যাট

4

Boxingএকটি মান প্রকারকে একটি রেফারেন্স ধরণের রূপান্তর প্রক্রিয়া। যেখানে Unboxingএকটি রেফারেন্স টাইপকে একটি মান ধরণের রূপান্তর করা হয়।

EX: int i = 123;
    object o = i;// Boxing
    int j = (int)o;// UnBoxing

মূল্য ধরনের হয়: int, charএবং structures, enumerations। রেফারেন্স ধরনের হয়: Classes, interfaces, arrays, stringsএবংobjects


3

.NET FCL জেনেরিক সংগ্রহ:

List<T>
Dictionary<TKey, UValue>
SortedDictionary<TKey, UValue>
Stack<T>
Queue<T>
LinkedList<T>

সমস্ত পূর্ববর্তী সংগ্রহ বাস্তবায়নে বক্সিং এবং আনবক্সিংয়ের পারফরম্যান্স ইস্যুগুলি কাটিয়ে উঠার জন্য তৈরি করা হয়েছিল।

আরও তথ্যের জন্য, সি # (দ্বিতীয় সংস্করণ) এর মাধ্যমে 16 অধ্যায়টি সিএলআর দেখুন ।


1

বক্সিং এবং আনবক্সিং মান প্রকারকে অবজেক্ট হিসাবে বিবেচনা করতে সহায়তা করে। বক্সিংয়ের অর্থ হ'ল অবজেক্টের রেফারেন্স টাইপের উদাহরণগুলিতে একটি মান রূপান্তর। উদাহরণস্বরূপ, Intএকটি বর্গ এবং intএকটি ডেটা টাইপ। রূপান্তর intকরা Intবক্সিংয়ের উদাহরণ, যেখানে রূপান্তর Intকরা intআনবক্সিং। অন্যদিকে ধারণাটি আবর্জনা সংগ্রহে সহায়তা করে, আনবক্সিং, অবজেক্ট টাইপকে মানের ধরণে রূপান্তর করে।

int i=123;
object o=(object)i; //Boxing

o=123;
i=(int)o; //Unboxing.

জাভাস্ক্রিপ্টে, var ii = 123; typeof ii রিটার্ন দেয় numbervar iiObj = new Number(123); typeof iiObjআয় objecttypeof ii + iiObjআয় number। সুতরাং এটি বক্সিংয়ের সমান জাভাস্ক্রিপ্ট। পাটিগণিত সম্পাদন করতে এবং একটি আনবক্সবিহীন মান ফেরত দেওয়ার জন্য iiObj মানটি স্বয়ংক্রিয়ভাবে একটি আদিম সংখ্যায় (আনবক্সড) রূপান্তরিত হয়েছিল।
প্যাটস

-2

অন্য যে কোনও কিছুর মতো, সতর্কতার সাথে ব্যবহার না করা হলে অটোবক্সিং সমস্যাযুক্ত হতে পারে। ক্লাসিকটি হল নুলপয়েন্টারএক্সসেপশন এবং এটি ট্র্যাক করতে সক্ষম হবে না end এমনকি একটি ডিবাগার দিয়েও। এটা চেষ্টা কর:

public class TestAutoboxNPE
{
    public static void main(String[] args)
    {
        Integer i = null;

        // .. do some other stuff and forget to initialise i

        i = addOne(i);           // Whoa! NPE!
    }

    public static int addOne(int i)
    {
        return i + 1;
    }
}

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

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

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