اذا لم تجد ما تبحث عنه يمكنك استخدام كلمات أكثر دقة.
لدى سي# نظام أنماط موحد يدعى نظام الأنماط المشترك (بالإنجليزية: Common Type System) أو اختصاراً CTS. إن نظام الأنماط الموحد يقوم على مبدأ أن كافة الأنماط بما فيها الأنماط البسيطة كالأعداد الصحيحة هي صفوف مشتقة من الصف System.Object. على سبيل المثال يرث كل نمط الطريقة ()ToString.
يصنف نظام الأنماط المشترك أنماط المعطيات ضمن فئتين:
تتصف الكائنات من نمط القيمة بأنها لا تملك محدداً مرجعياً ولا تمتلك خصائص المقارنة المرجعية - فمعاملات المساواة وانعدام المساواة بين أنماط القيمة تقوم بمقارنة القيمة الحقيقية للبيانات الموجودة ضمن الكائنات ما لم تكن معاملات المقارنة هذه محملةً بشكل زائد. تُشتق أنماط القيمة من النمط System.ValueType ولديها دائماً قيمة افتراضية كما يمكن إنشاؤها ونسخها في أي وقت. من أهم القيود المفروضة على أنماط القيمة هو عدم المقدرة على الاشتقاق من بعضها البعض (إلا أنها تستطيع تحقيق الواجهات) كما أنها لا يمكن أن تحوي بانياً افتراضياً (بدون بارامترات). إن الأنماط البسيطة مثل النمط int (عدد صحيح ذو إشارة بطول 32 بتاً) والنمط float(عدد فاصلة عائمة بطول 32 بت معرف من آي تربل إي) والنمط char (وحدة كود من نظام يونيكود بطول 16 بت) والنمط System.DateTime (يعرف لحظة زمنية ما بدقة نانوثانية) هي أمثلة على أنماط القيمة. كذلك النمط enum (نمط تعدادي) والنمط struct (بنى معرفة من قبل المستخدم).
بمقابل ذلك تمتلك أنماط المرجع مفهوم المحدد المرجعي - أي أن كل كائن من النمط المرجعي يمتلك محدداً متميزاً عن محددات بقية الكائنات حتى وإن كان البيانات الموجودة ضمن كائنين هي ذاتها. ينعكس هذا المفهوم على عمليات مساواة أو عدم مساواة أنماط المرجع حيث تقوم باختبار المساواة المرجعية ولا تختبر مساواة القيم بينها إلا في حال تحميل المعاملات المقابلة بشكل زائد (كما هو الحال بالنسبة للنمط System.String. بشكل عام لا يمكن إنشاء كائنات من النمط المرجعي ولا نسخ كائن موجود ولا إجراء مقارنات بين قيم كائنين مرجعيين، على الرغم من ذلك توفر بين أنماط المرجع خدمات كهذه عبر التصريح عن بانٍ عام أو عبر تحقيق الواجهة الموافقة (مثل ICloneable وIComparable). بعض الأمثلة على أنماط المرجع النمط Object (الصف الأساسي الذي تشتق منه كافة الصفوف الأخرى) والنمط System.String (سلسلة محرفية من النمط يونيكود) والنمط System.Array (الصف الأساسي الذي تشتق منه كافة المصفوفات).
كلا الفئتين قابلتان للتوسيع بأنماط جديدة معرّفة من قبل المستخدم.
التعليب (بالإنجليزية: Boxing) هو عملية تحويل كائن من نوع نمط القيمة إلى القيمة الموافقة كنمط مرجعي وهو أحد العمليات الضمنية في لغة سي#.
فك التعليب (بالإنجليزية: Unboxing) هو عملية تحويل قيمة كائن من نوع نمط مرجعي (معلّب مسبقاً) إلى القيمة الموافقة كنمط القيمة. يتطلب فك التعليب قسراً صريحاً للنمط. إذا كان الكائن المعلب من النمط T يمكن عندها فك تعليب هذا الكائن فقط إلى النمط T (أو إلى النمط <Nullable<T).
int foo = 42; // نمط القيمة object bar = foo; // bar ضمن المتحول foo تعليب المتحول int baz = (int)bar; // فك التعليب إلى نمط القيمة الأصلي
أضيفت الأنماط العامة إلى سي# بدءاً من الإصدار 2.0. تستخدم الأنماط العامة بارامترات الأنماط والتي تمكن المطور من تصميم صفوف وطرق دون الحاجة إلى تحديد الأنماط المستخدمة، حيث يتم تحديد هذه الأنماط فقط لدى استخدامها. تكمن الفائدة من ذلك بأن القدرة على استخدام بارامترات الأنماط العامة لإنشاء الصفوف والطرق يمكن من استخدامها بشكل فعال كونه يجنب تكاليف التنفيذ الإضافية التي تسببها عمليات التعليب وفك التعليب كما يوضح المثال التالي:
// التعريف عن الصف العام public class GenericList<T> { void Add(T input) { } } class TestGenericList { private class ExampleClass { } static void Main() { // تعريف قائمة من النمط الصحيح GenericList<int> list1 = new GenericList<int>(); // تعريف قائمة من نمط السلسلة المحرفية GenericList<string> list2 = new GenericList<string>(); // ExampleClass تعريف قائمة من النمط المعرف من قبل المستخدم GenericList<ExampleClass> list3 = new GenericList<ExampleClass>(); } }
بالمقارنة مع قوالب سي++ يلاحظ أن أنماط سي# العمومية توفر أماناً أفضل إلا أنها في الوقت ذاته محدودة القدرة، فعلى سبيل المثال ليس من الممكن استخدام الأنماط العمومية كحدود للمعاملات الحسابية.