ডেটটাইম ভেরিয়েবলের একটি মূল্য নির্ধারিত হয়েছে কিনা তা পরীক্ষা করা হচ্ছে


131

ডেটটাইম উদাহরণটি একটি মূল্য নির্ধারিত হয়েছে কিনা তা পরীক্ষা করে দেখার জন্য সি # এর মধ্যে কি সহজ উপায় আছে?

উত্তর:


82

সি # তে কোনও মান নির্ধারিত হয়নি এমন একটি ভেরিয়েবল থাকার একমাত্র উপায় হ'ল এটি স্থানীয় ভেরিয়েবল হতে পারে - সংকলনের সময় আপনি বলতে পারেন যে এটি অবশ্যই পড়ার চেষ্টা করে নিযুক্ত করা হয়নি: )

আমি সন্দেহ করি যে আপনি সত্যই চান Nullable<DateTime>(বা DateTime?সি # সিনট্যাকটিক চিনির সাথে) - এটি nullশুরু করার পরে একটি সাধারণ DateTimeমান নির্ধারণ করুন (যা যথাযথ রূপান্তরিত হবে) will তারপরে আপনি "প্রকৃত" মান সেট করা হয়েছে কিনা তা দেখতে আপনি কেবল null(বা HasValueসম্পত্তি ব্যবহারের সাথে ) তুলনা করতে পারেন ।


মানটি ডিফল্ট ডেটটাইম মানের সমান কিনা তা যাচাই করার বিষয়ে। এই পদ্ধতির কোনও অদম্য খারাপ দিক রয়েছে? যদি (অনুরোধ.স্টার্টডেটটাইম == ডিফল্ট (তারিখটাইম) {অনুরোধ
St স্টার্টডেটটাইম

8
@ মেনল: আচ্ছা এটি এমন একটি ক্ষেত্রের মধ্যে পার্থক্য বলতে পারে না যা ইচ্ছাকৃতভাবে একটি মান দেওয়া default(DateTime)হয়েছিল এবং এটি যেটি দিয়ে শুরু করা উচিত। মূলত এটি ডোমেনের মধ্যে একটি মূল্যকে "সাধারণ ব্যবহারের জন্য বিশেষ এবং অনুপলব্ধ" হিসাবে বিবেচনা করে যা আমি অপছন্দ করি।
জন স্কিটি

298

আপনি কি এরকম বলতে চান:

DateTime datetime = new DateTime();

if (datetime == DateTime.MinValue)
{
    //unassigned
}

অথবা আপনি নলবল ব্যবহার করতে পারেন

DateTime? datetime = null;

 if (!datetime.HasValue)
 {
     //unassigned
 }

5
এর মধ্যে দ্বিতীয়টি হ'ল বুলেট-প্রুফ। প্রথমটি একটি ডেটটাইমের আনসেট উপস্থাপনা সম্পর্কে কিছু ধরে নেয় যা কাঠামোর দ্বারা গ্যারান্টিযুক্ত নয়। ব্যক্তিগতভাবে আমি মনে করি তাদের এই দৃশ্যের জন্য একটি আনসেট স্থিতিশীল সদস্য যুক্ত করা উচিত ছিল।
রূপ্ট রাউন্সলে

18
@ রুপারট্রান্সলি যা বলেছিল তা যোগ করতে, আপনার আসলে ডিফল্ট (ডেটটাইম) এর সাথে তুলনা করা উচিত, যা একটি সাইনড ডেটটাইমের মান ime এটি ঠিক তাই MinValue সমান হতে পারে, কিন্তু এটি পরিবর্তন হতে পারে।
সোশি আশের

32

এটি কোথাও রাখুন:

public static class DateTimeUtil //or whatever name
{
    public static bool IsEmpty(this DateTime dateTime)
    {
        return dateTime == default(DateTime);
    }
}

তারপর:

DateTime datetime = ...;

if (datetime.IsEmpty())
{
    //unassigned
}

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

@ ক্লিকার: আপনার দুর্দান্ত মন্তব্যের জন্য আপনাকে ধন্যবাদ, তবে আমি নিশ্চিত নই যে আমি আপনার মন্তব্যটি বুঝতে পেরেছি। যতদূর আমি বলতে পারি == এই ক্ষেত্রে ডেটটাইম ডিফল্ট (ডেটটাইম) এর সমতুল্য হলে সর্বদা সত্য ফিরে আসবে ডেটটাইম-এন্ড-আপকে ডিফল্ট মান নির্ধারণের উপায় is আমাকে ব্যাখ্যা করতে দাও: আসলে আমার উত্তরের দ্বিতীয় স্নিপেটটি ভুল, এটি সংকলন করবে না, কারণ, আপনি যদি মনে করেন যে এটি কোনও ফাংশনের মূল উপাদান, তবে তারিখের সময়টি নিযুক্ত করা হয়, এবং সংকলক এটি ব্যবহার করতে অস্বীকার করবে। সুতরাং আপনি এটি একটি মান নির্ধারণ করতে হবে। এটি প্রত্যক্ষ বা পরোক্ষভাবে ডিফল্ট (ডেটটাইম) হতে পারে। আমি আমার উত্তরটি পরিবর্তন করব।
সোনাটিক

এবং যদি অন্য কোনও প্রসঙ্গে ডেটটাইম কোনও শ্রেণীর সদস্য হয় এবং এটি যেমনটি বাকি থাকে, রানটাইম এটিতে ডিফল্ট (ডেটটাইম) নির্ধারণ করে। স্ট্রাক্টের জন্য == প্রকৃতপক্ষে স্ট্রাক্টের সামগ্রীটির তুলনা করা হয়, যাইহোক স্ট্রাক্টটি এই বিষয়বস্তুতে পূর্ণ।
সোনাটিক

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

@ ক্লিকার: হ্যাঁ, ঠিক আছে, পেয়েছেন আপনি ঠিক বলেছেন: আমি যে নামটি বেছে নিয়েছি তা বিভ্রান্তিকর। IsDefaultValueআরও ভাল হত
Sonatique

5

ডেটটাইম মান ধরণের, তাই এটি কখনই শূন্য হতে পারে না। আপনি যদি ডেটটাইম ভাবেন? (অযোগ্য) আপনি ব্যবহার করতে পারেন:

DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;

5

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

if(dt.GetHashCode()==0)
{
    Console.WriteLine("DateTime is unassigned"); 
} 

1
GetHashCodeআয় 0 কারণ এঁটেল পোকা (DATETIME অভ্যন্তরীণ উপস্থাপনা) এর রয়েছে 0. হ্যাশ নিম্নলিখিত পদ্ধতিতে নির্ণিত কোডে সমান: unchecked((int)ticks) ^ (int)(ticks >> 32);। এছাড়াও এখানে দেখুন: রেফারেন্সসোর্স.মাইক্রোসফট.
com/#mscorlib/system/datetime.cs,836

আপনাকে অনেক ধন্যবাদ. আমি একটি সি # ক্লাস থেকে একটি এক্সএমএল ফাইল সিরিয়ালাইজ করার চেষ্টা করছি এবং নাল বৈশিষ্ট্যগুলি বাদ দিয়ে। এই সাহায্য করেছে।
জিম নেফ


3

আমি বলব ডিফল্ট মান সর্বদা থাকে new DateTime()। সুতরাং আমরা লিখতে পারি

DateTime datetime;

if (datetime == new DateTime())
{
    //unassigned
}

2
এই সমাধানটি ইতিমধ্যে ২০০৮ সালে + হাথ দিয়েছিল এবং + রূপ্ট রাউন্সলি মন্তব্য হিসাবে যুক্ত করেছেন, এটি বুলেট-প্রুফ নয় ...
রোল্যান্ড বার

0

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


0

যদি আপনি নাল মান সম্পর্কিত সমস্যাগুলি যেমন আপনি যখন এটি ব্যবহার করেন তখন প্রতিবার নাল পরীক্ষা করা বা কোনও যুক্তিতে এটি গুটিয়ে ফেলার চিন্তা করতে না চান এবং আপনি অফসেটের সময় সমস্যাগুলি নিয়েও চিন্তা করতে চান না, তবে এটি হ'ল আমি কীভাবে সমস্যাটি সমাধান করেছি:

startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt

আমি কেবলমাত্র পরীক্ষা করে দেখছি যে খেলাপি মানটি সময় শুরুর একদিনেরও কম পরে। একটি যাদুমন্ত্র মত কাজ করে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.