.Net 4.0 এ নতুন টিপল টাইপটি কেন একটি রেফারেন্স টাইপ (শ্রেণি) এবং মান ধরণের (স্ট্রাক্ট) নয়


89

উত্তরটি কি কেউ জানেন এবং / অথবা এ সম্পর্কে কোনও মতামত আছে?

যেহেতু টিপলগুলি সাধারণত খুব বড় না হয়, তাই আমি ধরে নেব এটিগুলির জন্য ক্লাসগুলির চেয়ে স্ট্রাক্ট ব্যবহার করা আরও বোধগম্য হবে। তুমি কি বল?


4
২০১ after এর পরে এখানে যে কেউ হোঁচট খাচ্ছে c সি # In এবং আরও নতুনতে, টুপল আক্ষরিকরা টাইপ পরিবার ValueTuple<...>সি # টিপল প্রকারের
তামির ড্যানিয়েলি

উত্তর:


94

মাইক্রোসফ্ট সরলতার স্বার্থে সমস্ত tuple প্রকারের রেফারেন্স প্রকার তৈরি করেছে।

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

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

আর একটি উদ্বেগ ভার্চুয়াল প্রেরণ। রেফারেন্সের ধরণগুলি সাব টাইপগুলি সমর্থন করে এবং তাই তাদের সদস্যদের সাধারণত ভার্চুয়াল প্রেরণের মাধ্যমে আহ্বান জানানো হয়। বিপরীতে, মান ধরণেরগুলি সাব টাইপগুলিকে সমর্থন করতে পারে না তাই সদস্যের আহবান সম্পূর্ণ অস্পষ্ট এবং সর্বদা সরাসরি ফাংশন কল হিসাবে সম্পাদন করা যায়। ভার্চুয়াল প্রেরণা আধুনিক হার্ডওয়্যারটিতে অত্যন্ত ব্যয়বহুল কারণ সিপিইউ অনুমান করতে পারে না কোথায় প্রোগ্রামের কাউন্টারটি শেষ হবে end ভার্চুয়াল প্রেরণকে অনুকূলিত করতে জেভিএম দুর্দান্ত দৈর্ঘ্যে চলেছে কিন্তু। নেট তা দেয় না। যাইহোক, .NET মান ধরণের আকারে ভার্চুয়াল প্রেরণ থেকে একটি পলায়ন সরবরাহ করে। সুতরাং টিউপসকে মান ধরণের হিসাবে উপস্থাপন করা আবার নাটকীয়ভাবে পারফরম্যান্সের উন্নতি করতে পারে। উদাহরণস্বরূপ, কল করাGetHashCode একটি 2-টিপল মিলিয়ন বার 0.17s সময় লাগে কিন্তু এটি একটি সমতুল স্ট্রাক্ট এ কল করতে কেবল 0.008s লাগে, অর্থাত্ মান প্রকারটি রেফারেন্স ধরণের চেয়ে 20 × দ্রুত।

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


4
@ বেন্ট: হ্যাঁ, আমি এফ #-এর একটি গরম পথে যখন টিপলসটি দেখি তখন আমি ঠিক তাই করি। তারা নেট। ফ্রেমওয়ার্কে যদিও বাক্সযুক্ত এবং আনবক্সযুক্ত উভয় উভয়ই টিপল সরবরাহ করে থাকলে খুব ভাল লাগবে ...
জেডি

18
ভার্চুয়াল প্রেরণের বিষয়ে, আমি মনে করি যে আপনার দোষটি ভুল জায়গায় স্থান দেওয়া হয়েছে: Tuple<_,...,_>প্রকারগুলি সিল করা যেতে পারে , সেক্ষেত্রে রেফারেন্স ধরণের হয়েও ভার্চুয়াল প্রেরণের দরকার পড়েনি। তারা কেন রেফারেন্স টাইপ হয় তার চেয়ে কেন তাদের সিল দেওয়া হয় না সে সম্পর্কে আমি আরও কৌতূহলী।
কেভিবি

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

