Int [] একটি রেফারেন্স টাইপ বা মান ধরণের?


124

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


11
ভবিষ্যতে, আপনি কোনও ভেরিয়েবল তৈরির মাধ্যমে রেফারেন্সের মাধ্যমে বা মান দ্বারা কোনও কিছু পাস করা হয়েছে কিনা তা পরীক্ষা করতে পারবেন, সেই পরিবর্তনশীলটিকে সেই পদ্ধতিতে পরিবর্তিত করে সেই পদ্ধতির মাধ্যমে সঞ্চালনের পরে সেই ভেরিয়েবলের মান কী তা পরীক্ষা করে দেখুন। যদি এটি একই হয়, তবে এটি মান দ্বারা পৃথক, পৃথক, রেফারেন্স দ্বারা পাস করা হয়।

11
@ ডার্কাস্যাসিন93: রেফারেন্সের মাধ্যমে বা মান দ্বারা পাস করা কোনও বিষয় উল্লেখযোগ্য বা মান ধরণের কিনা তা সম্পর্কিত নয় whether (মানের
— ধরণগুলি

2
বেশিরভাগ ক্ষেত্রে যদি আপনি কোনও ক্ষেত্র বা ভেরিয়েবলের ভিতরে [নাল] সঞ্চয় করতে পারেন তবে আপনি ধরে নিতে পারেন যে এটি একটি রেফ টাইপ। ব্যতিক্রমগুলি অবশ্যই nlalable প্রকারের (নাল <<> বা int?) পাশাপাশি স্ট্রিংগুলি।
— নোয়েল ওয়াইডার

3
@ নোল উইডমার স্ট্রিংগুলি ব্যতিক্রম নয়: এগুলি রেফ প্রকারের।
— আর্থার কাস্ত্রো

2
@ আর্থার কাস্ট্রো অ্যারগ্রি 50%: স্ট্রিংগুলি ক্লাস থেকে উত্তরাধিকারী যার অর্থ তারা রেফারেন্স ধরণের। তবে তাদের সাম্যতা রেফারেন্সের পরিবর্তে সনাক্তকরণের (মান তুলনা) এর ভিত্তিতে এবং মান ধরণের আচরণের সাথে মেলে তাদের পাস আচরণকে ছাড়িয়ে যায়। মূলত এগুলি সংজ্ঞা অনুসারে রেফারেন্স ধরণের তবে বাস্তবায়নের মাধ্যমে মান ধরণের মতো আচরণ করে।
— নোয়েল ওয়াইডার

উত্তর:


201

অ্যারে এমন এক প্রক্রিয়া যা আপনাকে বেশ কয়েকটি আইটেমকে একক সংগ্রহ হিসাবে আচরণ করতে দেয়। মাইক্রোসফ্ট .NET কমন ল্যাঙ্গুয়েজ রানটাইম (সিএলআর) একক-মাত্রিক অ্যারে, বহুমাত্রিক অ্যারে এবং জেগড অ্যারে (অ্যারেগুলির অ্যারে) সমর্থন করে। সমস্ত অ্যারের প্রকারগুলি সুস্পষ্টভাবে System.Array থেকে উদ্ভূত, যা নিজেই System.Object থেকে উদ্ভূত। এর অর্থ হ'ল সমস্ত অ্যারে সর্বদা রেফারেন্স ধরণের থাকে যা পরিচালিত হিপগুলিতে বরাদ্দ করা হয় এবং আপনার অ্যাপ্লিকেশনের ভেরিয়েবলটিতে অ্যারেতে একটি রেফারেন্স থাকে এবং অ্যারে নিজেই নয়।

https://msdn.microsoft.com/en-us/library/bb985948.aspx


54
মানের ধরণগুলি System.ValueType থেকে উত্তরাধিকার সূত্রে আসে যা নিজেই System.Object থেকে উত্তরাধিকার সূত্রে আসে। অ্যারে সিস্টেম থেকে উদ্ভূত হয়েছে কেবল কারণ। অবজেক্ট এর অর্থ এটি কোনও রেফারেন্স টাইপ নয়। সিস্টেমটি কী করে তোলে r অ্যারে একটি রেফারেন্স টাইপ হ'ল এর উদাহরণগুলি রেফারেন্স দ্বারা অনুলিপি করা হয়। আইওডাব্লু, System.Araray একটি শ্রেণি যে বিষয়ে মনোনিবেশ করুন। এটি এটিকে একটি রেফারেন্স টাইপ করে তোলে।
— পি.ব্রায়ান.ম্যাকি

8
<nitpick> আমি জানি এটি দেখতে ডকুমেন্টেশনের মতো মনে হতে পারে যা সিস্টেমটি বোঝায় System অ্যারে সিস্টেম থেকে প্রাপ্ত .অবজেক্ট এটিকে একটি রেফারেন্স টাইপ করে তোলে। যদিও এটি সত্য নাও হতে পারে যে কোনো প্রকার System.Object থেকে আহরিত একটি রেফারেন্স টাইপ, এই নিয়মের একমাত্র ব্যতিক্রম System.ValueType, যা ভিন্নভাবে কম্পাইলার দ্বারা চিকিত্সা করা হয় </ nitpick>।
— Yannick Motton

উপরের লিঙ্কটি নষ্ট হয়ে গেছে। : এখানে আরেকটি MSDN লিংক যা System.Array উত্তরাধিকার অনুক্রমের প্রদর্শিত হয় msdn.microsoft.com/de-de/library/system.array(v=vs.110).aspx
— MUG4N

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

31

রেফারেন্স টাইপ বনাম মান ধরণের সহজতম পরীক্ষাটি হ'ল রেফারেন্স প্রকারগুলি হতে পারে nullতবে মানের ধরণগুলি পারে না।


46
... অণনীয় মান ধরণের ব্যতীত, যেগুলি অণনীয় হয় (আপনি মানটি নালতে সেট করতে পারেন, যার অর্থ নাল রেফারেন্সের পরিবর্তে প্রকারের নাল মান ) এবং এখনও মান ধরণের।
— জন স্কিটি

1
তারা মূল্যবান কি না তা বোঝার চেষ্টা করার সময় কখনই এটি করার কথা ভাবেননি! ভালো বুদ্ধি.
— ই


6

প্রথমে আপনাকে বলতে চাই অ্যারে একটি রেফারেন্স টাইপ। কেন? আমি এখানে একটি উদাহরণ নিক্ষেপ ব্যাখ্যা।

উদাহরণ:

int val = 0; // this is a value type ok
int[] val1 = new int[20] // this is a reference type because space required to store 20 integer value that make array allocated on the heap.

এছাড়াও রেফারেন্সের ধরণগুলি বাতিল হতে পারে যেখানে মানের ধরণগুলি পারে না।

স্ট্যাকের মধ্যে সঞ্চিত মান প্রকার এবং হিপে সঞ্চিত রেফারেন্স প্রকার

আপনি আউট বা রেফ ব্যবহার করে ফাংশন করতে অ্যারে পাস করতে পারেন। শুধুমাত্র আরম্ভের পদ্ধতিগুলি পৃথক।

আরো তথ্য ..


3

এটি কোনও রেফারেন্স বা মান ধরণের কিনা তা যাচাই করার জন্য পরীক্ষা করুন:

// we create a simple array of int
var a1 = new int[]{1,2,3};
// copy the array a1 to a2
var a2 = a1;
// modify the first element of a1
a1[0]=2;
// output the first element of a1 and a2
Console.WriteLine("a1:"+a1[0]); // 2
Console.WriteLine("a2:"+a2[0]); // 2
//**************************
// all the two variable point to the same array
// it's reference type!
//**************************

আপনি এটি অনলাইনে পরীক্ষা করতে পারেন: https://dotnetfiddle.net/UWFP45


2
অ্যারে তৈরি করা এবং এটিকে শূন্য করার জন্য নির্ধারণ করার চেষ্টা করা আরও সহজ হত। সংকলনটি এটির মান ধরণের হলে ব্যর্থ হত ..
— গ্রাস করা ইলিজিয়াম গ্রাস করে

আগাম হতে হবে। একবার সি # 8 প্রকাশিত হয়ে গেলে, আপনি যদি অযোগ্য রেফারেন্স টাইপ বৈশিষ্ট্যটি অ-ননযোগ্য রেফারেন্স টাইপগুলি নাল গ্রহণ করতে না পারেন তবে এটি ব্যর্থ হবে।
— মার্ক এ। ডোনোহো

2

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

সমস্ত একক মাত্রা অ্যারে সুস্পষ্টভাবে প্রয়োগ করে IList<T>, <T>অ্যারের ডেটা ধরণ কোথায় । পরিবর্তে আপনার পদ্ধতির প্যারামিটারের ডেটা টাইপ হিসাবে আপনি সেই ইন্টারফেসটি ব্যবহার করতে পারেন। আপনি IEnumerable<T>ডেটা টাইপের জন্যও ব্যবহার করতে পারেন । উভয় ক্ষেত্রে (বা আপনি কেবল ব্যবহার করলেও int[]) আপনার এটিকে refপ্যারামিটার হিসাবে স্পষ্টভাবে পাস করার প্রয়োজন হবে না ।


0

// অ্যারের উল্লেখটি মান দ্বারা পাস করা হয়। এটি বিভ্রান্তির উত্স :-) ...

        int[] test = { 1, 2, 3, 4 };

        modifContenuSansRef(test);
        Console.WriteLine(test[0]); // OK --> 99 le contenu du tableau est modifié

        modifTailleSansRef(test);
        Console.WriteLine(test.Length); // KO --> 4 La taille n'est pas modifiée

    }

    static void modifContenuSansRef(int[] t)
    {
        t[0] = 99;
    }

    static void modifTailleSansRef(int[] t)
    {
        Array.Resize(ref t, 8);
    }

