এখানে কী চলছে তা সম্পর্কে আমি একটি যুক্তিসঙ্গত অনুমান করতে পারি, তবে এটি কিছুটা জটিল :) এটি খসড়া স্পেসে বর্ণিত নাল অবস্থা এবং নাল ট্র্যাকিংয়ের সাথে জড়িত । মৌলিকভাবে, আমরা যে বিন্দুতে ফিরে আসতে চাইছি সেখানে সংকলক সতর্ক করবে যে যদি "নাল নয়" পরিবর্তে অভিব্যক্তিটির অবস্থা "সম্ভবত নাল" হয়।
এই উত্তরটি "এখানে" উপসংহারগুলি "না দিয়ে কিছুটা বর্ণনামূলক আকারে রয়েছে ... আমি আশা করি এটি সেভাবে আরও কার্যকর।
আমি ক্ষেত্রগুলি থেকে মুক্তি পেয়ে উদাহরণটিকে কিছুটা সহজ করতে যাচ্ছি, এবং এই দুটি স্বাক্ষরের একটি সহ একটি পদ্ধতি বিবেচনা করব:
public static string M(string? text)
public static string M(string text)
নীচের বাস্তবায়নে আমি প্রতিটি পদ্ধতিকে একটি আলাদা সংখ্যা দিয়েছি যাতে আমি নির্দিষ্ট উদাহরণগুলি স্পষ্টতই উল্লেখ করতে পারি। এটি বাস্তবায়নের সকলকে একই প্রোগ্রামে উপস্থিত হতে দেয়।
নীচে বর্ণিত প্রতিটি ক্ষেত্রে আমরা বিভিন্ন কাজ করব তবে ফিরে আসার চেষ্টা করব text- সুতরাং এটি textগুরুত্বপূর্ণ that's
শর্তহীন প্রত্যাবর্তন
প্রথমে আসুন এটি সরাসরি ফেরত দেওয়ার চেষ্টা করি:
public static string M1(string? text) => text; // Warning
public static string M2(string text) => text; // No warning
এতদূর, এত সহজ। পদ্ধতি শুরুতে প্যারামিটারের nullable রাষ্ট্র যদি এটা ধরনের এর "হয়তো নাল" হয় string?"নাল নয়" এবং এটি যদি ধরনের এর string।
সাধারণ শর্তসাপেক্ষে ফিরে আসা
এখন আসুন ifশর্তাবলীর মধ্যেই নালটি পরীক্ষা করা যাক । (আমি শর্তসাপেক্ষ অপারেটরটি ব্যবহার করব, যা আমি বিশ্বাস করি যে একই প্রভাব ফেলবে, তবে আমি প্রশ্নটির সত্যবাদী হতে চেয়েছিলাম))
public static string M3(string? text)
{
if (text is null)
{
return "";
}
else
{
return text; // No warning
}
}
public static string M4(string text)
{
if (text is null)
{
return "";
}
else
{
return text; // No warning
}
}
দুর্দান্ত, সুতরাং এটি একটি ifবিবৃতিতে দেখে মনে হচ্ছে যেখানে শর্তটি নিজেই শূন্যতার জন্য যাচাই করে, ifবিবৃতিটির প্রতিটি শাখার মধ্যে পরিবর্তকের অবস্থা আলাদা হতে পারে: elseব্লকের মধ্যে, উভয় কোডের কোডে রাজ্য "নাল নয়"। সুতরাং বিশেষত, এম 3-তে রাষ্ট্র "সম্ভবত নাল" থেকে "নাল নয়" তে পরিবর্তিত হয়।
স্থানীয় ভেরিয়েবলের সাথে শর্তসাপেক্ষ রিটার্ন
এখন স্থানীয় শর্তে সেই শর্তটি উত্তোলনের চেষ্টা করা যাক:
public static string M5(string? text)
{
bool isNull = text is null;
if (isNull)
{
return "";
}
else
{
return text; // Warning
}
}
public static string M6(string text)
{
bool isNull = text is null;
if (isNull)
{
return "";
}
else
{
return text; // Warning
}
}
এম 5 এবং এম 6 উভয়ই সতর্কতা জারি করে। সুতরাং কেবলমাত্র আমরা এম 5-তে "সম্ভবত নাল" থেকে "নাল নয়" থেকে রাষ্ট্র পরিবর্তনের ইতিবাচক প্রভাব পাই না (যেমন এম 3 তেও করেছি) ... আমরা এম 6-তে বিপরীত প্রভাব পেয়েছি , যেখানে রাজ্যটি " নাল নয় "থেকে" সম্ভবত নাল "। যা আমাকে সত্যিই অবাক করেছে।
সুতরাং দেখে মনে হচ্ছে আমরা এটি শিখেছি:
- রাষ্ট্রীয় তথ্য প্রচারের জন্য "স্থানীয় ভেরিয়েবলটি কীভাবে গণনা করা হয়েছিল" এর চারপাশে যুক্তি ব্যবহার করা হয় না। আরও পরে।
- একটি নাল তুলনা পরিচয় করিয়ে সংকলককে সতর্ক করতে পারে যে এটি পূর্বে যা কিছু শূন্য ছিল না বলে মনে হয়েছিল তা সর্বোপরি নਾਲ হতে পারে।
উপেক্ষিত তুলনার পরে শর্তহীন প্রত্যাবর্তন
আসুন এই বুলেট পয়েন্টগুলির দ্বিতীয়টি দেখুন, নিঃশর্ত ফেরতের আগে একটি তুলনা প্রবর্তন করে। (সুতরাং আমরা তুলনার ফলাফলটিকে সম্পূর্ণ উপেক্ষা করছি)):
public static string M7(string? text)
{
bool ignored = text is null;
return text; // Warning
}
public static string M8(string text)
{
bool ignored = text is null;
return text; // Warning
}
এম 8 এর মতো মনে হয় এম 2 এর সমতুল্য হওয়া উচিত - উভয়ের একটি নন-নাল প্যারামিটার রয়েছে যা তারা নিঃশর্ত ফিরে আসে - তবে নলের সাথে একটি তুলনা প্রবর্তন করে রাষ্ট্রটিকে "নাল নয়" থেকে "সম্ভবত নাল" করে দেয়। textশর্তের আগে ডিসেরেন্স করার চেষ্টা করে আমরা এর আরও প্রমাণ পেতে পারি :
public static string M9(string text)
{
int length1 = text.Length; // No warning
bool ignored = text is null;
int length2 = text.Length; // Warning
return text; // No warning
}
returnবিবৃতিতে এখন কীভাবে সতর্কতা নেই তা নোট করুন : কার্যকর করার পরে রাষ্ট্রটি text.Length"নাল নয়" (কারণ যদি আমরা সেই অভিব্যক্তিটি সফলভাবে সম্পাদন করি তবে এটি নাল হতে পারে না)। সুতরাং textপ্যারামিটারটি তার ধরণের কারণে "নাল নয়" হিসাবে শুরু হয়, নাল তুলনার কারণে "সম্ভবত নাল" হয়ে যায়, তার পরে আবার "নাল নয়" হয়ে যায় text2.Length।
কোন তুলনা রাষ্ট্রকে প্রভাবিত করে?
সুতরাং এটি একটি তুলনা text is null... অনুরূপ তুলনা কি প্রভাব আছে? এখানে আরও চারটি পদ্ধতি রয়েছে, সবগুলি একটি অ-শনীয় স্ট্রিং প্যারামিটার দিয়ে শুরু করে:
public static string M10(string text)
{
bool ignored = text == null;
return text; // Warning
}
public static string M11(string text)
{
bool ignored = text is object;
return text; // No warning
}
public static string M12(string text)
{
bool ignored = text is { };
return text; // No warning
}
public static string M13(string text)
{
bool ignored = text != null;
return text; // Warning
}
সুতরাং যদিও x is objectএখন একটি প্রস্তাবিত বিকল্প নেই x != null, তারা একই প্রভাব না: শুধুমাত্র একটি তুলনা নাল সঙ্গে (সাথে is, ==বা !=) "হয়তো নাল" থেকে "না নাল" থেকে রাষ্ট্র পরিবর্তন।
শর্ত উত্তোলনের একটি প্রভাব আছে কেন?
এর আগে আমাদের প্রথম বুলেট পয়েন্টে ফিরে গিয়ে, কেন এম 5 এবং এম 6 লোকাল ভেরিয়েবলের দিকে পরিচালিত শর্তটি বিবেচনা করবে না? এটি আমাকে ততটা অবাক করে না যতটা অন্যকে অবাক করে তোলে। সংকলক এবং স্পেসিফিকেশনের মধ্যে এই ধরণের যুক্তি তৈরি করা অনেক কাজ, এবং তুলনামূলকভাবে খুব সামান্য উপকারের জন্য। এখানে শূন্যতার সাথে কিছুই না করার জন্য এখানে আরও একটি উদাহরণ রয়েছে যেখানে কিছু কিছু অন্তর্ভুক্ত করার ফলে প্রভাব পড়ে:
public static int X1()
{
if (true)
{
return 1;
}
}
public static int X2()
{
bool alwaysTrue = true;
if (alwaysTrue)
{
return 1;
}
// Error: not all code paths return a value
}
যদিও আমরা জানি যে alwaysTrueসর্বদা সত্য হবে, তবুও এটি বিবরণে প্রয়োজনীয়তাগুলি পূরণ করে না ifযা বিবৃতিটির পরে কোডটি অ্যাক্সেসযোগ্য করে তোলে যা আমাদের প্রয়োজন।
এখানে আরও একটি উদাহরণ, নির্দিষ্ট কার্যভারের আশেপাশে:
public static void X3()
{
string x;
bool condition = DateTime.UtcNow.Year == 2020;
if (condition)
{
x = "It's 2020.";
}
if (!condition)
{
x = "It's not 2020.";
}
// Error: x is not definitely assigned
Console.WriteLine(x);
}
যদিও আমরা জানি যে কোডটি সেই ifবিবৃতি সংস্থাগুলির মধ্যে ঠিক একটিতে প্রবেশ করবে , তবে এটি কাজ করার মতো অনুমানের কিছুই নেই। স্ট্যাটিক বিশ্লেষণ সরঞ্জামগুলি এটি করতে সক্ষম হতে পারে তবে ভাষার স্পেসিফিকেশনের মধ্যে এটি রাখার চেষ্টা করা একটি খারাপ ধারণা হতে পারে, আইএমও - স্থির বিশ্লেষণ সরঞ্জামগুলিতে সমস্ত ধরণের হিউরিস্টিক যা সময়ের সাথে বিবর্তিত হতে পারে তা ঠিক আছে, তবে এত বেশি নয় একটি ভাষা নির্দিষ্টকরণের জন্য।