C # nullable int কে কীভাবে রূপান্তর করবেন


482

আমি কিভাবে nullable এ কনভার্ট করব intএকটি থেকে int? ধরুন আমার কাছে নীচের মতো 2 প্রকারের ইনট রয়েছে:

int? v1;  
int v2; 

আমি v1এর মান নির্ধারণ করতে চাই v2v2 = v1;একটি ত্রুটি ঘটায়। আমি কিভাবে কনভার্ট করব v1করার v2?


কাঙ্ক্ষিত আচরণ কখন v1হয় null?
সলোমন উকো

উত্তর:


636

এখনও পর্যন্ত অন্যান্য উত্তরগুলি সমস্ত সঠিক; আমি আরও কিছু যোগ করতে চেয়েছিলাম যা কিছুটা পরিষ্কার:

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();

4
হয় default(int)সত্যিই প্রয়োজন? সিম্পল এর সাথে দোষ কি 0?
কোল জনসন

4
এটি এই উদাহরণের জন্য কাজ করবে, তবে সাধারণ ক্ষেত্রে এটি defaultউপযুক্ত যেখানে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে । জিরো সর্বদা মান হিসাবে বৈধ নয়, ডিফল্টের চেয়ে অনেক কম, সুতরাং আপনি যদি জেনেরিকের intসাথে প্রতিস্থাপন করেন তবে Tআমার কোডটি শূন্যের সাথে কাজ না করে দেখতে পাবেন। কিছু ভবিষ্যতের কাঠামো সংস্করণে defaultওভারলোডযোগ্যও হতে পারে; যদি এবং যখন এটি ঘটে তখন ডিফল্ট ব্যবহার করে কোডগুলি সহজেই সুবিধা নিতে সক্ষম হবে, যখন সুস্পষ্ট নাল বা শূন্য কার্যাদি পরিবর্তন করতে হবে।
কিথস

5
এটি শীর্ষে উঠতে হবে: .NET 4.0, নুলাবল <T> এর একটি "getValueOrDefault ()" রয়েছে
র্যান্ডমহ্যান্ডল

GetValueOrDefault দিয়ে এটি সম্পাদনা করতে ফিরে আসার জন্য ধন্যবাদ!
সিন্ডিএইচ

আপনি যখন ডিফল্ট ব্যবহার করেন তখন ডেটটাইম সম্পর্কে সতর্কতা অবলম্বন করতে পারেন। এটি খালি পরিবর্তে ডিফল্ট তারিখ সন্নিবেশ করতে পারে।
রানচ কমল


92

আপনি অ্যাসাইনমেন্টের জন্য মান সম্পত্তি ব্যবহার করতে পারেন।

v2 = v1.Value;

8
এছাড়াও - আপনি যদি নিশ্চিত হন না যে ভি 1-এ নাল রয়েছে - আপনি ফালব্যাক মান সেট করতে নাল-কোয়েলসিং অপারেটরটি ব্যবহার করতে পারেন। যেমন v2 = v1 ?? 0;
আরজেন

12
এবং v1.HasValueআগে চেক করতে ভুলবেন না ।
ইয়াক

3
দুটিই MSDN বলছেন, যদি এই একটি ব্যতিক্রম নিক্ষেপ করা হবে v1হয় null। আমার মতে, এটি সঠিক উত্তর নয়।
ভেন্টিসিস

6
@ এন্টিসিস আমি এটি পছন্দসই আচরণ বলে মনে করব - আমি অবাক হয়েছি অন্য অনেক উত্তর নীরবে 0 টি নূলে রূপান্তরিত করার সাথে ঠিক আছে, আপনি যদি একটি নলাবদ্ধ টাইপকে একটি নন-অকেজো টাইপ হিসাবে নির্ধারণ করেন তবে আপনার অবশ্যই নিশ্চিত হওয়া উচিত মানটি আসলে নাল নয়। ওপি "V2 কে v2 নির্ধারণ করতে চাই, বা v1 যদি নাল হয় তবে 0 বলতে চাইনি" বলেছিলেন না, তবে প্রত্যেকেই ধরে নিয়েছে বলে মনে করেন
মাইকেল মরোজেক


49

আপনি যদি জানেন যে 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;

