PDA

View Full Version : سوال: نحوه برسیnull بودن یک string قبل از خطای کامپایلر



esafb52
پنج شنبه 17 اسفند 1391, 22:41 عصر
با سلام به همه اساتید
من میخواهم چک کنم که یک رشته نال هست یا نه البته کدش رو هم میدونم

public bool Check(string str)
{

return String.IsNullOrWhiteSpace(str);

}

مشکل من اینه که میخوام تو یه دستور شرط بررسی کنم که نال هست یا نه
اما اگه اون رشته قبل از دستور شرط باشه در صورت نال بودن با خطا مواجه میشم و اگر تو بلاک if دیگه بهش دسترسی ندارم که چکش کنم چطور باید اینکار رو انجام بدم ضمنا اینه رشته ممکنه یک کلید تو ریجستری یا هر چیزی دیگه ای باشه به غیر از یک رشته معمولی که بامتدtostring() به رشته تبدیل شده باشه
ممنون

pedram.11
پنج شنبه 17 اسفند 1391, 22:55 عصر
شما همیشه قبل از عملیات روی رشته از تهی بودن اون مطمئن شید ارور نمیده (if (x != null یا (if (!string.IsNullOrEmpy و ...

esafb52
پنج شنبه 17 اسفند 1391, 22:58 عصر
شما همیشه قبل از عملیات روی رشته از تهی بودن اون مطمئن شید ارور نمیده (if (x != null یا (if (!string.IsNullOrEmpy و ...دوست عزیز خب منم دارم همین کار رو میکنم ولی مشکل این بود که اگه اون رشته قبل از دستور شرط باشه در صورت نال بودن با خطا مواجه میشم و اگر تو بلاک if دیگه بهش دسترسی ندارم که چکش کنم چطور باید اینکار رو انجام بدم
با دستور try ,... هم نمیخوام باشه!!!
ممنون

the king
جمعه 18 اسفند 1391, 00:30 صبح
با سلام به همه اساتید
من میخواهم چک کنم که یک رشته نال هست یا نه البته کدش رو هم میدونم

public bool Check(string str)
{

return String.IsNullOrWhiteSpace(str);

}

مشکل من اینه که میخوام تو یه دستور شرط بررسی کنم که نال هست یا نه
اما اگه اون رشته قبل از دستور شرط باشه در صورت نال بودن با خطا مواجه میشم و اگر تو بلاک if دیگه بهش دسترسی ندارم که چکش کنم چطور باید اینکار رو انجام بدم ضمنا اینه رشته ممکنه یک کلید تو ریجستری یا هر چیزی دیگه ای باشه به غیر از یک رشته معمولی که بامتدtostring() به رشته تبدیل شده باشه
ممنون

نه ارسال پارامتر null به Check خطا خواهد داد و نه ارسال پارامتر null به IsNullOrWhiteSpace . هر دو می توانند null دریافت کنند
و هیچکدام از این دو مورد مشکلی با null ندارند.
تنها مواردی که باعث خطا خواهند شد اینها هستند :

1) موردی که دسترسی به آن وجود ندارد، فرضا وقتی متغیری null است نمی توان رویش ()Trim اجرا کرد :

string p = null;
p = p.Trim();


و باید برای null نبودنش شرط اضافه کنیم :


string p = null;
if (p != null)
p = p.Trim();


2) گاهی اوقات لازم است که بررسی کنیم که آیا رشته ای بدون در نظر گرفتن بزرگی یا کوچکی برابر مقداری هست یا خیر.
اگر آن رشته null باشد، متد Equals اش قابل اجرا نیست و p.Equals خطا خواهد داد :


string p = null;
if (p.Equals("yes", StringComparison.OrdinalIgnoreCase))
MessageBox.Show("Yes");


اما string.Equals با p.Equals فرق دارد و مشکلی برای دریافت کردن یک یا دو رشته null ندارد و قابل اجرا است :

string p = null;
if (string.Equals(p, "yes", StringComparison.OrdinalIgnoreCase))
MessageBox.Show("Yes");


3) مواقعی که مقداری رو از بانک اطلاعاتی می خوانیم، نبودن مقدار برای فیلد با null بودن فرق می کند و حتی null نیست.
تلاش برای خواندن مقدار فیلدی که مقداری برایش وجود ندارد خطا خواهد داد :

DataRow row = YourTable.Rows[0];
p = row["ColumnName"].ToString();


باید ابتدا بررسی کنیم که آیا مقداری در آن وجود دارد یا نه :

DataRow row = YourTable.Rows[0];
string p;
if (row.IsNull("ColumnName"))
p = null;
else
p = (string)row["ColumnName"];


4) گاهی اوقات لازم است که یکسری عملیات روی یک رشته انجام شود که null بودن کار را خراب می کند، لازم نیست که مدام برای null بودنش
شرط اضافه کنیم ، می توانیم همان ابتدا احتمال null بودنش را از بین ببریم :

if (p == null)
p = string.Empty;


5) شرط null بودن را بر هر شرط دیگری مقدم قرار دهید وگرنه خطا خواهد داد.
فرضا اگر اول Length اش را بررسی کنید موقع null بودنش خطا رخ می دهد :

string p = null;
if ((p.Length < 4) || (p == null))
MessageBox.Show("Invalid!");


باید ابتدا null بودن بررسی شود تا خطا ندهد :

string p = null;
if ((p == null) || (p.Length < 4))
MessageBox.Show("Invalid!");


عملگر || می تواند با null بودن مقدار مانع اجرا شدن شرط های بعدی بشود.

6) شرط null نبودن را با عملگر && ترکیب کنید :

string p = null;
if ((p != null) && (p.Length > 4))
MessageBox.Show("Valid!");


7) سلسله مراتب رو هم رعایت کنید، اول null نبودن شی و بعد null نبودن مشخصه شیء و بعد بررسی طول مشخصه شیء :

Form f = Application.OpenForms["Form2"];
if ((f != null) && (f.Tag != null) && (f.Tag.ToString().Length > 4))
{
MessageBox.Show("Valid!");
}

esafb52
جمعه 18 اسفند 1391, 00:33 صبح
میشه تو ضیح بدین رشته a اینو چطور بررسی کنم تو یه if:

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"software\xxx");
string a = reg.GetValue("xx").ToString();

the king
جمعه 18 اسفند 1391, 00:40 صبح
میشه تو ضیح بدین رشته a اینو چطور بررسی کنم تو یه if:

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"software\xxx");
string a = reg.GetValue("xx").ToString();


اگر نوع داده اش string است، از ToString استفاده نکنید، از (string) استفاده کنید :

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"software\xxx");
string a = null;
if (reg != null)
a = (string)reg.GetValue("xx");

esafb52
جمعه 18 اسفند 1391, 00:44 صبح
مقدار xx عدد ه و من هم با این فرض این رو گفتم برای این حالت چی؟

the king
جمعه 18 اسفند 1391, 00:49 صبح
مقدار xx عدد ه و من هم با این فرض این رو گفتم برای این حالت چی؟

مشکلی نیست، یا مقدار پیشفرض برایش در نظر بگیرید فرضا صفر :

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"software\xxx");
string a = null;
if (reg != null)
a = reg.GetValue("xx", 0).ToString();


یا اینکه جداگانه شرط قرار دهید که اگر null باشد (اون Value وجود نداشته باشد) دیگر ToString بکار برده نشود :

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"software\xxx");
string a = null;
if ((reg != null) && (reg.GetValue("xx") != null))
a = reg.GetValue("xx").ToString();

esafb52
جمعه 18 اسفند 1391, 01:04 صبح
ممنون کاملا جواب داد جالب بود