কখন রেফ ব্যবহার করবেন এবং কখন সি # তে এটি প্রয়োজনীয় নয়


104

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

byte[] received_s = new byte[2048];
IPEndPoint tmpIpEndPoint = new IPEndPoint(IPAddress.Any, UdpPort_msg);
EndPoint remoteEP = (tmpIpEndPoint);

int sz = soUdp_msg.ReceiveFrom(received_s, ref remoteEP); 

এটি আমাকে বিভ্রান্ত করে কারণ উভয়ই received_sএবং remoteEPফাংশন থেকে স্টাফ ফিরছে। কেন remoteEPএকটি প্রয়োজন refএবং received_sনা?

আমিও এসি প্রোগ্রামার তাই আমার মাথা থেকে পয়েন্টার বের করতে সমস্যা হচ্ছে।

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

উত্তর:


216

সংক্ষিপ্ত উত্তর: যুক্তি পাসের বিষয়ে আমার নিবন্ধটি পড়ুন ।

দীর্ঘ উত্তর: যখন রেফারেন্স টাইপের প্যারামিটারটি মান দ্বারা প্রেরণ করা হয়, কেবলমাত্র রেফারেন্সটি পাস করা হয়, বস্তুর অনুলিপিটি নয় । এটি সি বা সি ++ তে পয়েন্টার (মান দ্বারা) পাস করার মতো। প্যারামিটারের মানের পরিবর্তনগুলি নিজেই কলার দ্বারা দেখা যাবে না, তবে রেফারেন্স পয়েন্টে যে বস্তুটি দেখা যাবে তাতে পরিবর্তন হবে

একটি প্যারামিটার (যে কোন ধরনের) পাস করা হয়েছে যখন দ্বারা রেফারেন্স, তার মানে তাদের প্যারামিটার কোনো পরিবর্তন আহ্বানকারী দ্বারা দেখা হয় - প্যারামিটার পরিবর্তন হয় পরিবর্তনশীল পরিবর্তন সাধন করে।

নিবন্ধটি অবশ্যই আরও বিস্তারিতভাবে এই সমস্ত ব্যাখ্যা করে :)

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


38
আমি মনে করি আপনার সংক্ষিপ্ত উত্তর এবং দীর্ঘ উত্তর মিশ্রিত হয়েছে; এটি একটি বড় নিবন্ধ!
আউটলা প্রোগ্রামার

23
@ আউটলা: হ্যাঁ, তবে সংক্ষিপ্ত উত্তর নিজেই, নিবন্ধটি পড়ার দিকনির্দেশনা মাত্র 6 টি শব্দ দীর্ঘ :)
জন স্কিটি

27
একটি রেফারেন্স! :)
গনজোব্রেন

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

1
@ এম মিম্পেন: সি # 7 অনুমতি দেবে (আশাবাদী)if (int.TryParse(text, out int value)) { ... use value here ... }
জন স্কিটি

26

একটি রেফারেন্সবিহীন পরামিতিটিকে পয়েন্টার হিসাবে এবং একটি রেফ প্যারামিটারটিকে ডাবল পয়েন্টার হিসাবে ভাবেন। এটি আমাকে সবচেয়ে বেশি সাহায্য করেছে।

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

একাধিক ফেরতের মানগুলির জন্য

  • একাধিক রিটার্ন মান উপস্থাপন করে এমন স্ট্রাক্ট তৈরি করুন

আদিমদের জন্য যে পদ্ধতি কলের ফলাফল হিসাবে কোনও পদ্ধতিতে পরিবর্তিত হয় (পদ্ধতিটির আদিম পরামিতিগুলির উপর পার্শ্ব-প্রতিক্রিয়া রয়েছে)

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

8
ভাল দেবতা. এটি বুঝতে আমার এই 20x পড়তে হবে। সহজ কিছু করার জন্য আমার কাছে একগুচ্ছ অতিরিক্ত কাজ মনে হচ্ছে।
PositiveGuy

.NET ফ্রেমওয়ার্ক আপনার # 1 বিধি অনুসরণ করে না। ('একাধিক রিটার্ন মানগুলির জন্য স্ট্র্ট তৈরি করুন')। উদাহরণস্বরূপ নিন IPAddress.TryParse(string, out IPAddress)
সোয়েন কোইজ

@ সোয়েনকুইজ আপনি ঠিক বলেছেন আমি ধরে নিচ্ছি যে বেশিরভাগ জায়গাতে যেখানে তারা এটির প্যারামিটার ব্যবহার করে (ক) তারা একটি উইন 32 এপিআই लपेटছে, বা (খ) এটি প্রথম দিন ছিল, এবং সি ++ প্রোগ্রামাররা সিদ্ধান্ত নিচ্ছিল।
মাইকেল Meadows