4
"512 বাইট অবধি আনবক্সযুক্ত টুপলগুলি এখনও বাক্সের চেয়ে দ্রুততর হতে পারে" - এটি কোন দৃশ্য? আপনি 512B ডেটা ধারণ করে এমন কোনও ক্লাস উদাহরণের চেয়ে দ্রুত 512B কাঠামো বরাদ্দ করতে সক্ষম হতে পারেন তবে এটিকে পাস করা 100 গুণ বেশি ধীর হতে পারে (অনুমান x86)। আমি কি কিছু উপেক্ষা করছি?
গ্রু


45

কারণটি সম্ভবত সবচেয়ে বেশি কারণ কেবল ছোট টিপলগুলি মান ধরণের হিসাবে বিবেচনা করবে কারণ তাদের একটি ছোট মেমরির পদচিহ্ন থাকবে। বৃহত্তর টিপলস (অর্থাত্ আরও বেশি সম্পত্তিযুক্ত) কার্য সম্পাদনে ক্ষতিগ্রস্থ হবে কারণ তারা 16 বাইটের চেয়ে বড় হবে।

কিছু টিপলগুলি মান ধরণের হতে পারে এবং অন্যগুলি রেফারেন্সের ধরণ এবং বিকাশকারীদের তা জানার জন্য বাধ্য করুন যা আমি মাইক্রোসফ্টের লোকেরা তাদের সমস্ত রেফারেন্স প্রকারগুলি সহজ করে তৈরি করা ভেবেছিলাম imagine

আহ, সন্দেহের বিষয়টি নিশ্চিত! দয়া করে দেখুন বিল্ডিং Tuple :

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


4
এখানে দুর্দান্ত আলোচনা: ব্লগস.এমএসডিএন
কিথ অ্যাডলার

ওহহ আচ্ছা. আমি এখনও কিছুটা বিভ্রান্ত হয়েছি যে মানের
ধরণগুলি

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