0

অ্যারেগুলি সর্বদা রেফারেন্সের ধরণের হয় it এতে অ্যারেতে স্ট্রিংয়ের মতো ইনট বা রেফারেন্স টাইপের মতো মান টাইপ থাকে না example আপনি উদাহরণস্বরূপ অ্যারে ঘোষনা করলে

int[] integers=new int[10];

পূর্ণসংখ্যার ভেরিয়েবল নিজেই কেবল অ্যারে সম্পর্কিত রেফারেন্স ধারণ করে যা হিপগুলিতে থাকবে।

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

এই ক্ষেত্রে

int? integer=null

এবং প্রকারটি উল্লেখ হিসাবে চিহ্নিতকরণের পক্ষে ভাল উপায় নয় যা ভেরিয়েবলটি নাল হতে পারে না তার উপর নির্ভর করে।


-2

কিছুটা অন্তর্দৃষ্টি:

উদাহরণস্বরূপ, intএকটি একক পূর্ণসংখ্যার int[]প্রতিনিধিত্ব করে, পূর্ণসংখ্যার অ্যারের প্রতিনিধিত্ব করে।

নির্দিষ্ট মাত্রা সহ অ্যারে শুরু করতে, আপনি newটাইপ নামের পরে বর্গাকার বন্ধনীতে আকার প্রদান করে কীওয়ার্ডটি ব্যবহার করতে পারেন :

//create a new array of 32 ints.
int[] integers = new int[32];

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

int[] copy = integers;

এটি কেবল একই অ্যারের উল্লেখ করার জন্য পুরো ভেরিয়েবল কপিটি অর্পণ করবে, এটি কোনও নতুন অ্যারে তৈরি করবে না।

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

int[] integers;
integers = new int[32];

ধন্যবাদ.

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