সি # তে কোডিং করার সময় কোন পরিস্থিতি যেখানে পয়েন্টার ব্যবহার করা ভাল বা প্রয়োজনীয় বিকল্প? আমি অনিরাপদ পয়েন্টারগুলির কথা বলছি ।
সি # তে কোডিং করার সময় কোন পরিস্থিতি যেখানে পয়েন্টার ব্যবহার করা ভাল বা প্রয়োজনীয় বিকল্প? আমি অনিরাপদ পয়েন্টারগুলির কথা বলছি ।
উত্তর:
সি # এর বিকাশকারী নিজে থেকে:
সি # তে পয়েন্টারগুলির ব্যবহার খুব কমই প্রয়োজন হয়, তবে কিছু পরিস্থিতি রয়েছে যা তাদের প্রয়োজন। উদাহরণ হিসাবে, পয়েন্টারগুলিকে অনুমতি দেওয়ার জন্য একটি অনিরাপদ প্রসঙ্গ ব্যবহার করে নিম্নলিখিত বিষয়গুলির দ্বারা সতর্কতা অবলম্বন করা হয়:
- ডিস্কে বিদ্যমান স্ট্রাকচারগুলি নিয়ে কাজ করা
- উন্নত সিওএম বা প্ল্যাটফর্মগুলি পয়েন্টারগুলির সাথে স্ট্রাকচারের সাথে জড়িত পরিস্থিতিতেগুলিকে আহ্বান করে
- পারফরম্যান্স-সমালোচনামূলক কোড
অন্যান্য পরিস্থিতিতে অনিরাপদ প্রসঙ্গে ব্যবহার নিরুত্সাহিত করা হয়।
বিশেষত, সি # তে সি কোড লেখার চেষ্টা করার জন্য কোনও অনিরাপদ প্রসঙ্গ ব্যবহার করা উচিত নয়।
সতর্কতা: "অনিরাপদ প্রসঙ্গ ব্যবহার করে লিখিত কোডটি নিরাপদ যাচাই করা যায় না, সুতরাং কোডটি পুরোপুরি বিশ্বস্ত হলেই এটি কার্যকর করা হবে other অন্য কথায়, অনিরাপদ পরিবেশে অনিরাপদ কোড কার্যকর করা যাবে না For উদাহরণস্বরূপ, আপনি অনিরাপদ চালাতে পারবেন না only ইন্টারনেট থেকে সরাসরি কোড। "
আপনি মাধ্যমে যেতে পারে এই রেফারেন্সের জন্য
হ্যাঁ, আসল ব্যবহারগুলি রয়েছে, যখন কার্য সম্পাদন সমালোচনামূলক এবং অপারেশনগুলি নিম্ন স্তরের হয়
উদাহরণস্বরূপ, চিত্র তুলনার জন্য আমাকে কেবল একবার সি # তে পয়েন্টার ব্যবহার করতে হবে। 1024x1024x32 চিত্রের জুটিতে গেটপিক্সেল ব্যবহার করা তুলনা করতে (ঠিক ম্যাচ) 2 মিনিট সময় নিয়েছে। চিত্রের মেমোরিটিকে পিন করা এবং পয়েন্টার ব্যবহার করতে 1 সেকেন্ডেরও কম সময় লেগেছিল (অবশ্যই একই মেশিনে)।
আপনাকে মনে রাখতে হবে যে মাইক্রোসফ্টের ডিজাইনাররা স্মার্ট লোক এবং তারা সি # তে যুক্ত সমস্ত কিছুর অন্তত 1 টি ব্যবহারের ক্ষেত্রে রয়েছে। FParsec প্রকল্পের কর্মক্ষমতা প্রতি মাসের শেষ ড্রপ যে সি # করতে সক্ষম বের করে আনা অনিরাপদ কোড ব্যবহার করে। ব্যবহারের করতে প্রস্তুত হয়ে যাও fixed
এবং stackalloc
।
private char* ReadCharsFromStream(char* buffer, int maxCount, out string overhangChars) {
Debug.Assert(maxCount >= 0);
fixed (byte* byteBuffer = ByteBuffer) {
overhangChars = null;
try {
while (maxCount >= MaxCharCountForOneByte) {// if maxCount < MaxCharCountForOneByte, Convert could throw
int nBytesInByteBuffer = FillByteBuffer();
bool flush = nBytesInByteBuffer == 0;
int bytesUsed, charsUsed; bool completed = false;
Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
buffer, maxCount, flush,
out bytesUsed, out charsUsed, out completed);
ByteBufferIndex += bytesUsed; // GetChars consumed bytesUsed bytes from the byte buffer
buffer += charsUsed;
maxCount -= charsUsed;
if (flush && completed) return buffer;
}
if (maxCount == 0) return buffer;
char* cs = stackalloc char[MaxCharCountForOneByte];
for (;;) {
int nBytesInByteBuffer = FillByteBuffer();
bool flush = nBytesInByteBuffer == 0;
int bytesUsed, charsUsed; bool completed;
Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
cs, MaxCharCountForOneByte, flush,
out bytesUsed, out charsUsed, out completed);
ByteBufferIndex += bytesUsed;
if (charsUsed > 0) {
int i = 0;
do {
*(buffer++) = cs[i++];
if (--maxCount == 0) {
if (i < charsUsed) overhangChars = new string(cs, i, charsUsed - i);
return buffer;
}
} while (i < charsUsed);
}
if (flush && completed) return buffer;
}
} catch (DecoderFallbackException e) {
e.Data.Add("Stream.Position", ByteIndex + e.Index);
throw;
}
}
}
আমাকে একবার সি # ভিত্তিক উইন্ডোজ অ্যাপ্লিকেশনটিতে পয়েন্টার (অনিরাপদ প্রসঙ্গে) ব্যবহার করতে হয়েছিল যা একটি হেডসেটের ইন্টারফেস হিসাবে কাজ করবে। এই অ্যাপ্লিকেশনটি এমন একটি ব্যবহারকারী ইন্টারফেস যা এজেন্টদের (একটি কল সেন্টারে) তাদের হেডফোন সেটিংস নিয়ন্ত্রণ করতে দেয়। এই অ্যাপ্লিকেশনটি হেডসেট প্রস্তুতকারকের দেওয়া কন্ট্রোল প্যানেলের বিকল্প হিসাবে কাজ করে। সুতরাং, উপলব্ধ বিকল্পগুলির তুলনায় হেডসেটগুলি নিয়ন্ত্রণ করার ক্ষমতা তাদের সীমিত ছিল। আমাকে পয়েন্টারগুলি ব্যবহার করতে হয়েছিল কারণ আমাকে পি / ইনভোক ব্যবহার করে হেডসেট প্রস্তুতকারকের সরবরাহ করা API (একটি ভিজ্যুয়াল সি ++ ডিএল) ব্যবহার করতে হয়েছিল।