অযোগ্য <<< বনাম ইন্ট? - কোন পার্থক্য আছে?


94

দৃশ্যত Nullable<int>এবং int?মান সমতুল্য। একে অপরকে বেছে নেওয়ার কোনও কারণ আছে কি?

Nullable<int> a = null;
int? b = null;
a == b; // this is true

উত্তর:


135

কোনও পার্থক্য নেই।

int?জন্য শুধু সাঁটে লেখার হয় Nullable<int>, যা নিজেই জন্য সাধারণভাবে সংক্ষেপে হয় Nullable<Int32>।

সংকলিত কোডটি আপনি যে কোনওটি বেছে বেছে বেছে বেছে বেছে বেছে বেছে ঠিক ঠিক একই হতে পারবেন।


4
দুর্ভাগ্যক্রমে কিছু কোণার মামলা রয়েছে যখন এটি কঠোরভাবে সত্য হয় না। এই উত্তর দেখুন ।
— qqbenq

22

?ফর্ম মাত্র পূর্ণ টাইপ জন্য একটি সাঁটে লেখার হয়। ব্যক্তিগত পছন্দকেই অপরের থেকে একটি বেছে নেওয়ার একমাত্র কারণ।

এখানে সম্পূর্ণ বিবরণ ।

বাক্য T?গঠনটি সংক্ষিপ্ততর Nullable<T>, যেখানে Tএকটি মান ধরণের। দুটি রূপই বিনিময়যোগ্য।


18

যদিও আমি পুরোপুরি একমত যে বেশিরভাগ ক্ষেত্রেই তারা একই, আমি সম্প্রতি পরিস্থিতি জুড়ে এসেছিল যখন হয় ঐ দুই মধ্যে একটি পার্থক্য। বিষণ্ণ বিবরণগুলির জন্য এই প্রশ্নটি দেখুন , তবে আপনাকে এখানে একটি দ্রুত উদাহরণ দেওয়ার জন্য:

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>বিনিময়যোগ্য অবস্থায়, পার্সার আপনার কোডটি কীভাবে দেখেন সে কারণেই কিছু কোণার কেসগুলি যখন সম্পূর্ণ ভিন্ন ফলাফল দেয়।


4
প্রথম কেসটি, প্রথম testবন্ধনীর সাথে ঠিক করা হয়েছে, তাই var test = (a is int?) & b;। এটির সাথে এটিও ঠিক করা যেতে পারে var test = a is int? && b;এবং bএটি একটি সাধারণ মানের প্যারামিটার (মূল্যায়নের কোনও পার্শ্ব প্রতিক্রিয়া নয়) &বেশি পছন্দ করা অদ্ভুত বলে মনে হয় &&।
— জেপ্পে স্টিগ নীলসন

সেই নির্দিষ্ট বাক্য গঠনতে ?একটি মূল চরিত্র।
— পিট গ্যারাফানো

লিঙ্কিত প্রশ্ন এবং উত্তরটি দেখুন, আপনার মন্তব্যগুলি এখানে সম্বোধিত হয়েছে :) আমি কেবল এখানে এই তথ্যটি যুক্ত করেছি, কারণ আমি অনুভব করেছি যে এটি প্রাসঙ্গিক, কারণ এটি দুটি রূপের মধ্যে পার্থক্য নিয়ে আসে এবং প্রমাণ করে যে এটি কেবল সিনট্যাকটিক চিনি নয়
— qqbenq

জেপ ঠিক আছে। এটি সংকলন করছে না কারণ এটি int?একটি টের্নারি অপারেশন ( var test = a is int? <return if true> : <return if false>) হিসাবে সংজ্ঞায়িত করা হচ্ছে, কোনও সংক্ষিপ্ত পরিমাণ নয়।
— লেভি ফুলার

4
@ লেভিফুলার (অবিরত) এই নির্দিষ্ট boolওভারলোডগুলির জন্য ডকুমেন্টেশন দেখুন । এগুলি হ'ল বুলিয়ান লজিকাল অপারেটরগুলি ( &for bool) এবং বুলিয়ান শর্তযুক্ত লজিকাল অপারেটরগুলি ( &&for bool)। এই সাবসেকশনগুলির প্রথমটির কীভাবে সুস্পষ্টরূপে যুক্তিযুক্ত নামকরণ করা হয়েছে তা নোট করুন । মনে রাখবেন, সি # তে boolএবং সংখ্যাসূচক প্রকারের মধ্যে কোনও রূপান্তর ("ক্যাসেট") নেই !
— জেপ্পে স্টিগ নীলসেন

6

কোড-ফার্স্ট সত্তা ফ্রেমওয়ার্ক (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 সম্পত্তি উত্পন্ন করবে।


4
এটা সত্যিই দুর্ভাগ্যজনক।
— স্যারাইড

8
এটি আপনাকে Nullableকোথাও অন্য কোনও সংজ্ঞা দেওয়ার পরামর্শ দেয় , কারণ অন্তর্নির্মিতের সাথে Nullable<T>, ইএফের পক্ষে দুটির মধ্যে পার্থক্য দেখা সম্ভব নয়। এমনকি যদি ইএফ লোকেরা তাদের সাথে অন্যরকম আচরণ করতে চায় তবে তারা পারেনি।

4
কেউ কি নিশ্চিত হয়েছে যে এটি কেস? (নেতিবাচক ভোটের কারণে কিছুটা সতর্ক)
— রায়লভলেস

@ রায়ল না এটি ঘটনা নয় isn't এই উত্তরটি সঠিক নয় এবং যেমন এইচডিডি উল্লেখ করেছে, অসম্ভব।
— জুতো

4
কোড টেমপ্লেটগুলি ব্যবহার করে ইএফ কোড উত্পন্ন হয়েছে তা বিবেচনা করে বাস্তবে এটি সম্ভব হতে পারে। আমার উত্তরটি আমার অভিজ্ঞতার ভিত্তিতে এবং আমি যে পরিবর্তনটি প্রস্তাব করেছি তার ভিত্তিতে আমার সমস্যাটি স্থির হয়েছে। এছাড়াও, দেখে মনে হচ্ছে কিছু লোকেরা সত্যই এটি আপ-ভোটের ভিত্তিতে কেস।
— ম্যাকিয়েজ

2

নালাগুলি একটি জেনেরিক ধরণের, তবে অন্তর্নিহিত? এটি না.

কিছু পরিস্থিতি রয়েছে যেখানে নুলাবলিকে ইনট ব্যবহার করা উচিত ?

উদাহরণস্বরূপ: এখানে আপনি 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;
      }
   }
}

4
তাই এটা না যদি প্রশ্ন জেনেরিক ধরনের সম্পর্কে জিজ্ঞাসা করা হয়েছিল, কিন্তু প্রশ্ন int- এ নিদিষ্ট যা কোন ব্যাপার পারে, Nullable<T>এটাNullable<int>
— অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.