প্রথমে কোনও মান আছে কিনা তা পরীক্ষা করে দেখে আপনাকে মানটি ব্যবহার করা উচিত নয়। ব্যবহার ?? পরিবর্তে অপারেটর।
পিটার


28

GetValueOrDefault()

বস্তুর মান পুনরুদ্ধার করে। যদি এটি নাল হয় তবে এটি int এর ডিফল্ট মান প্রদান করে যা 0 হয়।

উদাহরণ:

v2= v1.GetValueOrDefault();


21

যদি প্রদত্ত প্রকারের জন্য ডিফল্ট মানটি গ্রহণযোগ্য ফলাফল হয়:

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()কোনও পরীক্ষা ছাড়াই মাঠের মান প্রদান করে।






9

এর মধ্যে একটি সহজ রূপান্তর 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;
}

9

আপনার ব্যবহারের প্রসঙ্গে, আপনি সি # 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চেকগুলি দুর্ঘটনাক্রমে রিফ্যাক্ট করার কোনও ঝুঁকি নেই ।
খনি 21

আমি এই পদ্ধতিটির কোনও v1.HasValue হিসাবে চেক হিসাবে এবং তারপরে অন্তর্নিহিত মানটি অ্যাক্সেস করতে v1.Value এর মাধ্যমে কোনও সুবিধা দেখতে পাচ্ছি না। আমি এটিকে হ্রাস করব না, তবে আমি মনে করি এই সমস্যাটি ইতিমধ্যে সমাধান হয়ে গেছে এবং একটি নতুন কৌশল সমস্যার সাথে আরও স্পষ্টতা যুক্ত করে না। আমি এটিকে 8-9% ধীর হিসাবে চিহ্নিত করেছি mar
ব্র্যান্ডন বার্কলে

এটি বেঞ্চমার্কিংয়ের জন্য ধন্যবাদ, জানার অপেক্ষা রাখে না! যেভাবেই আপনি এটি তাকান, পার্থক্য সর্বোপরি প্রান্তিক (যদি আপনি কিছু সময়ের সমালোচনামূলক ক্ষেত্রে এটি অনুমান না করেন তবে)। আমি এটি আরও "সংক্ষিপ্ত" বা সম্ভবত "আইডোমেটিক" হিসাবে দেখছি কারণ এটি এপিআইয়ের পরিবর্তে ভাষায় বেকড সিনট্যাক্স সুগারগুলিতে নির্ভর করে। এটি কিছুটা বিষয়গত, তবে সম্ভবত এটি "আরও রক্ষণাবেক্ষণযোগ্য"। যদিও সত্যই, আমি এই পদ্ধতিকে অনেক উত্তর উত্তর হিসাবে পরামর্শ হিসাবে একটি ডিফল্ট মান উপর নির্ভর করে বেশি পছন্দ করি।
নিকোলাস মিলার

3

এটা মান নির্ধারণ করবে v1করার v2যদি এটা নাল নয়, অন্যথায় এটা শূন্য হিসাবে ডিফল্ট মান গ্রহণ করা হবে।

v2=v1??0

বা নীচে এটি লেখার অন্য উপায়।

v2 = v1.HasValue?v1:0


-1
 int v2= Int32.Parse(v1.ToString());

5
এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে সে সম্পর্কে অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
xiawi

1
আন্ডারহ্যান্ডেড ট্রিকস ব্যবহার না করে বিকল্পগুলি আন-মোড়ক করার জন্য "সেরা অনুশীলন" পদ্ধতিটি ব্যবহার করা আরও ভাল। রেফারেন্সের জন্য ডকস.মাইক্রোসফট.এইন
ডটনেট

আট বছরের পুরনো প্রশ্নের উত্তরটি যখন পনেরটি বিদ্যমান উত্তরের সাথে উত্তর দিয়ে থাকে তখন আপনার উত্তরটি প্রশ্নের উত্তরটি কী উত্তর দিচ্ছে তা ব্যাখ্যা করা গুরুত্বপূর্ণ, এবং সময়ের সাথে সাথে উত্তরটি পরিবর্তন হয়েছে কিনা তা লক্ষণীয়। কোডের উত্তরগুলি প্রায়শই কিছু ব্যাখ্যা সংযোজন করে উন্নত করা যায়।
জেসন অ্যালার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.