سؤال

هل أي شخص لديه حلا جيدا لC # نسخة من C ++ __FUNCTION__ ماكرو؟ لا يبدو أن المترجم لمثل ذلك.

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

المحلول

وحاول استخدام هذا بدلا من ذلك.

System.Reflection.MethodBase.GetCurrentMethod().Name

وليس لديها C # __LINE__ أو __FUNCTION__ وحدات الماكرو مثل C ++ ولكن هناك حكمه

نصائح أخرى

وما يمكنني استخدام حاليا هي وظيفة من هذا القبيل:

using System.Diagnostics;

public string __Function() {
    StackTrace stackTrace = new StackTrace();
    return stackTrace.GetFrame(1).GetMethod().Name;
}

عند أحتاج __FUNCTION__، أنا مجرد دعوة __Function () بدلا من ذلك. على سبيل المثال:

Debug.Assert(false, __Function() + ": Unhandled option");

وبالطبع يستخدم هذا الحل انعكاس للغاية، ولكن هذا هو أفضل خيار يمكن أن أجد. منذ أن كنت فقط استخدامها لتصحيح (لا تتبع في إطلاق يبني) ضرب الأداء ليس مهما.

وأعتقد أن ما يجب أن أقوم به هو خلق وظائف التصحيح وعلامة لهم

[ Conditional("Debug") ]

وبدلا من ذلك، ولكن ليس لدي جميع أنحاء لذلك.

وبفضل جيف Mastry لله لهذا.

للأسف لا توجد نسخة مماثلة من أن الماكرو في C #. أنا لا أعتبر أن GetCurrentMethodName () حل يعادل الماكرو C ++ __FUNCTION__. وهي becase وC ++ الإصدار هو وقت الحساب الترجمة من الاسم. لC # هذا هو حساب وقت ويتحمل ضربة الأداء.

وأنا لا يجعل أي assumtions عن شدة التكلفة ولكن هناك واحد

ويجب أن تعمل ما يلي، على الرغم من أنه سيتم تقييمها في وقت التشغيل بدلا من خلال تجميع.

System.Reflection.MethodBase.GetCurrentMethod().Name

ويضاف هذا في. NET 4.5.

وانظر الجواب @ الركن هنا:

هل __LINE__ توجد __FILE__ حكمه في C #؟

وأنا استخدم هذا:

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

والاستخدام سبيل المثال:

s_log.DebugFormat("{0}", CallerName());

والجانب السلبي من استخدامه هو أنه في كل مرة تريد طباعة اسم المتصل، وتحتاج للانتقال إلى وظيفة ==> مضيعة للوقت وضرب الأداء! لذلك، أنا استخدامها من أجل التصحيح perpose وإذا كنت بحاجة إلى طباعة أيضا في رمز الإنتاج، وعادة ما مضمنة اسم الدالة في log.Debug، على سبيل المثال :

s_log.Debug("CallerName");

وHTH ..

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