@ সোয়েনকুইজ আমি জানি এই উত্তরটি অনেক বছর দেরিতে, তবে তা হয়। আমরা ট্রাইপার্সে অভ্যস্ত, তবে এর অর্থ এটি ভাল নয়। এটা তোলে যদি ভাল বদলে হত if (int.TryParse("123", out var theInt) { /* use theInt */ }আমরা ছিল var candidate = int.TrialParse("123"); if (candidate.Parsed) { /* do something with candidate.Value */ }এটা আরো কোড, কিন্তু আরো অনেক কিছু C # এর ভাষা নকশা সঙ্গে সঙ্গতিপূর্ণ।
মাইকেল Meadows

9

আপনি সম্ভবত একটি সম্পূর্ণ সি # অ্যাপ লিখতে পারেন এবং রেফ দ্বারা কোনও অবজেক্ট / স্ট্রাইকগুলি কখনই পাস করতে পারেন না।

আমার এমন একজন অধ্যাপক ছিলেন যিনি আমাকে এই কথাটি বলেছেন:

আপনি কেবলমাত্র রেফ ব্যবহার করতে পারেন যেখানে আপনি হয়:

  1. একটি বৃহত বস্তু (যেমন, বস্তু / কাঠামোর ভিতরে একাধিক স্তরে অবজেক্ট / স্ট্রাক্ট রয়েছে) পাস করতে চান এবং এটি অনুলিপি ব্যয়বহুল হবে এবং
  2. আপনি এমন একটি ফ্রেমওয়ার্ক, উইন্ডোজ এপিআই বা অন্যান্য এপিআই কল করছেন যা এটির প্রয়োজন।

শুধু পারার কারণে এটি করবেন না। আপনি যদি কোনও প্যারামে মান পরিবর্তন করতে শুরু করেন এবং মনোযোগ না দিচ্ছেন তবে আপনি কিছু বাজে বাগ দ্বারা পাছায় কিছুটা পেতে পারেন।

আমি তার পরামর্শের সাথে একমত হই, এবং স্কুল থেকে আমার পাঁচটি প্লাস বছরে ফ্রেমওয়ার্ক বা উইন্ডোজ এপিআই কল করার বাইরে আমার কখনই এর প্রয়োজন হয়নি।


3
আপনি যদি "অদলবদল" বাস্তবায়নের পরিকল্পনা করেন তবে রেফ দ্বারা পাস করা সহায়ক হতে পারে।
ব্রায়ান

@ ছোট জিনিসগুলির জন্য রেফ কীওয়ার্ড ব্যবহার করলে ক্রিস কি কোনও সমস্যা করবে?
মণিরাজ এসএস

@ টেকনিক এম্পায়ার "তবে, তথাকথিত ফাংশনের ক্ষেত্রের মধ্যে থাকা অবজেক্টের পরিবর্তনগুলি কলারের কাছে প্রতিফলিত হয় না।" এটা ভুল। আমি যদি একজন ব্যক্তির কাছে পাস করি SetName(person, "John Doe")তবে নাম সম্পত্তি পরিবর্তন হবে এবং সেই পরিবর্তনটি কলারের প্রতিফলিত হবে।
এম। মিম্পেন

@ এম মিম্পেন মন্তব্য মুছে ফেলা হয়েছে। আমি সবেমাত্র এই মুহুর্তে সি # তুলেছিলাম এবং আমার * clearly স্পষ্টভাবে কথা বলছিলাম $$ আমার মনোযোগ এটি আনয়ন করার জন্য ধন্যবাদ।

@ ক্রিস - আমি খুব নিশ্চিত যে "বড়" জিনিসটি পাস করা ব্যয়বহুল নয়। যদি আপনি এটি কেবল মূল্য দিয়ে পাস করেন তবে আপনি এখনও ঠিক একটি একক পয়েন্টারটি পেরিয়ে যাচ্ছেন?
ইয়ান

3

প্রাপ্ত_সই যেহেতু একটি অ্যারে, আপনি সেই অ্যারেটিতে একটি পয়েন্টার দিচ্ছেন। ফাংশনটি অন্তর্নিহিত অবস্থান বা পয়েন্টার পরিবর্তন না করে স্থানে বিদ্যমান ডেটা পরিচালনা করে। রেফ কীওয়ার্ডটি ইঙ্গিত দেয় যে আপনি প্রকৃত পয়েন্টারটি লোকেশনটিতে চলে যাচ্ছেন এবং বাইরের ফাংশনে সেই পয়েন্টারটি আপডেট করছেন, সুতরাং বাইরের ফাংশনের মান পরিবর্তন হবে।

উদাহরণস্বরূপ বাইট অ্যারে একই মেমরির আগে এবং পরে পয়েন্টার, মেমরিটি সবেমাত্র আপডেট হয়েছে।

এন্ডপয়েন্ট রেফারেন্সটি আসলে ফাংশনের অভ্যন্তরে তৈরি হওয়া একটি নতুন উদাহরণে বাইরের ফাংশনটিতে পয়েন্টারটি এন্ডপয়েন্টে আপডেট করে।


3

রেফারিকে অর্থ হিসাবে বিবেচনা করুন যা আপনি রেফারেন্স দ্বারা একটি পয়েন্টারটি পাস করছেন। একটি রেফ ব্যবহার না করা মানে আপনি মান দ্বারা একটি পয়েন্টার পাস করছেন।

আরও ভাল, আমি যা বলেছিলাম তা এড়িয়ে চলুন (এটি সম্ভবত বিভ্রান্তিকর, বিশেষত মান ধরণের সাথে) এবং এই এমএসডিএন পৃষ্ঠাটি পড়ুন


আসলে, সত্য নয়। কমপক্ষে দ্বিতীয় অংশ। কোনও রেফারেন্স টাইপ সর্বদা রেফারেন্সের মাধ্যমে পাস করা হবে, আপনি রেফ ব্যবহার করেন বা না করেন।
এরিক ফানকেনবাশ

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

2
একটি অ-রেফারেন্স রেফারেন্স প্রকারটি রেফারেন্স দ্বারা পাস হয় না। রেফারেন্স টাইপের একটি রেফারেন্স মান দ্বারা পাস করা হয়। তবে আপনি যদি কিছু উল্লেখ করে যা রেফারেন্স হিসাবে বিবেচনা করতে চান তবে আমি যা বলেছিলাম তা বোধগম্য হয় (তবে সেভাবে ভেবে ভ্রান্ত হতে পারে)। সুতরাং আমার সতর্কতা।
ব্রায়ান

লিঙ্কটি মারা গেছে - এর পরিবর্তে এটি ব্যবহার করে দেখুন - ডকস.মাইক্রোসফট
-

0

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


এটি কিছু স্পষ্টতা ব্যবহার করতে পারে। মান- এবং রেফারেন্স টাইয়ের মধ্যে পার্থক্য কী। উত্তর কেন প্যারামিটারে রেফার শব্দটি ব্যবহারের সাথে এটি প্রাসঙ্গিক?
oɔɯǝɹ

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

1
আপনার প্রশ্নের উত্তর দেওয়ার জন্য: স্ট্রিংটি অবজেক্ট থেকে উদ্ভূত t এটি একটি রেফারেন্স টাইপ যা মান ধরণের (পারফরম্যান্স এবং যৌক্তিক কারণে) এর মতো আচরণ করে
বন্ধু

0

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

এটি সত্যিই কেবল কার্যকর যেখানে অনুকূলকরণের প্রচেষ্টা চূড়ান্ত স্তরে নিয়ে যাওয়া হয়, পাঠযোগ্যতা এবং সম্ভবত টেস্টিবিলিটি এবং মিলি সেকেন্ড বা সম্ভবত বিভক্ত-মিলিসেকেন্ডগুলি সংরক্ষণের জন্য রক্ষণাবেক্ষণের ত্যাগ করতে হয়।


-1

প্রথম গ্রাউন্ড শূন্য রুল, প্রাইমটিভরা জড়িত TYPES এর প্রসঙ্গে রেফারেন্স (হিপ) দ্বারা মান (স্ট্যাক) এবং নন-প্রিমিটিভ দ্বারা উত্তীর্ণ হয়।

জড়িত পরামিতিগুলি ডিফল্টরূপে মান দ্বারা পাস হয়। ভাল পোস্ট যা বিশদগুলিতে জিনিসগুলি ব্যাখ্যা করে। http://yoda.arachsys.com/csharp/parameters.html

Student myStudent = new Student {Name="A",RollNo=1};

ChangeName(myStudent);

static void ChangeName(Student s1)
{
  s1.Name = "Z"; // myStudent.Name will also change from A to Z
                // {AS s1 and myStudent both refers to same Heap(Memory)
                //Student being the non-Primitive type
}

ChangeNameVersion2(ref myStudent);
static void ChangeNameVersion2(ref Student s1)
{
  s1.Name = "Z"; // Not any difference {same as **ChangeName**}
}

static void ChangeNameVersion3(ref Student s1)
{
    s1 = new Student{Name="Champ"};

    // reference(myStudent) will also point toward this new Object having new memory
    // previous mystudent memory will be released as it is not pointed by any object
}

আমরা বলতে পারি (সতর্কতার সাথে) অ-আদিম ধরণের বিন্দুগুলি পয়েন্টার ছাড়া আর কিছুই নয় এবং যখন আমরা তাদের রেফের মাধ্যমে পাস করি তখন আমরা বলতে পারি যে আমরা ডাবল পয়েন্টারটি পার করছি


সমস্ত পরামিতি সি # তে ডিফল্টরূপে মান দ্বারা পাস হয় are যে কোনও পরামিতি রেফারেন্স দিয়ে পাস করা যেতে পারে। রেফারেন্স ধরণের জন্য, যে মানটি পাস করা হয় (তা রেফারেন্স দ্বারা বা মান দ্বারা) নিজেই একটি রেফারেন্স। এটি কীভাবে পাস হয় তার থেকে সম্পূর্ণ স্বাধীন।
পরিবেশন করুন

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

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

1
আপনি রেফারেন্স বা মান দ্বারা পরামিতি পাস। "রেফারেন্স দ্বারা" এবং "মান দ্বারা" পদটি কোনও ধরণের মান ধরণের বা একটি রেফারেন্স টাইপ কিনা তা বর্ণনা করতে ব্যবহৃত হয় না।
17-18 এ পরিবেশন করুন

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