سؤال

يمكنني أن أتذكر العودة عند العمل مع MFC، يمكنك دعم إصدارات متعددة من إطار MFC عن طريق التحقق من _MFC_VER دقيق.

أقوم بعمل بعض الأشياء الآن مع .NET 4 وترغب في استخدام tuple في بضع من البقع ولكن لا يزال يحتفظ بأي شيء آخر 3.5 متوافق.

أنا أتطلع إلى القيام بشيء مثل:

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
هل كانت مفيدة؟

المحلول

لا توجد ثوابت مسبقة مسبقة الاستخدام التي يمكنك استخدامها. ولكن من السهل إنشاء تكوينات البناء الخاصة بك في مقابل كل تكوين لها مجموعة من الثوابت المحددة وبالطبع إصدار إطار هدفي. الكثير من الناس يقومون بذلك بتجميع اختلافات تجميع 32 أو 64 بت.

نصائح أخرى

هناك تحذير كبير لتكون على دراية عند تحديد رموز تجميع مخصص في .csproj (أو .vbproj، من الناحية النظرية): إنهم يبحثون عن جميع رموز الترجمة المحددة مسبقا. على سبيل المثال، ضع في اعتبارك Msbuild Snippet:

  <PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
    <DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
  </PropertyGroup>
  <PropertyGroup>
    <DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
  </PropertyGroup>

سيقوم عنصر Dequeconstants الثاني، حيث أن قيمتها تشير إلى أن القيمة الأولى للقيمة الأولى من Dequeconstants. لتجنب ذلك، سترغب في إعادة كتابة عنصر Dececonstants الثاني لتبدو كهذا:

    <DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>

أيضا، سترغب في وضع هذا داخل مجموعة الخصائص المحددة بعد جميع مجموعات البريدية الأخرى، كما يضيف Visual Studio 2010 حاليا في رموز تجميع مخصصة في هذه الطريقة التي ستقدم فيها أي رموز تجميع مخصصة أخرى تحددها إذا تم وضعها قبل خصم Visual Studio أسفل تعريفها. لقد قدمت هذه المشكلة مع Microsoft. يمكنك تتبع تقدمها في مايكروسوفت الاتصال.

في ملاحظة جانبية، سوف يحبط رمز التجميع الشرطي الخاص بك عن إحباط المبرمجين الذين يواجهونه.

تم التعديل، بناء على التعليقات

من الأفضل أن تكتب فصلك الخاص حتى تتمكن من ضمان ما ستفعله، وليس لديك أي مشاكل توقيع أو ميراث غريب:

public class Pair<TSource, TResult>
{
    public TSource Source { get; set; }
    public TResult Result { get; set; }

    public Pair() {}
    public Pair(TSource source, TResult result)
    {
        Source = source;
        Result = result;
    }

    // Perhaps override Equals() and GetHashCode() as well
}

كما هو الحال دائما، من الجيد أن تزن استخدام الأشياء المدمجة مقابل التراجع عن الرمز الخاص بك. عموما هذا يعني أن يسأل نفسك، "هل أنا طيب الحفاظ على هذا الرمز ودعمه؟" مقابل "هل يفعل الكود ما أحتاجه إليه، خارج الصندوق؟"

في هذه الحالة، نظرا لأنك غير مضمون Tuple<T1, T2>, ، سأكتب فقط واحدة بسيطة حتى يمكن للمطورين الآخرين التنفس بسهولة :)

كما يجب أن يكون لديك مشاريع مختلفة، يمكن أن يكون لديك فصول جزئية ومرجع الوحيد الذي تحتاجه لكل مشروع مع المنطق المحدد بالنسبة لهم:

Classname.cs Classamname Public PartialName {...}

ClassName.40.cs NationalName Public SpecialName {Public Tuple Somemethod () {...}}

Classname.35.cs NationalName Classemname العام {Public Keyvaluepair

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