অ্যারে বা তালিকাগুলি সি # তে রেফারেন্স দ্বারা ডিফল্টরূপে পাস করেছে?


86

তারা কি? বা আমার প্রোগ্রামটি গতি বাড়ানোর জন্য আমি কি তাদের রেফারেন্স দিয়ে পাস করব?


35
আপনার প্রোগ্রামটির গতি বাড়ানোর জন্য আপনার (1) অর্থপূর্ণ লক্ষ্য নির্ধারণ করা উচিত, (২) আপনি নিজের লক্ষ্যগুলি পূরণ করেছেন কিনা তা পরীক্ষা করে দেখুন, (3) যদি আপনি না পেয়ে থাকেন তবে সবচেয়ে ধীরতম জিনিসটি খুঁজে পেতে একটি প্রোফাইলিং সরঞ্জাম ব্যবহার করুন এবং (4) ) ধীরতম জিনিসটি অনুকূলিত করুন।
এরিক লিপার্ট


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

"অন্যান্য উত্তরগুলি কমপক্ষে গুগলের ভিড়কে সহায়তা করবে" - তারা করবে! :)
মিকি 14

উত্তর:


210

রেফারেন্স পাস করা হয়েছে মান

.NET এ অ্যারেগুলি হিপগুলিতে اعتراض করা হয়, সুতরাং আপনার কাছে একটি উল্লেখ রয়েছে। এই রেফারেন্সটি মান দ্বারা পাস করা হয় যার অর্থ অ্যারের সামগ্রীতে পরিবর্তনগুলি কলার দ্বারা দেখা যাবে, তবে অ্যারের পুনরায় সাইন ইন করা এই হবে না:

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}

আপনি যদি refসংশোধক যোগ করেন তবে রেফারেন্স দ্বারা রেফারেন্সটি পাস করা হবে - এবং কলার উপরের দিকে পরিবর্তনটি দেখতে পাবে।


28
উত্তরটি সঠিক তবে আমার কাছে এমন লোকদের একটি পোষ্য ঘৃণা আছে যারা বলে যে "রেফারেন্সটি মান দ্বারা পাস হয়"। এটি বিষয়টি বিভ্রান্ত করে। হ্যাঁ, রেফারেন্স (মেমরি ঠিকানা) মান দ্বারা পাস করা হয় তবে এটি প্রশ্ন ছিল না।
ওয়ার্নারভিএ

9
@ ওয়ার্নারভাএ আমি আগ্রহী যে আপনি কীভাবে ভাবছেন যে আপনি এটি অন্যভাবে প্রকাশ করবেন যা সঠিক এবং দ্ব্যর্থহীন থেকে যায়
মার্ক গ্র্যাভেল

4
আমি প্রকাশ করব না অন্যরকম, সম্ভবত কিছুটা আরও বিশদ সহ।
ওয়ার্নারভিএ

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

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

10

তারা মান দ্বারা গৃহীত হয় (হিসাবে সব প্যারামিটার তন্ন তন্ন সুত্র কিংবা বাইরে হয়), কিন্তু মান হয় যাতে তারা কার্যকরভাবে রেফারেন্স দ্বারা গৃহীত হয়, বস্তুর একটি রেফারেন্স।


0

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


9
রেফারেন্সটি মান দ্বারা পাস হয়; যা "তারা রেফারেন্স দ্বারা পাস করা হয়" এর থেকে খুব আলাদা।
মার্ক গ্রাভেল

4
এটি সত্যের বিপরীতে। জন স্কিটির কাছ থেকে এই পোস্টটি উদ্ধৃত করে : "ডিফল্টরূপে সমস্ত প্যারামিটারগুলি সি # তে মান দ্বারা পাস হয় you একটি রেফারেন্স টাইপ, আপনি একটি সত্য বস্তুর পরিবর্তে একটি রেফারেন্স পাস করছেন "। এটি কেবলমাত্র রেফারেন্স (মেমরি ঠিকানা) যা মান দ্বারা পাস হয়।
অ্যালেক্সলম্বা ৮
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.