खोज…


टिप्पणियों

dynamic कीवर्ड एक वैरिएबल घोषित करता है जिसका प्रकार संकलन समय पर ज्ञात नहीं है। एक dynamic चर में कोई भी मूल्य हो सकता है, और रनटाइम के दौरान मूल्य का प्रकार बदल सकता है।

जैसा कि पुस्तक "मेटाप्रोग्रामिंग .NET में" में उल्लेख किया गया है, C # में dynamic कीवर्ड के लिए एक बैकिंग प्रकार नहीं है:

dynamic कीवर्ड द्वारा सक्षम कार्यक्षमता कंपाइलर क्रियाओं का एक चतुर सेट है जो स्थानीय निष्पादन क्षेत्र के साइट कंटेनर में CallSite ऑब्जेक्ट का उत्सर्जन और उपयोग CallSite है। कंपाइलर प्रोग्रामर्स को उन CallSite इंस्टेंस के माध्यम से डायनामिक ऑब्जेक्ट रेफरेंस के रूप में अनुभव करता है। पैरामीटर, रिटर्न प्रकार, फ़ील्ड, और गुण जो संकलन समय पर गतिशील उपचार प्राप्त करते हैं, उन्हें यह इंगित करने के लिए कुछ मेटाडेटा के साथ चिह्नित किया जा सकता है कि वे गतिशील उपयोग के लिए उत्पन्न हुए थे, लेकिन उनके लिए अंतर्निहित डेटा प्रकार हमेशा System.Object

एक गतिशील चर बनाना

dynamic foo = 123;
Console.WriteLine(foo + 234);
// 357    Console.WriteLine(foo.ToUpper())
// RuntimeBinderException, since int doesn't have a ToUpper method

foo = "123";
Console.WriteLine(foo + 234);
// 123234
Console.WriteLine(foo.ToUpper()):
// NOW A STRING

लौटकर गतिशील

using System;

public static void Main()
{
    var value = GetValue();
    Console.WriteLine(value);
    // dynamics are useful!
}

private static dynamic GetValue()
{
    return "dynamics are useful!";
}

गुणों के साथ एक गतिशील वस्तु का निर्माण

using System;
using System.Dynamic;

dynamic info = new ExpandoObject();
info.Id = 123;
info.Another = 456;

Console.WriteLine(info.Another);
// 456

Console.WriteLine(info.DoesntExist);
// Throws RuntimeBinderException

संकलित समय पर अज्ञात प्रकार से निपटने

निम्नलिखित आउटपुट समकक्ष परिणाम:

class IfElseExample
{
    public string DebugToString(object a)
    {
        if (a is StringBuilder)
        {
            return DebugToStringInternal(a as StringBuilder);
        }
        else if (a is List<string>)
        {
            return DebugToStringInternal(a as List<string>);
        }
        else
        {
            return a.ToString();
        }
    }

    private string DebugToStringInternal(object a)
    {
        // Fall Back
        return a.ToString();
    }

    private string DebugToStringInternal(StringBuilder sb)
    {
        return $"StringBuilder - Capacity: {sb.Capacity}, MaxCapacity: {sb.MaxCapacity}, Value: {sb.ToString()}";
    }

    private string DebugToStringInternal(List<string> list)
    {
        return $"List<string> - Count: {list.Count}, Value: {Environment.NewLine + "\t" + string.Join(Environment.NewLine + "\t", list.ToArray())}";
    }
}

class DynamicExample
{
    public string DebugToString(object a)
    {
        return DebugToStringInternal((dynamic)a);
    }

    private string DebugToStringInternal(object a)
    {
        // Fall Back
        return a.ToString();
    }

    private string DebugToStringInternal(StringBuilder sb)
    {
        return $"StringBuilder - Capacity: {sb.Capacity}, MaxCapacity: {sb.MaxCapacity}, Value: {sb.ToString()}";
    }

    private string DebugToStringInternal(List<string> list)
    {
        return $"List<string> - Count: {list.Count}, Value: {Environment.NewLine + "\t" + string.Join(Environment.NewLine + "\t", list.ToArray())}";
    }
}

डायनेमिक का लाभ, एक नए प्रकार को जोड़ने के लिए है बस नए प्रकार के DebugToStringInternal के अधिभार को जोड़ने के लिए आवश्यक है। साथ ही इसे टाइप करने के लिए मैन्युअल रूप से डालने की आवश्यकता को भी समाप्त करता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow