সি # তে পয়েন্টারগুলির আসল ব্যবহার? [বন্ধ]


19

সি # তে কোডিং করার সময় কোন পরিস্থিতি যেখানে পয়েন্টার ব্যবহার করা ভাল বা প্রয়োজনীয় বিকল্প? আমি অনিরাপদ পয়েন্টারগুলির কথা বলছি ।


8
আহ্হ্হ, আমি প্রশ্নটি দেখেছি এবং সমস্ত খুশি হয়েছি কারণ আমি ব্যাখ্যা করতে পারব যে সি # তে আপনি সর্বদা পয়েন্টার ব্যবহার করেন তবে আপনাকে নিরাপদে অনিরাপদ কীওয়ার্ডটি বলে গিয়ে তা নষ্ট করতে হয়েছিল। ধূর! :)
টনি

উত্তর:


25

সি # এর বিকাশকারী নিজে থেকে:

সি # তে পয়েন্টারগুলির ব্যবহার খুব কমই প্রয়োজন হয়, তবে কিছু পরিস্থিতি রয়েছে যা তাদের প্রয়োজন। উদাহরণ হিসাবে, পয়েন্টারগুলিকে অনুমতি দেওয়ার জন্য একটি অনিরাপদ প্রসঙ্গ ব্যবহার করে নিম্নলিখিত বিষয়গুলির দ্বারা সতর্কতা অবলম্বন করা হয়:

  • ডিস্কে বিদ্যমান স্ট্রাকচারগুলি নিয়ে কাজ করা
  • উন্নত সিওএম বা প্ল্যাটফর্মগুলি পয়েন্টারগুলির সাথে স্ট্রাকচারের সাথে জড়িত পরিস্থিতিতেগুলিকে আহ্বান করে
  • পারফরম্যান্স-সমালোচনামূলক কোড

অন্যান্য পরিস্থিতিতে অনিরাপদ প্রসঙ্গে ব্যবহার নিরুত্সাহিত করা হয়।

বিশেষত, সি # তে সি কোড লেখার চেষ্টা করার জন্য কোনও অনিরাপদ প্রসঙ্গ ব্যবহার করা উচিত নয়।

সতর্কতা: "অনিরাপদ প্রসঙ্গ ব্যবহার করে লিখিত কোডটি নিরাপদ যাচাই করা যায় না, সুতরাং কোডটি পুরোপুরি বিশ্বস্ত হলেই এটি কার্যকর করা হবে other অন্য কথায়, অনিরাপদ পরিবেশে অনিরাপদ কোড কার্যকর করা যাবে না For উদাহরণস্বরূপ, আপনি অনিরাপদ চালাতে পারবেন না only ইন্টারনেট থেকে সরাসরি কোড। "

আপনি মাধ্যমে যেতে পারে এই রেফারেন্সের জন্য


"অবিশ্বস্ত পরিবেশে অনিরাপদ কোডটি কার্যকর করা যায় না।" আপনি কি "বিশ্বাসযোগ্য" বলতে চাচ্ছেন?
ডন ল্যারিনেক্স

18

হ্যাঁ, আসল ব্যবহারগুলি রয়েছে, যখন কার্য সম্পাদন সমালোচনামূলক এবং অপারেশনগুলি নিম্ন স্তরের হয়

উদাহরণস্বরূপ, চিত্র তুলনার জন্য আমাকে কেবল একবার সি # তে পয়েন্টার ব্যবহার করতে হবে। 1024x1024x32 চিত্রের জুটিতে গেটপিক্সেল ব্যবহার করা তুলনা করতে (ঠিক ম্যাচ) 2 মিনিট সময় নিয়েছে। চিত্রের মেমোরিটিকে পিন করা এবং পয়েন্টার ব্যবহার করতে 1 সেকেন্ডেরও কম সময় লেগেছিল (অবশ্যই একই মেশিনে)।


2
আমি তোমাদের যে জন্য LockBits ব্যবহার করেছেন ... ( msdn.microsoft.com/en-us/library/... )
Configurator

1
@ কনফিগ্রেটর: এটি ছিল নেট 2, লকবিটসের অস্তিত্ব ছিল না
স্টিভেন এ। লো

2
অবশ্যই তা, এটা 1.0 থেকে যে অস্তিত্ব ...
Configurator

@ কনফিগুয়েটর: আমার ত্রুটি, আমি এমএসডিএন ডকুমেন্টেশন নেভিগেটে বিভ্রান্ত হয়ে পড়েছি (যখন আমি ড্রপলিস্টে। নেট 2 এ পরিবর্তিত হয়েছি তখন এটি সম্পূর্ণ আলাদা পৃষ্ঠায় গিয়েছিল যা লকব্যাটগুলির উল্লেখ না করে)। হ্যাঁ, আপনি এইভাবে চিত্রের মেমরিটি পিন করেন।
স্টিভেন এ। লো

6

আপনাকে মনে রাখতে হবে যে মাইক্রোসফ্টের ডিজাইনাররা স্মার্ট লোক এবং তারা সি # তে যুক্ত সমস্ত কিছুর অন্তত 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;
        }
    }
}

1
আমি বলব যে বিকাশকারীরা (মাইক্রোসফ্ট বা অন্য কোনও সংস্থায়) যদি তারা কোনও বৈশিষ্ট্য অন্তর্ভুক্ত করে তবে একটি বোকা হবে কারণ এতে 1 ব্যবহারের কেস রয়েছে। কোনও বৈশিষ্ট্যে কেবল 1 টি ব্যবহারের ক্ষেত্রে বেশি হওয়া উচিত; অন্যথায় এটি একটি ফোলা।
মিথ্যা রায়ান

4
রেমন্ড চেন প্রায়শই বলেছিলেন যে মাইক্রোসফ্টের বৈশিষ্ট্যগুলি -100 "পয়েন্ট" থেকে শুরু হয়। কোনও বৈশিষ্ট্য কার্যকর করার জন্য, এটি "এটির জন্য এটির সামগ্রিক প্যাকেজটিতে একটি গুরুত্বপূর্ণ নেতিবাচক ইতিবাচক প্রভাব ফেলতে হবে"। এই সি .২০০৪ সম্পর্কে এরিকগুর ব্লগ পোস্টটি এখানে রয়েছে: ব্লগস.এমএসএনএন
জেসি বুচানন

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

4

আমাকে একবার সি # ভিত্তিক উইন্ডোজ অ্যাপ্লিকেশনটিতে পয়েন্টার (অনিরাপদ প্রসঙ্গে) ব্যবহার করতে হয়েছিল যা একটি হেডসেটের ইন্টারফেস হিসাবে কাজ করবে। এই অ্যাপ্লিকেশনটি এমন একটি ব্যবহারকারী ইন্টারফেস যা এজেন্টদের (একটি কল সেন্টারে) তাদের হেডফোন সেটিংস নিয়ন্ত্রণ করতে দেয়। এই অ্যাপ্লিকেশনটি হেডসেট প্রস্তুতকারকের দেওয়া কন্ট্রোল প্যানেলের বিকল্প হিসাবে কাজ করে। সুতরাং, উপলব্ধ বিকল্পগুলির তুলনায় হেডসেটগুলি নিয়ন্ত্রণ করার ক্ষমতা তাদের সীমিত ছিল। আমাকে পয়েন্টারগুলি ব্যবহার করতে হয়েছিল কারণ আমাকে পি / ইনভোক ব্যবহার করে হেডসেট প্রস্তুতকারকের সরবরাহ করা API (একটি ভিজ্যুয়াল সি ++ ডিএল) ব্যবহার করতে হয়েছিল।

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