[দ্রষ্টব্য: এই প্রশ্নের মূল শিরোনাম " সি # তে ইশ) শৈলী ইউনিয়ন ছিল " তবে জেফের মন্তব্য আমাকে অবহিত করেছিল, স্পষ্টতই এই কাঠামোটিকে 'বৈষম্যমূলক ইউনিয়ন' বলা হয়]
এই প্রশ্নের ভারবসটি ক্ষমা করুন।
আমার কাছে ইতিমধ্যে এসও তে একই ধরণের শোনার প্রশ্ন রয়েছে couple তবে তারা মনে করে ইউনিয়নের মেমরি সাশ্রয়ী সুবিধাগুলিতে বা আন্তঃব্যবহারের জন্য এটি ব্যবহারে মনোনিবেশ করছে। এই জাতীয় প্রশ্নের উদাহরণ এখানে দেওয়া হয়েছে ।
ইউনিয়ন টাইপ জিনিস রাখার আমার ইচ্ছা কিছুটা আলাদা।
আমি এই মুহুর্তে এমন কিছু কোড লিখছি যা কিছুটা দেখতে দেখতে এমন বস্তু উত্পন্ন করে
public class ValueWrapper
{
public DateTime ValueCreationDate;
// ... other meta data about the value
public object ValueA;
public object ValueB;
}
খুব জটিল জিনিস আমি মনে করি আপনি সম্মত হবেন। জিনিসটি হ'ল কেবল ValueA
কয়েকটি নির্দিষ্ট ধরণের হতে পারে (যাক বলে নেওয়া যাক string
, int
এবং Foo
(যা একটি শ্রেণি) এবংValueB
অন্য ধরণের ছোট ছোট সেট হতে পারে these আমি এই মানগুলিকে অবজেক্ট হিসাবে বিবেচনা করতে পছন্দ করি না (আমি উষ্ণ সুন্দর স্মাগলি অনুভূতি চাই কিছুটা সুরক্ষার সাথে কোডিং)।
সুতরাং আমি ভ্যালুএ যুক্তিসঙ্গতভাবে একটি নির্দিষ্ট ধরণের একটি রেফারেন্স এই সত্যটি প্রকাশ করার জন্য একটি তুচ্ছ ছোট্ট র্যাপার ক্লাস লেখার বিষয়ে চিন্তা করি। আমি ক্লাসটিকে ডেকেছিলাম Union
কারণ আমি যা অর্জন করতে চাইছি তা আমাকে সি এর ইউনিয়ন ধারণার স্মরণ করিয়ে দিয়েছে what
public class Union<A, B, C>
{
private readonly Type type;
public readonly A a;
public readonly B b;
public readonly C c;
public A A{get {return a;}}
public B B{get {return b;}}
public C C{get {return c;}}
public Union(A a)
{
type = typeof(A);
this.a = a;
}
public Union(B b)
{
type = typeof(B);
this.b = b;
}
public Union(C c)
{
type = typeof(C);
this.c = c;
}
/// <summary>
/// Returns true if the union contains a value of type T
/// </summary>
/// <remarks>The type of T must exactly match the type</remarks>
public bool Is<T>()
{
return typeof(T) == type;
}
/// <summary>
/// Returns the union value cast to the given type.
/// </summary>
/// <remarks>If the type of T does not exactly match either X or Y, then the value <c>default(T)</c> is returned.</remarks>
public T As<T>()
{
if(Is<A>())
{
return (T)(object)a; // Is this boxing and unboxing unavoidable if I want the union to hold value types and reference types?
//return (T)x; // This will not compile: Error = "Cannot cast expression of type 'X' to 'T'."
}
if(Is<B>())
{
return (T)(object)b;
}
if(Is<C>())
{
return (T)(object)c;
}
return default(T);
}
}
এই শ্রেণিটি ব্যবহার করে ভ্যালুওয়্যার্পারটি এখন এর মতো দেখাচ্ছে
public class ValueWrapper2
{
public DateTime ValueCreationDate;
public Union<int, string, Foo> ValueA;
public Union<double, Bar, Foo> ValueB;
}
যা আমি অর্জন করতে চেয়েছিলাম তার মতো কিছু তবে আমি একটি মোটামুটি গুরুত্বপূর্ণ উপাদানটি অনুপস্থিত - যা নীচের কোডটি দেখায় যেমন ইস এবং এ্যাস ফাংশনগুলিকে কল করার সময় প্রয়োগকারী প্রকারের পরীক্ষা করা হয় comp
public void DoSomething()
{
if(ValueA.Is<string>())
{
var s = ValueA.As<string>();
// .... do somethng
}
if(ValueA.Is<char>()) // I would really like this to be a compile error
{
char c = ValueA.As<char>();
}
}
আইএমও ভ্যালুএকে জিজ্ঞাসা করা বৈধ নয় char
যেহেতু এটির একটি সংজ্ঞা থেকে এটি পরিষ্কার নয় যে এটি একটি নয় - এটি একটি প্রোগ্রামিং ত্রুটি এবং আমি সংকলকটি এটি গ্রহণ করতে চাই। [এছাড়াও যদি আমি এটি সঠিকভাবে পেতে পারি তবে (আশা করি) আমিও বুদ্ধিমান হব - যা একটি উত্সাহ হবে]
এটি অর্জনের জন্য আমি সংকলককে বলতে চাই যে টাইপটি T
এ, বি বা সি এর মধ্যে একটি হতে পারে
public bool Is<T>() where T : A
or T : B // Yes I know this is not legal!
or T : C
{
return typeof(T) == type;
}
আমি যা অর্জন করতে চাই তা কি সম্ভব হলে কারও কি ধারণা আছে? বা এই ক্লাসটি প্রথম স্থানে লেখার জন্য আমি কি সরল বোকা?
আগাম ধন্যবাদ.
StructLayout(LayoutKind.Explicit)
এবংFieldOffset
। এটি অবশ্যই রেফারেন্সের ধরণের মাধ্যমে করা যায় না। আপনি যা করছেন তা কোনও সি ইউনিয়নের মতো নয়।