سؤال

من أجل العودة إلى قيمة من VB.NET وظيفة واحدة يمكن تعيين القيمة إلى "وظائف اسم" أو استخدام "قيمة إرجاع."

أحيانا نرى هذه بين مختلطة في نفس الوظيفة.شخصيا أنا أفضل العودة.

سؤالي هو ما هو داخلي الفرق بين الاثنين ؟

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

المحلول

ربما لا يوجد فرق.IIRC, مترجم ولدت IL يحول كليهما إلى عودة البيانات ما لم يكن هناك استخدامات إضافية من _returnValue متغير.

القراءة من FunctionName المهمة الفقراء في رأيي ، مثال سيء VB6 العادة.أنا أفضل _returnValue (لا RETVAL) متغير الطريقة أيضا.

نصائح أخرى

والفرق هو أنها تفعل أشياء مختلفة!

'إرجاع القيمة "يفعل أشياء 2:
1. ويحدد قيمة الإرجاع وظيفة في تلك المرحلة 2. ويخرج فورا وظيفة

وأي رمز آخر في وظيفة ينفذ!

'Functionname = قيمة' يفعل الشيء 1: 1. ويحدد قيمة الإرجاع وظيفة عند تلك النقطة

والرموز الأخرى في وظيفة لا تزال لتنفيذ وهذا يتيح منطق إضافية لتحسين أو تجاوز قيمة الإرجاع الدالة

والناس فرقا كبيرا. تذكر أنه ليس كل شيء عن الدولة، كما انها عن التدفق.

ودعونا نلقي نظرة ... والغريب أن "functionName =" يولد أقل IL؟

والرمز:

Public Function Test() As String
    Test = "Test"
End Function


Public Function Test2() As String
    Return "Test"
End Function

وIL:

.method public static string Test() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: ret 
}

.method public static string Test2() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test2)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: br.s L_0009
    L_0009: ldloc.0 
    L_000a: ret 
}

والقيام وتقدم فقط ل ل Visual Basic 6.0 المطورين التالية إلى رمز الميناء بسهولة على:

Public Function MyFunction() As String
    MyFunction = "Hello"
End Function

وأنا بالتأكيد لا أوصي حفظ يفعل ذلك إذا تضمن المشروع لمن لم يعمل مع Visual Basic 6.0، وبناء الجملة هذا سوف يكون مربكا.

و99 مرات من أصل 100 سوف تستخدم "قيمة الإرجاع".

وكل مرة واحدة في حين سآخذ وظيفة حيث النوع الآخر ليس فقط يتيح لي الفرصة لحفظ تعريف متغير، ولكنها تفعل ذلك بطريقة توضح في الواقع إلى حد كبير من وظيفة. عادة ما يحدث هذا عندما أريد أن تسمية القيمة عودة نفس وظيفة على أي حال، وغالبا هذه هي وظائف متكررة. شيئا حيال ذلك بناء يضفي عليه لمتغير العائد الضمني. ومع ذلك، هذا السيناريو هو <م> نادرة للغاية . أنا لا أعرف إذا كان لدي أية وظائف باستخدام متغيرات عودة ضمنية على الإطلاق في مشروعي الحالي.

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

والحمد لله جئت عبر مسألة تجاوز المكدس <م> كيف يمكنني أن أجعل هذه الوظيفة لا تولد "لا يقوم بإرجاع القيمة على كل ؟ مسارات "تحذير الذي يفسر لماذا. إضافة مهمة القيمة الافتراضية لاسم الإجراء على رأس وظيفة حالت دون تحذير في حالتي كذلك.

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

ولها مفيد جدا عند العمل مع المصانع 3rd الطرف (_hsf)، يمكنك تجنب تصريح المتغيرات عودة

Public Function CreateExtremum(iShape As INFITF.Reference, iDir1 As HybridShapeTypeLib.HybridShapeDirection, iSide1 As Integer, iDir2 As HybridShapeTypeLib.HybridShapeDirection, iSide2 As Integer, iDir3 As HybridShapeTypeLib.HybridShapeDirection, iSide3 As Integer) As HybridShapeTypeLib.HybridShapeExtremum
    CreateExtremum = _hsf.AddNewExtremum(iShape, iDir1, iSide1)
    CreateExtremum.Direction2 = iDir2
    CreateExtremum.ExtremumType2 = iSide2
    CreateExtremum.Direction3 = iDir3
    CreateExtremum.ExtremumType3 = iSide3
    CreateExtremum.Compute()
End Function

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

و"قيمة إرجاع" يبدو أفضل من "تعيين قيمة إلى وظائف اسم". وفي الحالة الأخيرة، "مدونة عدسة" تنتج عدد المرجعي تضخم.

' Code Lens reports "0 references" here for Sub Rosa().
Public Sub Rosa()
    Diagnostics.Debug.WriteLine(Test())
    Diagnostics.Debug.WriteLine(Test2())
End Sub

' Code Lens reports "2 references" here for Function Test().
Public Function Test() As String
    Test = "Test"       ' Code Lens counts this as a reference.
End Function

' Code Lens reports "1 reference" here for Function Test2().
Public Function Test2() As String
    Dim strTest2 as String = "Test"
    Return strTest2     ' Code Lens does NOT count this as a reference.
End Function
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top