سؤال

أقوم بتغليف فئة C++ أصلية، والتي تحتوي على الطرق التالية:

class Native
{
    public:
    class Local
    {
        std::string m_Str;
        int m_Int;
    };

    typedef std::vector<Local> LocalVec;
    typedef LocalVec::iterator LocalIter;

    LocalIter BeginLocals();
    LocalIter EndLocals();

    private:
        LocalVec m_Locals;
};

1) ما هي "طريقة .NET" لتمثيل نفس النوع من الواجهة؟طريقة واحدة ترجع مصفوفة<>؟هل يحتوي المصفوفة <> العامة على مكررات، حتى أتمكن من تنفيذ BeginLocals() وEndLocals()؟

2) هل يجب الإعلان عن المستوى المحلي باعتباره a بنية القيمة في المجمع .NET؟

أرغب حقًا في تمثيل الفصل المغلف بنكهة .NET، لكنني جديد جدًا في العالم المُدار - وهذا النوع من المعلومات محبط لـ Google...

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

المحلول

لا يمكن ترجمة التكرارات تمامًا إلى "طريقة .net"، ولكن يتم استبدالها تقريبًا بـ IEnumerable <T > وIEnumerator <T >.

بدلا من

  vector<int> a_vector;
  vector<int>::iterator a_iterator;
  for(int i= 0; i < 100; i++)
  {
    a_vector.push_back(i);
  }

  int total = 0;
  a_iterator = a_vector.begin();
  while( a_iterator != a_vector.end() ) {
    total += *a_iterator;
    a_iterator++;
  }

سترى (في C #)

List<int> a_list = new List<int>();
for(int i=0; i < 100; i++)
{
  a_list.Add(i);
}
int total = 0;
foreach( int item in a_list)
{
  total += item;
}

أو بشكل أكثر وضوحًا (دون إخفاء IEnumerator خلف بناء جملة foreach Sugar):

List<int> a_list = new List<int>();
for (int i = 0; i < 100; i++)
{
    a_list.Add(i);
}
int total = 0;
IEnumerator<int> a_enumerator = a_list.GetEnumerator();
while (a_enumerator.MoveNext())
{
    total += a_enumerator.Current;
}

كما ترون، يقوم foreach بإخفاء عداد .net لك.

لذا، فإن "طريقة .net" حقًا ستكون ببساطة السماح للأشخاص بإنشاء عناصر قائمة<محلية> لأنفسهم.إذا كنت تريد التحكم في التكرار أو جعل المجموعة أكثر تخصيصًا، فاطلب من مجموعتك تنفيذ واجهات IEnumerable< T > و/أو ICollection< T > أيضًا.

إن الترجمة القريبة المباشرة إلى لغة C# ستكون إلى حد كبير ما افترضته:

public class Native
{
  public class Local
  { 
     public string m_str;
     public int m_int;
  }

  private List<Local> m_Locals = new List<Local>();

  public List<Local> Locals
  {
    get{ return m_Locals;}
  }
}

وبعد ذلك سيكون المستخدم قادرًا على ذلك

foreach( Local item in someNative.Locals)  
{
 ... 
}

نصائح أخرى

@ فيليب - شكرًا، إجابتك جعلتني أبدأ في الاتجاه الصحيح.

بعد رؤية الكود الخاص بك، والقيام بالمزيد من القراءة في كتاب نيش C++/CLI قيد التنفيذ, أعتقد أن استخدام خاصية مفهرسة تقوم بإرجاع مؤشر تتبع ثابت إلى مثيل محلي على الكومة المُدارة هو على الأرجح الطريقة الأفضل.انتهى بي الأمر بتنفيذ شيء مشابه لما يلي:

public ref class Managed
{
    public:
    ref class Local
    {
        String^ m_Str;
        int m_Int;
    };

    property const Local^ Locals[int]
    {
        const Local^ get(int Index)
        {
            // error checking here...
            return m_Locals[Index];
        }
    };

    private:
        List<Local^> m_Locals;
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top