أين يمكنني العثور على معلومات حول GET ، وتعيين وعنوان أساليب النظام متعدد الأبعاد. مثيلات في .NET؟

StackOverflow https://stackoverflow.com/questions/2555769

سؤال

System.array بمثابة فئة أساسية لجميع المصفوفات في وقت تشغيل اللغة المشتركة (CLR). بالنسبة الى هذه المقالة:

لكل نوع صفيف ملموس ، يضيف وقت التشغيل ثلاث طرق خاصة: Get/Set/Address.

وبالفعل إذا قمت بفك هذا الرمز C# ،

int[,] x = new int[1024,1024];
x[0,0] = 1;
x[1,1] = 2;
x[2,2] = 3;
Console.WriteLine(x[0,0]);
Console.WriteLine(x[1,1]);
Console.WriteLine(x[2,2]);

في cil أحصل ،

IL_0000:  ldc.i4     0x400
IL_0005:  ldc.i4     0x400
IL_000a:  newobj     instance void int32[0...,0...]::.ctor(int32,
                                                         int32)
IL_000f:  stloc.0
IL_0010:  ldloc.0
IL_0011:  ldc.i4.0
IL_0012:  ldc.i4.0
IL_0013:  ldc.i4.1
IL_0014:  call       instance void int32[0...,0...]::Set(int32,
                                                       int32,
                                                       int32)
IL_0019:  ldloc.0
IL_001a:  ldc.i4.1
IL_001b:  ldc.i4.1
IL_001c:  ldc.i4.2
IL_001d:  call       instance void int32[0...,0...]::Set(int32,
                                                       int32,
                                                       int32)
IL_0022:  ldloc.0
IL_0023:  ldc.i4.2
IL_0024:  ldc.i4.2
IL_0025:  ldc.i4.3
IL_0026:  call       instance void int32[0...,0...]::Set(int32,
                                                       int32,
                                                       int32)
IL_002b:  ldloc.0
IL_002c:  ldc.i4.0
IL_002d:  ldc.i4.0
IL_002e:  call       instance int32 int32[0...,0...]::Get(int32,
                                                        int32)
IL_0033:  call       void [mscorlib]System.Console::WriteLine(int32)
IL_0038:  ldloc.0
IL_0039:  ldc.i4.1
IL_003a:  ldc.i4.1
IL_003b:  call       instance int32 int32[0...,0...]::Get(int32,
                                                        int32)
IL_0040:  call       void [mscorlib]System.Console::WriteLine(int32)
IL_0045:  ldloc.0
IL_0046:  ldc.i4.2
IL_0047:  ldc.i4.2
IL_0048:  call       instance int32 int32[0...,0...]::Get(int32,
                                                        int32)
IL_004d:  call       void [mscorlib]System.Console::WriteLine(int32)

حيث المكالمات المذكورة أعلاه Get و Set يمكن رؤية الطرق بوضوح. يبدو أن قسوة هذه الأساليب مرتبطة بأبعاد المصفوفة ، وهو ما يفترض أنه يتم إنشاؤها بواسطة وقت التشغيل وليس معلنًا مسبقًا. لم أتمكن من تحديد موقع أي معلومات حول هذه الأساليب على MSDN وأسمائها البسيطة تجعلهم مقاومًا لـ googling. أنا أكتب برنامجًا برمجيًا للغة التي تدعم المصفوفات متعددة الأبعاد ، لذلك أود أن أجد بعض الوثائق الرسمية حول هذه الطرق ، في ظل الظروف التي يمكنني توقعها لوجودها وما يمكنني توقع أن تكون توقيعاتهم.

على وجه الخصوص ، أود أن أعرف ما إذا كان من الممكن الحصول على ملف MethodInfo اعتراض Get أو Set للاستعمال مع Reflection.Emit دون الحاجة إلى إنشاء نموذج من الصفيف مع النوع الصحيح والأبعاد التي تنعكس عليها ، كما هو الحال في المثال المرتبط.

هل كانت مفيدة؟

المحلول

انظر هنا ، على وجه التحديد القسم 14.2 على الصفحات 63-65

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS٪20PARTITION٪20II.PDF

لكن الوجبات الجاهزة ، ويمكنك معرفة ذلك من IL ، هي أنها أساليب Getter و Setter للتعامل مع المصفوفات في مواقع الفهرس المحددة.

• طريقة GET التي تأخذ سلسلة من الوسائط int32 ، واحدة لكل بعد من الصفيف ، وإرجاع قيمة نوعها هو نوع العنصر من الصفيف. يتم استخدام هذه الطريقة للوصول إلى عنصر معين من الصفيف حيث تحدد الوسيطات الفهرس في كل بعد ، بدءًا من العنصر الأول ، للعنصر المراد إرجاعه.

• طريقة مجموعة تأخذ تسلسلًا من الوسائط int32 ، واحدة لكل بُعد من الصفيف ، تليها قيمة نوعها هو نوع العنصر من الصفيف. نوع العودة من مجموعة باطلة. يتم استخدام هذه الطريقة لتعيين عنصر معين من الصفيف حيث تحدد الوسيطات الفهرس في كل بعد ، بدءًا من العنصر الأول ، للعنصر المراد تعيينه ، وتحدد الوسيطة النهائية القيمة المراد تخزينها في العنصر الهدف.

• طريقة العنوان التي تأخذ سلسلة من الوسائط int32 ، واحدة لكل بُعد من الصفيف ، ولها نوع إرجاع يمثل مؤشرًا مُدارًا إلى نوع عنصر المصفوفة. يتم استخدام هذه الطريقة لإرجاع مؤشر مُدار إلى عنصر معين من الصفيف حيث تحدد الوسيطات الفهرس في كل بُعد ، بدءًا من العنصر الأول ، للعنوان الذي يتم إرجاع عنوانه.

تعديل: هذه الصفحات 63-65 باستخدام ترقيم صفحة المستند. 73-75 في PDF الفعلي.

نصائح أخرى

للإجابة على سؤالك الثاني ، لا تحتاج إلى إنشاء مثيل للحصول على ملف MethodInfo لهذه الطرق. شيء مثل

var mi = typeof(string).MakeArrayType(6).GetMethod("Get");

سيعمل على الحصول على Get طريقة ل string[,,,,,] يكتب.

لست متأكدًا مما إذا كان سيتناول سؤالك المحدد للغاية ولكن نص رائع حول هذا الموضوع (من بين أمور أخرى) CLR عبر C#. يصبح الأمر متعمقًا للغاية بالنسبة للعديد من الموضوعات التي تهتم بها وتنفق الكثير من الوقت مع Disassembler الذي يبحث في الأعمال الداخلية للعديد من أنواع .NET الأساسية بما في ذلك المصفوفات. بالتأكيد تستحق التحقق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top