দৃশ্যত Nullable<int>এবং int?মান সমতুল্য। একে অপরকে বেছে নেওয়ার কোনও কারণ আছে কি?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
দৃশ্যত Nullable<int>এবং int?মান সমতুল্য। একে অপরকে বেছে নেওয়ার কোনও কারণ আছে কি?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
উত্তর:
কোনও পার্থক্য নেই।
int?জন্য শুধু সাঁটে লেখার হয় Nullable<int>, যা নিজেই জন্য সাধারণভাবে সংক্ষেপে হয় Nullable<Int32>।
সংকলিত কোডটি আপনি যে কোনওটি বেছে বেছে বেছে বেছে বেছে বেছে বেছে ঠিক ঠিক একই হতে পারবেন।
?ফর্ম মাত্র পূর্ণ টাইপ জন্য একটি সাঁটে লেখার হয়। ব্যক্তিগত পছন্দকেই অপরের থেকে একটি বেছে নেওয়ার একমাত্র কারণ।
এখানে সম্পূর্ণ বিবরণ ।
বাক্য
T?গঠনটি সংক্ষিপ্ততরNullable<T>, যেখানেTএকটি মান ধরণের। দুটি রূপই বিনিময়যোগ্য।
যদিও আমি পুরোপুরি একমত যে বেশিরভাগ ক্ষেত্রেই তারা একই, আমি সম্প্রতি পরিস্থিতি জুড়ে এসেছিল যখন হয় ঐ দুই মধ্যে একটি পার্থক্য। বিষণ্ণ বিবরণগুলির জন্য এই প্রশ্নটি দেখুন , তবে আপনাকে এখানে একটি দ্রুত উদাহরণ দেওয়ার জন্য:
void Test<T>(T a, bool b)
{
var test = a is int? & b; // does not compile
var test2 = a is Nullable<int> & b; // does compile
}
প্রথম লাইনটি নিম্নলিখিত ত্রুটি বার্তা দেয়:
error CS1003: Syntax error, ':' expected
error CS1525: Invalid expression term ';'
আপনি যদি এর সঠিক কারণটি সম্পর্কে আগ্রহী হন তবে আমি আপনাকে সত্যিই ইতিমধ্যে সংযুক্ত প্রশ্নটি পরীক্ষা করার পরামর্শ দিচ্ছি , তবে মূল সমস্যাটি হ'ল কোনও is(বা একটি as) অপারেটরের পরে পার্সিং পর্বে যখন আমরা একটি ?টোকেনের মুখোমুখি হই তখন আমরা পরীক্ষা করি যে পরবর্তীটি কিনা টোকেন করতে (ক ইউনারী অপারেটর হিসেবে ব্যাখ্যা করা &এক হতে পারে) এবং তাই যদি: পার্সার সম্ভাবনা সম্পর্কে গ্রাহ্য না করে ?টোকেন একটি টাইপ পরিবর্তক হচ্ছে, এটা শুধু এটা আগে টাইপ ব্যবহার করে এবং বাকি পার্স হবে, যেন ?টোকেন হ'ল একটি টেরিনারি অপারেটর (এভাবে পার্সিং ব্যর্থ হবে)।
সুতরাং, সাধারণভাবে int?এবং Nullable<int>বিনিময়যোগ্য অবস্থায়, পার্সার আপনার কোডটি কীভাবে দেখেন সে কারণেই কিছু কোণার কেসগুলি যখন সম্পূর্ণ ভিন্ন ফলাফল দেয়।
testবন্ধনীর সাথে ঠিক করা হয়েছে, তাই var test = (a is int?) & b;। এটির সাথে এটিও ঠিক করা যেতে পারে var test = a is int? && b;এবং bএটি একটি সাধারণ মানের প্যারামিটার (মূল্যায়নের কোনও পার্শ্ব প্রতিক্রিয়া নয়) &বেশি পছন্দ করা অদ্ভুত বলে মনে হয় &&।
?একটি মূল চরিত্র।
int?একটি টের্নারি অপারেশন ( var test = a is int? <return if true> : <return if false>) হিসাবে সংজ্ঞায়িত করা হচ্ছে, কোনও সংক্ষিপ্ত পরিমাণ নয়।
boolওভারলোডগুলির জন্য ডকুমেন্টেশন দেখুন । এগুলি হ'ল বুলিয়ান লজিকাল অপারেটরগুলি ( &for bool) এবং বুলিয়ান শর্তযুক্ত লজিকাল অপারেটরগুলি ( &&for bool)। এই সাবসেকশনগুলির প্রথমটির কীভাবে সুস্পষ্টরূপে যুক্তিযুক্ত নামকরণ করা হয়েছে তা নোট করুন । মনে রাখবেন, সি # তে boolএবং সংখ্যাসূচক প্রকারের মধ্যে কোনও রূপান্তর ("ক্যাসেট") নেই !
কোড-ফার্স্ট সত্তা ফ্রেমওয়ার্ক (EF) প্রজন্ম ব্যবহার করার সময় দু'জনের মধ্যে স্পষ্টতই পার্থক্য রয়েছে:
যখন আপনার সত্তায় কোনও সম্পত্তি থাকে যেমন ঘোষিত হয়:
public class MyEntity
{
public Nullable<int> MyNullableInt { get; set; }
}
ইএফ কোনও অযোগ্য সম্পত্তি উত্পন্ন করবে না এবং আপনাকে জেনারেটরকে এটিকে এ জাতীয়ভাবে নলাবদ্ধ করতে বাধ্য করতে হবে:
public class YourContext : DbContext
{
public DbSet<MyEntity> MyEntities{ get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyEntity>().Property(x => x.MyNullableInt).IsOptional();
}
}
অন্যদিকে, আপনি যদি নিজের সত্ত্বাকে এইভাবে ঘোষণা করেন:
public class MyEntity
{
public int? MyNullableInt { get; set; }
}
EF জেনারেটর সংশ্লিষ্ট ডাটাবেস টেবিলের মধ্যে nullable ক্ষেত্রের সাথে একটি nlalable সম্পত্তি উত্পন্ন করবে।
Nullableকোথাও অন্য কোনও সংজ্ঞা দেওয়ার পরামর্শ দেয় , কারণ অন্তর্নির্মিতের সাথে Nullable<T>, ইএফের পক্ষে দুটির মধ্যে পার্থক্য দেখা সম্ভব নয়। এমনকি যদি ইএফ লোকেরা তাদের সাথে অন্যরকম আচরণ করতে চায় তবে তারা পারেনি।
নালাগুলি একটি জেনেরিক ধরণের, তবে অন্তর্নিহিত? এটি না.
কিছু পরিস্থিতি রয়েছে যেখানে নুলাবলিকে ইনট ব্যবহার করা উচিত ?
উদাহরণস্বরূপ: এখানে আপনি int সহ নুলকে প্রতিস্থাপন করতে পারবেন না ?
নলবল ব্যবহার না করে আপনি কীভাবে নীচের কোডটি পরিবর্তন করতে পারেন ?
class LazyValue<T> where T : struct
{
private Nullable<T> val;
private Func<T> getValue;
// Constructor.
public LazyValue(Func<T> func)
{
val = null;
getValue = func;
}
public T Value
{
get
{
if (val == null)
// Execute the delegate.
val = getValue();
return (T)val;
}
}
}
Nullable<T>এটাNullable<int>