এই প্রশ্নটি মাঝে মাঝে উঠে আসে তবে আমি সন্তোষজনক উত্তর দেখিনি seen
একটি সাধারণ প্যাটার্ন হ'ল (সারিটি একটি ডাটারো ):
if (row["value"] != DBNull.Value)
{
someObject.Member = row["value"];
}
আমার প্রথম প্রশ্নটি কোনটি আরও কার্যকর (আমি শর্তটি উল্টিয়েছি):
row["value"] == DBNull.Value; // Or
row["value"] is DBNull; // Or
row["value"].GetType() == typeof(DBNull) // Or... any suggestions?
এটি ইঙ্গিত করে যে .গেটটাইপ () দ্রুত হওয়া উচিত, তবে সম্ভবত সংকলকটি কিছু কৌশল জানেন যা আমি না?
দ্বিতীয় প্রশ্ন, সারি ["মান"] এর মানটি ক্যাশ করার মতো কি সংকলক সূচককে কোনওভাবেই অপ্টিমাইজ করে?
উদাহরণ স্বরূপ:
object valueHolder;
if (DBNull.Value == (valueHolder = row["value"])) {}
মন্তব্য:
- সারি ["মান"] বিদ্যমান।
- আমি কলামটির কলাম সূচক জানি না (সুতরাং কলামের নাম অনুসন্ধান)।
- আমি বিশেষত ডিবিএনল এবং তারপরে অ্যাসাইনমেন্ট পরীক্ষা করার বিষয়ে জিজ্ঞাসা করছি (অকাল অপটিমাইজেশন ইত্যাদি নয়)।
আমি কয়েকটি পরিস্থিতিতে বেঞ্চমার্ক করেছি (সেকেন্ডের মধ্যে সময়, 10,000,000 ট্রায়াল):
row["value"] == DBNull.Value: 00:00:01.5478995
row["value"] is DBNull: 00:00:01.6306578
row["value"].GetType() == typeof(DBNull): 00:00:02.0138757
অবজেক্ট.রফারেন্সএকুয়ালসের পারফরম্যান্স "==" এর মতোই
সবচেয়ে আকর্ষণীয় ফলাফল? যদি আপনি কলামের নাম কেস অনুসারে মিলে না যায় (উদাহরণস্বরূপ, "মান" এর পরিবর্তে "মান", এটি প্রায় দশগুণ বেশি সময় নেয় (স্ট্রিংয়ের জন্য):
row["Value"] == DBNull.Value: 00:00:12.2792374
গল্পটির নৈতিক বলে মনে হচ্ছে আপনি যদি তার সূচী অনুসারে কোনও কলাম সন্ধান করতে না পারেন তবে নিশ্চিত হয়ে নিন যে আপনি যে কলামের নাম সূচককে খাওয়ান সেটি ডেটা কলামের নামের সাথে ঠিক মিলছে।
মানটি ক্যাচিং করা প্রায় দ্বিগুণ দ্রুত বলে মনে হয় :
No Caching: 00:00:03.0996622
With Caching: 00:00:01.5659920
তাই সর্বাধিক দক্ষ পদ্ধতি বলে মনে হচ্ছে :
object temp;
string variable;
if (DBNull.Value != (temp = row["value"]))
{
variable = temp.ToString();
}
IDataRecord
এক্সটেনশন পছন্দ হত।