উত্তর:
এখনও পর্যন্ত অন্যান্য উত্তরগুলি সমস্ত সঠিক; আমি আরও কিছু যোগ করতে চেয়েছিলাম যা কিছুটা পরিষ্কার:
v2 = v1 ?? default(int);
যে কোনও Nullable<T>
এটির মধ্যে স্পষ্টত রূপান্তরিত হয় T
, প্রদত্ত যে পুরো অভিব্যক্তিটি মূল্যায়ন করা কখনই কোনও মান টাইপকে নাল বরাদ্দ করতে পারে না। সুতরাং, নাল-কোলেসিং অপারেটর ??
কেবল টের্নারি অপারেটরের জন্য সিনট্যাক্স চিনির মতো:
v2 = v1 == null ? default(int) : v1;
... যা যদি / অন্যথায় সিনট্যাক্স চিনির পরিবর্তে হয়:
if(v1==null)
v2 = default(int);
else
v2 = v1;
এছাড়াও .NET 4.0 হিসাবে, Nullable<T>
একটি "গেটভ্যালিউআরডিফল্ট ()" পদ্ধতি রয়েছে, যা মূলত উপরের দেখানো নাল-কোলেসিং সম্পাদন করে এমন একটি নাল-সেফ গিটার, সুতরাং এটিও কাজ করে:
v2 = v1.GetValueOrDefault();
default(int)
সত্যিই প্রয়োজন? সিম্পল এর সাথে দোষ কি 0
?
default
উপযুক্ত যেখানে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে । জিরো সর্বদা মান হিসাবে বৈধ নয়, ডিফল্টের চেয়ে অনেক কম, সুতরাং আপনি যদি জেনেরিকের int
সাথে প্রতিস্থাপন করেন তবে T
আমার কোডটি শূন্যের সাথে কাজ না করে দেখতে পাবেন। কিছু ভবিষ্যতের কাঠামো সংস্করণে default
ওভারলোডযোগ্যও হতে পারে; যদি এবং যখন এটি ঘটে তখন ডিফল্ট ব্যবহার করে কোডগুলি সহজেই সুবিধা নিতে সক্ষম হবে, যখন সুস্পষ্ট নাল বা শূন্য কার্যাদি পরিবর্তন করতে হবে।
এটার মত,
if(v1.HasValue)
v2=v1.Value
আপনি অ্যাসাইনমেন্টের জন্য মান সম্পত্তি ব্যবহার করতে পারেন।
v2 = v1.Value;
v1.HasValue
আগে চেক করতে ভুলবেন না ।
আপনি যদি জানেন যে v1
এর কোনও মূল্য রয়েছে তবে আপনি Value
সম্পত্তিটি ব্যবহার করতে পারেন :
v2 = v1.Value;
GetValueOrDefault
পদ্ধতিটি ব্যবহার করা হলে মানটি নির্ধারিত হবে, অন্যথায় টাইপের জন্য ডিফল্ট, বা আপনি যে ডিফল্ট মানটি নির্দিষ্ট করেছেন:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
আপনি কোনও মান আছে HasValue
কিনা v1
তা পরীক্ষা করতে সম্পত্তিটি ব্যবহার করতে পারেন :
if (v1.HasValue) {
v2 = v1.Value;
}
GetValueOrDefault(T)
পদ্ধতিটির জন্য ভাষা সমর্থনও রয়েছে :
v2 = v1 ?? -1;
V1 নাল থাকলে আপনি এটি করতে পারবেন না তবে আপনি কোনও অপারেটরের সাথে চেক করতে পারেন।
v2 = v1 ?? 0;
GetValueOrDefault()
বস্তুর মান পুনরুদ্ধার করে। যদি এটি নাল হয় তবে এটি int এর ডিফল্ট মান প্রদান করে যা 0 হয়।
উদাহরণ:
v2= v1.GetValueOrDefault();
যদি প্রদত্ত প্রকারের জন্য ডিফল্ট মানটি গ্রহণযোগ্য ফলাফল হয়:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
ফলাফল অপরিজ্ঞাতিত হলে আপনি যদি অন্য কোনও ডিফল্ট মান চান:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
আপনি যদি কেবল মানটি ফেরত চান (পদ্ধতিটি ব্যর্থ হয়েছে বা না তা বিবেচনা করে না):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()
কোনও পরীক্ষা ছাড়াই মাঠের মান প্রদান করে।
যতদূর আমি উদ্বিগ্ন হ'ল সর্বোত্তম সমাধান GetValueOrDefault()
পদ্ধতিটি ব্যবহার করা ।
v2 = v1.GetValueOrDefault();
ইনট রূপান্তরকরণের জন্য nullable int এর মত কাজ করা যেতে পারে:
v2=(int)v1;
এটা সম্ভব v2 = Convert.ToInt32(v1);
আপনি করতে পারেন
v2 = v1.HasValue ? v1.Value : v2;
এর মধ্যে একটি সহজ রূপান্তর v1
এবং v2
কারণ সম্ভব নয় v1
চেয়ে মূল্যবোধের একটি বৃহত্তর ডোমেইন হয়েছে v2
। এটি সবকিছুই রাষ্ট্রকে v1
ধরে রাখতে পারে null
। রূপান্তর করার জন্য আপনাকে স্পষ্ট করে বলতে int
হবে যে মানটি null
রাজ্যের মানচিত্রে ব্যবহৃত হবে । এটি করার সহজ উপায় ??
অপারেটর
v2 = v1 ?? 0; // maps null of v1 to 0
এটি দীর্ঘ আকারেও করা যেতে পারে
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
আপনার ব্যবহারের প্রসঙ্গে, আপনি সি # 7 এর প্যাটার্ন-ম্যাচিং বৈশিষ্ট্যটি ব্যবহার করতে পারেন:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
যেহেতু কিছু লোক কোনও ব্যাখ্যা না রেখেই নিম্নচাপ করছে, তাই এটিকে একটি কার্যকর সমাধান হিসাবে যুক্ত করার যুক্তি ব্যাখ্যা করার জন্য আমি কিছু বিশদ যুক্ত করতে চাই।
সি # 7 এর প্যাটার্নের মিলটি এখন আমাদের কোনও মানের প্রকারটি পরীক্ষা করতে এবং এটিকে স্পষ্টভাবে কাস্ট করতে দেয়। উপরের স্নিপেটে, যদি-শর্তটি কেবল তখনই পাস হবে যখন সঞ্চিত মানটি v1
টাইপের সাথে সামঞ্জস্যপূর্ণ হয় v2
, যা এই ক্ষেত্রে int
। এটি অনুসরণ করে যে যখন মানটির জন্য v1
হয় null
, তবে-শর্তটি ব্যর্থ হবে যেহেতু নালকে একটি বরাদ্দ করা যায় না int
। আরও সঠিকভাবে, null
একটি নয় int
।
আমি হাইলাইট করতে চাই যে এই সমাধানটি সর্বদা অনুকূল পছন্দ নাও হতে পারে। আমার পরামর্শ অনুসারে, আমি বিশ্বাস করি এটি বিকাশকারীর সঠিক ব্যবহারের প্রসঙ্গে নির্ভর করবে। যদি আপনার ইতিমধ্যে একটি রয়েছে int?
এবং শর্তসাপেক্ষে যদি এর মানটি চালিত করতে চান কেবলমাত্র এবং যদি- নির্ধারিত মানটি শূন্য না হয় (কোনও তথ্যই না হারিয়ে কোনও নিয়মিত ইন-তে রূপান্তর করা নিরাপদ তবে এটিই নিরাপদ), তারপরে প্যাটার্ন ম্যাচিং সম্ভবত এটির সবচেয়ে সংক্ষিপ্ত উপায়।
HasValue
চেকগুলি দুর্ঘটনাক্রমে রিফ্যাক্ট করার কোনও ঝুঁকি নেই ।
সি # .1.১ এবং তারপরে অপারেটরের পরিবর্তে default
আক্ষরিক ব্যবহার করে টাইপটি অনুমান করা যায় যাতে এটি নীচে লেখা যায়:default
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
হয়null
?