উত্তর:
nullNullable<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);
default।
int foo = default(int);একই ছিল int foo;? অর্থাৎ ইনিটলাইজড ইনসটি ডিফল্ট হিসাবে একই মান থাকার জন্য নয় default(int)?
default(...); স্থানীয়দের নেই (যদিও টেকনিক্যালি, ডিফল্ট মান .locals initযে তারা আবার শূন্য ডিফল্ট করবে আইএল মানে, কিন্তু আপনি পালন করা অনিরাপদ মেকানিজম ব্যবহার করতে হবে)
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
এর ডিফল্ট মান 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;
}
}
defaultশব্দ আয় "ডিফল্ট" বা অনুরোধ ধরনের একটি পরিবর্তনশীল জন্য "খালি" মান।
সমস্ত রেফারেন্স প্রকার (সংজ্ঞায়িত জন্য class, delegate, ইত্যাদি), এই হল null। মান প্রকার (সংজ্ঞায়িত জন্য struct, enumইত্যাদি) এটা একটি সম্পূর্ণ শূণ্যসমূহ মান (উদাহরণস্বরূপ, int 0, DateTime 0001-01-01 00:00:00, ইত্যাদি)।
এটি বেশিরভাগ জেনেরিক কোড সহ ব্যবহৃত হয় যা রেফারেন্স এবং মান উভয় প্রকারের ক্ষেত্রেই প্রয়োগ করা যেতে পারে, কারণ আপনি nullকোনও মান ধরণের ভেরিয়েবলকে বরাদ্দ করতে পারবেন না ।
সম্ভবত এটি আপনাকে সাহায্য করতে পারে:
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 ব্যবহার করে যদি এটি কোনও রেফারেন্স বা মান প্রকার হয় তার উপর নির্ভর করে ব্যবহৃত হয়।
জেনেরিক টাইপ পরামিতিগুলিকে রেফারেন্স টাইপ হিসাবে সীমাবদ্ধ করার জন্য যখন বাধা প্রয়োগ করা হয়নি, তখন স্ট্রাকের মতো একটি মানের ধরণটিও পাস করা যেতে পারে। এই জাতীয় ক্ষেত্রে, পরামিতি প্রকারের তুলনায় নাল সর্বদা মিথ্যা হবে , কারণ একটি কাঠামো খালি থাকতে পারে, তবে কখনই শূন্য হয় না
ভুল কোড
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.
}
}
class Fooসম্পত্তি দিয়ে তৈরিint n। আমি কিdefaultএটির পরিবর্তে "ওভারলোড" সেটnকরতে পারি ?50