ডিফল্ট কি (বস্তু); সি # তে করেন?


133

গুগলিং কেবল কীওয়ার্ড নিয়ে আসবে, তবে আমি এমন কিছু কোড জুড়ে গিয়েছি যা বলে

MyVariable = default(MyObject);

এবং আমি ভাবছি এর অর্থ কী।

উত্তর:


189
  • একটি রেফারেন্স-টাইপের জন্য, এটি ফিরে আসে null
  • মান-প্রকারের জন্য অন্যটি Nullable<T>শূন্য-আরম্ভের মানটি প্রদান করে
  • এর জন্য Nullable<T>এটি খালি (সিউডো-নাল) মান প্রদান করে (আসলে এটি প্রথম বুলেটটির পুনরায় বিবৃতি, তবে এটি এটিকে স্পষ্ট করে তোলার পক্ষে মূল্যবান)

এর সর্বাধিক ব্যবহার default(T)হ'ল জেনেরিক্স এবং Try...প্যাটার্নের মতো জিনিসগুলি :

bool TryGetValue(out T value) {
    if(NoDataIsAvailable) {
        value = default(T); // because I have to set it to *something*
        return false;
    }
    value = GetData();
    return true;
}

এটি হ'ল, আমি এটি কিছু কোড-জেনারেশনেও ব্যবহার করি, যেখানে ক্ষেত্রগুলি / ভেরিয়েবলগুলি আরম্ভ করার জন্য এটি ব্যথা হয় - তবে আপনি যদি টাইপটি জানেন তবে:

bool someField = default(bool);
int someOtherField = default(int)
global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType);

1
যদি আমি class Fooসম্পত্তি দিয়ে তৈরি int n। আমি কি defaultএটির পরিবর্তে "ওভারলোড" সেট nকরতে পারি ? 50
প্রতীক দেওঘরে

4
@ মেশিন চারার: ​​না। আপনি ওভারলোড করতে পারবেন না default
জেফ ইয়েটস

নয় int foo = default(int);একই ছিল int foo;? অর্থাৎ ইনিটলাইজড ইনসটি ডিফল্ট হিসাবে একই মান থাকার জন্য নয় default(int)?
আদম পার্কিন

1
@ অ্যাডাম পারকিন যা আপনি ক্ষেত্র বনাম স্থানীয়দের বিষয়ে কথা বলছেন কিনা তার উপর নির্ভর করে; হ্যাঁ, ক্ষেত্রগুলি শূন্য-ডি স্পেসে আরম্ভ হয়, একইরকম default(...); স্থানীয়দের নেই (যদিও টেকনিক্যালি, ডিফল্ট মান .locals initযে তারা আবার শূন্য ডিফল্ট করবে আইএল মানে, কিন্তু আপনি পালন করা অনিরাপদ মেকানিজম ব্যবহার করতে হবে)
মার্ক Gravell

"এটি খালি (psuedo-null) মানটি ফেরত দেয় ... এটি কি? মনে হচ্ছে বাক্যটি শেষ হয়নি

14

defaultকীওয়ার্ড nullরেফারেন্স ধরণের এবং zeroসংখ্যাসূচক মানের ধরণের জন্য ফিরে আসবে ।

জন্য structS, এটা struct প্রতিটি সদস্য কিনা তারা মান বা রেফারেন্স ধরনের উপর নির্ভর করে শূন্য বা নাল সক্রিয়া ফিরে আসবে।

এমএসডিএন থেকে

Simple Sample code :<br>
    class Foo
    {
        public string Bar { get; set; }
    }

    struct Bar
    {
        public int FooBar { get; set; }
        public Foo BarFoo { get; set; }
    }

    public class AddPrinterConnection
    {
        public static void Main()
        {

            int n = default(int);
            Foo f = default(Foo);
            Bar b = default(Bar);

            Console.WriteLine(n);

            if (f == null) Console.WriteLine("f is null");

            Console.WriteLine("b.FooBar = {0}",b.FooBar);

            if (b.BarFoo == null) Console.WriteLine("b.BarFoo is null");

        }
    }

আউটপুট:

0
f is null
b.FooBar = 0
b.BarFoo is null

3

