سؤال

انا إجراء مكالمة:

myResult = MakeMyCall(inputParams, out messages);

لكنني في الواقع لا يهتمون الرسائل.إذا كان إدخال المعلمة لم أهتم أنا فقط تمرير null.إذا كان عودة لم أهتم كنت مجرد ترك ذلك قبالة.

هل هناك طريقة للقيام بشيء مماثل مع الخروج, أو هل أنا بحاجة إلى تعريف متغير ثم تجاهل ؟

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

المحلول

وبدءا C # 7.0، فمن الممكن لتجنب predeclaring من المعلمات وكذلك تجاهلها.

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

public void PrintXCoordinate(Point p)
{
    p.GetCoordinates(out int x, out _); // I only care about x
    WriteLine($"{x}");
}

المصدر: الشبكي : //blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/

نصائح أخرى

لديك تعريف متغير التي سوف ثم تجاهل. هذا هو الحال مع TryParse (أو TryWhatever) نمط، عندما يتم استخدامها لاختبار صلاحية إدخال المستخدم (على سبيل المثال، يمكن أن يكون تحليل كرقم؟) دون أي اهتمام حول القيمة الفعلية تحليل الأكثر شيوعا.

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

ومما يؤسف له هل هناك حاجة لتمرير شيء لأنه مطلوب طريقة لتحديد ذلك. لذلك لا يمكنك إرسال null لأن الأسلوب، ويجري المطلوبة لتعيينها، فإن تفجير.

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

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

وبعد ذلك يمكنك الاتصال Other_MakeMyCall دون الحاجة إلى عزف مع المعلمات out كنت لا تحتاج إليها.

إذا تم التصريح عن وظيفة الأصلي كما يلي:

class C
{
    public Result MakeMyCall(Object arg, out List<String> messages);
}

ويمكنك الإعلان عن طريقة تمديد مثل هذا:

static class CExtension
{
    public static Result MakeMyCall(this C obj, Object arg)
    {
        List<String> unused;
        return obj.MakeMyCall(arg, out unused);
    }
}

وطريقة التمديد سوف تتصرف مثل الحمل الزائد الذي يجعل المعلمة خارج اختياري.

ووالتحويل البرمجي Visual Basic يفعل ذلك عن طريق إنشاء متغير وهمية. C # يمكن أن يفعل ذلك، إذا كنت تستطيع ان تقنع شركة مايكروسوفت فكرة جيدة.

إذا كانت فئة من messages تنفذ IDisposable, لا يجب تجاهله.النظر في ما يشبه النهج التالي (قد لا تكون عبارة صحيحة منذ أنا لم أكتب C# في كل حين):

using (FooClass messages) {
    myResult = MakeMyCall(inputParams, messages);
}

مرة واحدة خارج using كتلة ، messages سيتم التخلص منها تلقائيا.

ويجب تمرير متغير للمعلمة خارج. لم يكن لديك لتهيئة المتغير قبل تمريرها:

MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages); 

وعادة، يمكنك فقط تجاهل "الرسائل" بعد المكالمة - ما لم الاحتياجات "الرسائل" التصرف لسبب ما، مثل استخدام موارد النظام محدودة، وفي هذه الحالة يجب عليك الاتصال تخلص ():

messages.Dispose();

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

messages = null; // Allow GC to reclaim memory for reference type.

messages = new MyMessageType(); // Allow GC to reclaim memory for value type.

في هذه الحالة جعلت طريقة تمديد عام لConcurrentDictionary التي لا يوجد لديه طريقة حذف أو إزالة.

//Remove item from list and ignore reference to removed item
public static void TryRemoveIgnore<K,T>(this ConcurrentDictionary<K,T> dictionary, K key)
{
    T CompletelyIgnored;
    dictionary.TryRemove(key, out CompletelyIgnored);
}

عند استدعائه من مثيل ConcurrentDictionary:

ClientList.TryRemoveIgnore(client.ClientId);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top