7
আপনার "16 বাইট" সীমাটি বোগাস। আমি যখন নেট 4 এ এটি পরীক্ষা করেছি তখন আমি দেখতে পেলাম যে জিসি এতটাই ধীর যে 512 বাইট অবধি আনবক্সবিহীন টুপলগুলি আরও দ্রুত হতে পারে। আমি মাইক্রোসফ্টের মাপদণ্ডের ফলাফলগুলিও প্রশ্ন করব আমি বাজি ধরছি যে তারা সমান্তরালতা উপেক্ষা করেছে (এফ # সংকলকটি সমান্তরাল নয়) এবং সেখানেই জিসি এড়ানো সত্যিই অর্থ প্রদান করে কারণ। নেট এর ওয়ার্কস্টেশন জিসিও সমান্তরাল নয়।
জেডি

কৌতূহলের বাইরে, আমি অবাক হয়েছি যে সংকলক টিম টিপলসকে এক্সপোজড-ফিল্ড স্ট্রাক্টগুলি তৈরির ধারণাটি পরীক্ষা করেছে কিনা ? এক বিভিন্ন বৈশিষ্ট্যগুলো সঙ্গে একটি ধরনের একটি দৃষ্টান্ত আছে, এবং একটি দৃষ্টান্ত যা এক বৈশিষ্ট্য যা ভিন্ন ছাড়া অভিন্ন প্রয়োজন হয়, তাহলে একটি উন্মুক্ত মাঠের struct যে সাধন করতে পারেন অনেক দ্রুততর অন্য কোনো ধরনের তুলনায়, এবং সুবিধা শুধুমাত্র structs মধ্যে পান বৃদ্ধি বড়।
সুপারক্যাট

7

.NET System.Tuple <...> প্রকারগুলি স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করা থাকলে সেগুলি স্কেলযোগ্য হবে না। উদাহরণস্বরূপ, দীর্ঘ পূর্ণসংখ্যার একটি ত্রৈমাসিক টিপল বর্তমানে নীচে হিসাবে স্কেল করে:

type Tuple3 = System.Tuple<int64, int64, int64>
type Tuple33 = System.Tuple<Tuple3, Tuple3, Tuple3>
sizeof<Tuple3> // Gets 4
sizeof<Tuple33> // Gets 4

যদি ত্রৈমাসিক টিপলটিকে স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করা হয় তবে ফলাফলটি নীচে হবে (আমি প্রয়োগ করা পরীক্ষার উদাহরণের ভিত্তিতে):

sizeof<Tuple3> // Would get 32
sizeof<Tuple33> // Would get 104

যেহেতু টিপলগুলি এফ # তে অন্তর্নির্মিত বাক্য গঠন সমর্থন করে এবং এ ভাষাতে এটি প্রায়শই ব্যবহৃত হয়, "স্ট্রাক্ট" টিউপলগুলি এফ সচেতন না হয়েও অকার্যকর প্রোগ্রাম লেখার ঝুঁকিতে এফ # প্রোগ্রামারকে ডেকে আনতে পারে। এটি এত সহজে ঘটবে:

let t3 = 1L, 2L, 3L
let t33 = t3, t3, t3

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

আদর্শভাবে, উভয় "ক্লাস" টিউপলস এবং "স্ট্রাক্ট" টিপলস উভয়ই এফ # তে সিনট্যাকটিক সমর্থন সহ থাকতে পারে!

সম্পাদনা (2017-10-07)

স্ট্রাক্ট টিউপসগুলি এখন নীচে সম্পূর্ণরূপে সমর্থিত:


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

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

4
ঘটনাক্রমে, আমি জিসির আনুপাতিক ব্যয়কে বরাদ্দকৃত সামগ্রীর ব্যয়ের অংশ হিসাবে বিবেচনা করি; যদি বরাদ্দের প্রতিটি মেগাবাইটের পরে যদি কোনও এল0 জিসি প্রয়োজনীয় হয়, তবে 64৪ বাইট বরাদ্দকরণের ক্ষেত্রে এল এল জিসির ব্যয়ের প্রায় ১ / ১,000,০০০ এবং আরও যে কোনও এল 1 বা এল 2 জিসির ব্যয়ের একটি ভগ্নাংশ যা প্রয়োজনীয় হিসাবে পরিণত হয় এর পরিণতি
সুপারক্যাট

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

4
@ জনের আমি এই উত্তরটি লেখার দু'বছর পরে আমি এখন আপনার সাথে একমত হয়েছি যে কমপক্ষে 2- এবং 3-টিউপলস স্ট্রাক্ট হলে এটি পছন্দনীয়। এ সম্পর্কিত একটি F # ভাষার ব্যবহারকারীর ভয়েস পরামর্শ দেওয়া হয়েছে। ইস্যুটির কিছুটা জরুরিতা রয়েছে, কারণ সাম্প্রতিক বছরগুলিতে বিগ ডেটা, পরিমাণগত অর্থ এবং গেমিংয়ের অ্যাপ্লিকেশনগুলির ব্যাপক বৃদ্ধি হয়েছে।
মার্ক সিগ্রিস্ট 10

4

2-টিউপলসের জন্য, আপনি এখনও সর্বদা কমন টাইপ সিস্টেমের পূর্ববর্তী সংস্করণগুলি থেকে কীভ্যালিউপায়ার <টিকি, টিভিয়াল> ব্যবহার করতে পারেন। এটি একটি মান ধরণের।

ম্যাট এলিস নিবন্ধটির একটি সামান্য ব্যাখ্যা হ'ল অপরিবর্তনশীলতা কার্যকর হলে (যা অবশ্যই এখানে ঘটবে) রেফারেন্স এবং মান ধরণের মধ্যে শব্দার্থবিজ্ঞানের ব্যবহারের পার্থক্য কেবল "সামান্য"। তবুও, আমি মনে করি যে টিপলকে কোনও প্রান্তিকের কোনও রেফারেন্সের ধরণে নিয়ে যাওয়ার বিভ্রান্তির পরিচয় না দিয়ে বিসিএল ডিজাইনে সবচেয়ে ভাল হত।


যদি কোনও মান ফিরে আসার পরে একবার ব্যবহার করা হয়, তবে কোনও আকারের একটি এক্সপোজড-ফিল্ড স্ট্রাকচার অন্য যে কোনও ধরণের প্রতিপাদন করবে, কেবলমাত্র এটি সরবরাহ করা হবে যে এটি স্ট্যাকটি ফুঁ দেওয়ার মতো ভয়াবহভাবে বিশাল নয় not শ্রেণি অবজেক্ট তৈরির ব্যয়টি কেবল তখনই পুনরুদ্ধার করা হবে যদি একাধিকবার রেফারেন্স ভাগ করে নেওয়া হয়। একটি সময় যখন এটি একটি সাধারণ-উদ্দেশ্য স্থির আকারের ভিন্ন ভিন্ন ধরণের শ্রেণীর হয়ে ওঠার জন্য দরকারী তবে অন্য সময়গুলিও যখন কাঠামো আরও ভাল হয় - এমনকি "বড়" জিনিসগুলির জন্যও।
সুপারক্যাট

এই কার্যকর নিয়ম-থাম্ব যোগ করার জন্য ধন্যবাদ। তবে আমি আশাবাদী যে আপনি আমার অবস্থানটি ভুল বোঝেন নি: আমি একটি মান ধরণের জাঙ্কি। ( স্ট্যাকওভারফ্লো.com / a / 14277068 এর কোনও সন্দেহ নেই)।
গ্লেন স্লেডেন

মানের ধরণগুলি। নেট এর দুর্দান্ত বৈশিষ্ট্যগুলির মধ্যে একটি, তবে দুর্ভাগ্যক্রমে যে ব্যক্তি এমএসডিএন ডক্স লিখেছিল তা স্বীকৃতি দিতে ব্যর্থ হয়েছিল যে তাদের জন্য একাধিক বিভেদ ব্যবহারের কেস রয়েছে এবং বিভিন্ন ব্যবহারের ক্ষেত্রে বিভিন্ন নির্দেশিকা থাকতে হবে। Struct হয় MSDN শৈলী বিশেষ পরামর্শ দেওয়া হচ্ছে শুধুমাত্র structs যে কারণ সেখানে একই ধরনের মান প্রতিনিধিত্ব সঙ্গে ব্যবহার করা উচিত, কিন্তু যদি এক চাহিদা নালী টেপ সঙ্গে একসঙ্গে নদ্ধ কিছু স্বাধীন মান প্রতিনিধিত্ব করতে, এক ব্যবহার করা উচিত নয় যে struct হয় স্টাইলের - এক সঙ্গে একটি struct ব্যবহার করা উচিত উন্মুক্ত পাবলিক ফিল্ড।
সুপারক্যাট

0

আমি জানি না তবে আপনি যদি কখনও এফ # টিপল ব্যবহার করেন তবে ভাষার অংশ are আমি যদি একটি .dll তৈরি করেছি এবং একটি ধরণের টিউপলস ফিরিয়ে দিয়েছি তবে এটি লিখতে ভাল লাগবে I আমি এখন সন্দেহ করি যে এফ # ভাষার একটি অংশ (। নেট 4) কিছু সাধারণ কাঠামো সামঞ্জস্য করার জন্য সিএলআরতে কিছু পরিবর্তন করা হয়েছিল এফ # তে

Http://en.wikibooks.org/wiki/F_Sharp_Programming/Tuples_and_Record থেকে

let scalarMultiply (s : float) (a, b, c) = (a * s, b * s, c * s);;

val scalarMultiply : float -> float * float * float -> float * float * float

scalarMultiply 5.0 (6.0, 10.0, 20.0);;
val it : float * float * float = (30.0, 50.0, 100.0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.