এর ডিফল্ট মান MyObjectজেনেরিক কোড (সি # প্রোগ্রামিং গাইড) (এমএসডিএন) এ ডিফল্ট কীওয়ার্ডটি দেখুন :

জেনেরিক ক্লাস এবং পদ্ধতিগুলিতে একটি সমস্যা দেখা দেয় যে আপনি যখন আগে থেকে নিম্নলিখিতগুলি জানতেন না তখন কীভাবে প্যারামিটারাইজড টাইপ টিতে ডিফল্ট মান নির্ধারণ করতে হয়:

  • টি কিনা রেফারেন্স টাইপ বা মান ধরণের হবে।
  • যদি টি একটি মান প্রকার হয় তবে এটি একটি সংখ্যাসূচক মান বা কাঠামো হবে।

একটি প্যারামিটারাইজড টাইপ টির একটি ভেরিয়েবল টি দেওয়া, t = null স্টেটমেন্টটি কেবলমাত্র বৈধ যদি টি একটি রেফারেন্স টাইপ হয় এবং t = 0 কেবল সংখ্যাগত মানের জন্য কাজ করবে তবে স্ট্রাক্টের জন্য নয়। সমাধানটি হ'ল ডিফল্ট কীওয়ার্ডটি ব্যবহার করুন যা রেফারেন্স ধরণের জন্য শূন্য এবং সংখ্যাগত মানের ধরণের জন্য শূন্য ফিরে আসবে। স্ট্রাক্টগুলির জন্য, এটি স্ট্রাক্টের প্রতিটি সদস্য শূন্য বা শূন্যে ফেরত দেবে সেগুলি মান বা রেফারেন্স ধরণের কিনা তার উপর নির্ভর করে। জেনারিকলিস্ট শ্রেণীর নিম্নলিখিত উদাহরণটি কীভাবে ডিফল্ট কীওয়ার্ডটি ব্যবহার করতে হয় তা দেখায়। আরও তথ্যের জন্য, জেনারিকস ওভারভিউ দেখুন।

public class GenericList<T>
{
    private class Node
    {
        //...

        public Node Next;
        public T Data;
    }

    private Node head;

    //...

    public T GetNext()
    {
        T temp = default(T);

        Node current = head;
        if (current != null)
        {
            temp = current.Data;
            current = current.Next;
        }
        return temp;
    }
}

2

প্রকারের প্যারামিটারের ডিফল্ট মান নির্দিষ্ট করে reference এটি রেফারেন্স ধরণের জন্য বাতিল এবং মান ধরণের শূন্য হবে।

ডিফল্ট দেখুন


1

defaultশব্দ আয় "ডিফল্ট" বা অনুরোধ ধরনের একটি পরিবর্তনশীল জন্য "খালি" মান।

সমস্ত রেফারেন্স প্রকার (সংজ্ঞায়িত জন্য class, delegate, ইত্যাদি), এই হল null। মান প্রকার (সংজ্ঞায়িত জন্য struct, enumইত্যাদি) এটা একটি সম্পূর্ণ শূণ্যসমূহ মান (উদাহরণস্বরূপ, int 0, DateTime 0001-01-01 00:00:00, ইত্যাদি)।

এটি বেশিরভাগ জেনেরিক কোড সহ ব্যবহৃত হয় যা রেফারেন্স এবং মান উভয় প্রকারের ক্ষেত্রেই প্রয়োগ করা যেতে পারে, কারণ আপনি nullকোনও মান ধরণের ভেরিয়েবলকে বরাদ্দ করতে পারবেন না ।


0

এটি কোনও ভেরিয়েবলের জন্য কোনও অবজেক্টের ডিফল্ট মান সেট করবে: রেফারেন্স ধরণের জন্য নাল এবং মান প্রকারের জন্য 0।


0

সম্ভবত এটি আপনাকে সাহায্য করতে পারে:

using System;
using System.Collections.Generic;
namespace Wrox.ProCSharp.Generics
{
    public class DocumentManager < T >
    {
        private readonly Queue < T > documentQueue = new Queue < T > ();
        public void AddDocument(T doc)
        {
            lock (this)
            {
                documentQueue.Enqueue(doc);
            }
        }

        public bool IsDocumentAvailable
        {
            get { return documentQueue.Count > 0; }
        }
    }
}

জেনেরিক ধরণের ক্ষেত্রে নাল নির্ধারণ করা সম্ভব নয়। কারণটি হ'ল জেনেরিক প্রকারটিকে মান ধরণের হিসাবেও ইনস্ট্যান্ট করা যেতে পারে এবং কেবলমাত্র রেফারেন্স ধরণের সাথে নাল অনুমোদিত allowed এই সমস্যা থেকে রক্ষা পেতে আপনি ডিফল্ট কীওয়ার্ডটি ব্যবহার করতে পারেন। ডিফল্ট কীওয়ার্ড সহ নালকে রেফারেন্স টাইপগুলিতে বরাদ্দ করা হয় এবং 0 টি মান ধরণের ক্ষেত্রে বরাদ্দ করা হয়।

public T GetDocument()
{
    T doc = default(T);
    lock (this)
    {
        doc = documentQueue.Dequeue();
    }
    return doc;
}

ডিফল্ট কীওয়ার্ডটি যেখানে ব্যবহৃত হয়েছে সেই প্রসঙ্গে তার একাধিক অর্থ রয়েছে। স্যুইচ স্টেটমেন্টটি ডিফল্ট কেসটি সংজ্ঞায়িত করার জন্য একটি ডিফল্ট ব্যবহার করে এবং জেনেরিকের সাথে জেনেরিক ধরণের প্রারম্ভিক করতে ডিফল্টটি কোনও নাল বা 0 ব্যবহার করে যদি এটি কোনও রেফারেন্স বা মান প্রকার হয় তার উপর নির্ভর করে ব্যবহৃত হয়।


0

জেনেরিক টাইপ পরামিতিগুলিকে রেফারেন্স টাইপ হিসাবে সীমাবদ্ধ করার জন্য যখন বাধা প্রয়োগ করা হয়নি, তখন স্ট্রাকের মতো একটি মানের ধরণটিও পাস করা যেতে পারে। এই জাতীয় ক্ষেত্রে, পরামিতি প্রকারের তুলনায় নাল সর্বদা মিথ্যা হবে , কারণ একটি কাঠামো খালি থাকতে পারে, তবে কখনই শূন্য হয় না

ভুল কোড

public void TestChanges<T>(T inputValue)

            try
            {
                if (inputValue==null)
                    return;
                //operation on inputValue

           }
            catch
            {
                // ignore this.
            }
        }

সংশোধিত

public void TestChanges<T>(T inputValue)

            try
            {
                if (object.Equals(inputValue, default(T)) )
                    return;
                //operation on inputValue

           }
            catch
            {
                // ignore this.
            }
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.