PDA

View Full Version : سوال: Null-conditional operators - Conditional operator



irpersian20
شنبه 11 آذر 1396, 16:59 عصر
سلام
دوستان چه در سایت ایرانی و چه خارجی راستش من نمیفهمم
این
?.
چجور عمل میکنه
C# 6 - Null-conditional operators

ژیار رحیمی
شنبه 11 آذر 1396, 20:01 عصر
هدف از Null-Conditional Operator کاهش کدنویسی حالات مقایسه ای مختلف با null هست .
مثال زیر را در نظر داشته باش

public static string Truncate(string value, int length)
{
string result = value;
if (value != null) // Skip empty string check for elucidation
{
result = value.Substring(0, Math.Min(value.Length, length));
}
return result;
}

درون متد، شرط null نبودن را بررسی کرده درصورتی که متغییر value مخالف null باشه متد Substring آن فراخوانی میشود.(اگر null باشد با خطا مواجه خواهد شد).در صورتی بخواهیم همان عملکرد کد را بصورت ساده تر نوشته شود کد بالا را بصورت زیر ساده تر بتویسیم

public static string Truncate(string value, int length)
{
return value?.Substring(0, Math.Min(value.Length, length));
}

در متد اصلاح شده همان عملکرد اما بصورت ساده تر نوشته میشود.در صورتی value نال باشد ،مقدار null برگشت داده میشود و در صورت null نبودن متدSubstring آن فراخوانی میشود و مقدار برگشتی متد را بازگشت خواهد کرد.

در مثالی دیگر چند حالت چک کردن null باهم در if چک میشود

var response = someProxy.SomeWebMethod();
// so many layers, so many potential nulls...
if (response != null && response.Results != null && response.Results.Status == Status.Success)
{
Console.WriteLine("We were successful!");
}

اگر آبجکت response مخالف null و ابجکت داخلی آن Results مخالف null باشد انگاه پراپرتی Status ان بررسی میشود که بصورت Null-Conditional Operator نوشته شود

var response = someProxy.SomeWebMethod();
// so much better!
if (response?.Results?.Status == Status.Success)
{
Console.WriteLine("We were successful!");
}

رامین مرادی
دوشنبه 13 آذر 1396, 08:11 صبح
هدف از Null-Conditional Operator کاهش کدنویسی حالات مقایسه ای مختلف با null هست .
مثال زیر را در نظر داشته باش

public static string Truncate(string value, int length)
{
string result = value;
if (value != null) // Skip empty string check for elucidation
{
result = value.Substring(0, Math.Min(value.Length, length));
}
return result;
}

درون متد، شرط null نبودن را بررسی کرده درصورتی که متغییر value مخالف null باشه متد Substring آن فراخوانی میشود.(اگر null باشد با خطا مواجه خواهد شد).در صورتی بخواهیم همان عملکرد کد را بصورت ساده تر نوشته شود کد بالا را بصورت زیر ساده تر بتویسیم

public static string Truncate(string value, int length)
{
return value?.Substring(0, Math.Min(value.Length, length));
}

در متد اصلاح شده همان عملکرد اما بصورت ساده تر نوشته میشود.در صورتی value نال باشد ،مقدار null برگشت داده میشود و در صورت null نبودن متدSubstring آن فراخوانی میشود و مقدار برگشتی متد را بازگشت خواهد کرد.

در مثالی دیگر چند حالت چک کردن null باهم در if چک میشود

var response = someProxy.SomeWebMethod();
// so many layers, so many potential nulls...
if (response != null && response.Results != null && response.Results.Status == Status.Success)
{
Console.WriteLine("We were successful!");
}

اگر آبجکت response مخالف null و ابجکت داخلی آن Results مخالف null باشد انگاه پراپرتی Status ان بررسی میشود که بصورت Null-Conditional Operator نوشته شود

var response = someProxy.SomeWebMethod();
// so much better!
if (response?.Results?.Status == Status.Success)
{
Console.WriteLine("We were successful!");
}



ممنون میشم ای خط رو هم برا من توضیح بدید
i < names.Length ? string.Empty : ' ' + (i / names.Length + 1).ToString()

ژیار رحیمی
دوشنبه 13 آذر 1396, 11:26 صبح
Conditional operator (:?) عمگری شرطی ست که بجای if-elseبکار میرود.به دو حالت 1-مقایسه و انتساب 2-مقایسه و فراخوانی کاربرد دارد

//1-if-else for assignment a value
var result = Boolean conditional expression ? first statement : second statement
//2-if-else for calling methods
Boolean conditional expression ? first Method : second Method

در حالت اول :اگر نتیجه عبارت شرط(conditional expression) درست یا true باشد نتیجه بخش first ststment در result ریخته میشود و در صورت false بودن نتیجه second statmet .
در حالت دوم :اگر نتیجه عبارت شرط(conditional expression) درست یا true باشد first method فراخوانی و در صورت false بودن second method فراخوانی میشود.
مثال زیر را در نظر بگیر

int input = Convert.ToInt32(Console.ReadLine());
string classify;


// if-else construction.
if (input > 0)
classify = "positive";
else
classify = "negative";

یک عبارت if-else درصورتی مقدار input بزرگتر از صفر باشد رشته positive به متغییر classifiy انتساب داده میشود و در غیر اینصورت رشته negative به آن انتساب ذاذه میشود.
در صورتیکه عبارت بالا بصورت conditional oprator نوشته شود

classify = (input > 0) ? "positive" : "negative";

اما در مورد سوال شما :
نوع مقایسه ایی از نوع اول میباشد که باید نتیجه conditional oprator به متغییری انتساب داده شود.

var result=i < names.Length ? string.Empty : ' ' + (i / names.Length + 1).ToString();


//که ساده شده عبارت زیر میباشد
string result;
if(i<names.Lenght)
result=string.Empty;
else result=' ' + (i / names.Length + 1).ToString();