كيف يمكنني الوصول إلى 'هذا' من داخل أسلوب تمديد C #؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

ولقد تم العمل مع وVector2 وXNA، وجئت لتجد أن استدعاء دالة عضو تطبيع () على ناقل صفر طبيعتها إلى متجه {نان، نان}. هذا هو كل شيء حسن وجيد، ولكن في حالتي أنا كنت تفضل بدلا من ذلك مجرد ترك لهم كما صفر المتجهات.

وإضافة هذا الرمز إلى مشروعي تمكين طريقة التمديد لطيف:

using ExtensionMethods;

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static Vector2 NormalizeOrZero(this Vector2 v2)
        {
            if (v2 != Vector2.Zero)
                v2.Normalize();
            return v2;
        }
    }
}

ولسوء الحظ، هذا الأسلوب <م> عودة ناقلات تطبيع، بدلا من مجرد تطبيع ناقلات التي يمكنني استخدامها لاستدعاء هذا الأسلوب التمديد. أود أن بدلا من ذلك تتصرف ك <م> vector2Instance .Normalize () لا.

وبصرف النظر عن جعل هذا الفراغ، كيف يمكنني ضبط هذا بحيث يتم تعديل 'V2؟ (في الأساس، وأنا بحاجة إلى الوصول إلى 'هذا' الكائن، أو أحتاج 'V2' لتمريرها حسب المرجع.)

وتحرير:

ونعم، لقد حاول هذا:

    public static void NormalizeOrZero(this Vector2 v2)
    {
        if (v2 != Vector2.Zero)
            v2.Normalize();
    }

ولا يعمل، V2 هو مجرد متغير في نطاق NormalizeOrZero.

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

المحلول

وهذا لا يعمل بسبب المتجهات 2 هو في الواقع بنية . وهذا يعني يحصل تمريرها من حيث القيمة ولا يمكنك تعديل نسخة المتصل. أعتقد أن أفضل ما يمكنك القيام به هو الحل المحدد من قبل lomaxxx.

وهذا يوضح لماذا يجب تجنب عادة باستخدام الهياكل. انظر هذا السؤال للحصول على مزيد من المعلومات. Vector2 ينتهك المبدأ التوجيهي الذي البنيات ينبغي أن يكون غير قابل للتغيير، ولكن ربما من المنطقي أن تفعل ذلك في سياق XNA.

نصائح أخرى

حسنا، إذا كنت حقا فقط <م> الموت للقيام بذلك، يمكنك أن تفعل شيئا من هذا القبيل:

public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
    if (v2 != Vector2.Zero)
        v2.Normalize();
}

وأنت سوف يطلق عليه بهذه الطريقة:

v2.NormalizeOrZero(ref v2);

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

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

Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();

وأنت في حاجة كل من ref ومعدل this على حجة، والذي يبدو من غير المرجح أن تنجح.

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