การใช้งานstring.IsNullOrEmpty(string)
เมื่อตรวจสอบสตริงถือว่าเป็นวิธีปฏิบัติที่ไม่ดีเมื่อมีstring.IsNullOrWhiteSpace(string)
ใน. NET 4.0 ขึ้นไป?
การใช้งานstring.IsNullOrEmpty(string)
เมื่อตรวจสอบสตริงถือว่าเป็นวิธีปฏิบัติที่ไม่ดีเมื่อมีstring.IsNullOrWhiteSpace(string)
ใน. NET 4.0 ขึ้นไป?
คำตอบ:
แนวปฏิบัติที่เหมาะสมที่สุดคือการเลือกวิธีที่เหมาะสมที่สุด
.Net Framework 4.0 Beta 2 มีเมธอด IsNullOrWhiteSpace () ใหม่สำหรับสตริงที่ใช้เมธอด IsNullOrEmpty () เพื่อรวมพื้นที่สีขาวอื่น ๆ นอกเหนือจากสตริงว่าง
คำว่า "white space" รวมถึงตัวละครทั้งหมดที่ไม่ปรากฏบนหน้าจอ ตัวอย่างเช่นพื้นที่แบ่งบรรทัดและแท็บสตริงว่างอักขระพื้นที่สีขาว *
อ้างอิง: ที่นี่
เพื่อประสิทธิภาพ IsNullOrWhiteSpace ไม่เหมาะ แต่ดี การเรียกใช้เมธอดจะส่งผลให้มีการปรับประสิทธิภาพเล็กน้อย นอกจากนี้เมธอด IsWhiteSpace นั้นมีข้อผิดพลาดบางประการที่สามารถลบออกได้หากคุณไม่ได้ใช้ข้อมูล Unicode เช่นเคยการเพิ่มประสิทธิภาพก่อนวัยอันควรอาจเป็นความชั่วร้าย แต่ก็สนุกเช่นกัน
อ้างอิง: ที่นี่
ตรวจสอบซอร์สโค้ด (Reference Source .NET Framework 4.6.2)
[Pure]
public static bool IsNullOrEmpty(String value) {
return (value == null || value.Length == 0);
}
[Pure]
public static bool IsNullOrWhiteSpace(String value) {
if (value == null) return true;
for(int i = 0; i < value.Length; i++) {
if(!Char.IsWhiteSpace(value[i])) return false;
}
return true;
}
ตัวอย่าง
string nullString = null;
string emptyString = "";
string whitespaceString = " ";
string nonEmptyString = "abc123";
bool result;
result = String.IsNullOrEmpty(nullString); // true
result = String.IsNullOrEmpty(emptyString); // true
result = String.IsNullOrEmpty(whitespaceString); // false
result = String.IsNullOrEmpty(nonEmptyString); // false
result = String.IsNullOrWhiteSpace(nullString); // true
result = String.IsNullOrWhiteSpace(emptyString); // true
result = String.IsNullOrWhiteSpace(whitespaceString); // true
result = String.IsNullOrWhiteSpace(nonEmptyString); // false
return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
ซึ่งเกี่ยวข้องกับการจัดสรรสตริงใหม่และสองการตรวจสอบแยกต่างหาก ส่วนใหญ่อาจจะอยู่ใน IsNullOrWhitespace มันทำผ่านรอบเดียวโดยไม่ต้องจัดสรรใด ๆ โดยการตรวจสอบว่าแต่ละอักขระในสตริงเป็นช่องว่างดังนั้นประสิทธิภาพที่เหนือกว่า อะไรที่ทำให้คุณสับสน
IsNullOrWhitespace()
จะจับคู่สตริงว่างหรือไม่ ในสาระสำคัญตรงส่วนย่อยของIsNullOrEmpty()
IsNullOrWhitespace()
ความแตกต่างในทางปฏิบัติ:
string testString = "";
Console.WriteLine(string.Format("IsNullOrEmpty : {0}", string.IsNullOrEmpty(testString)));
Console.WriteLine(string.Format("IsNullOrWhiteSpace : {0}", string.IsNullOrWhiteSpace(testString)));
Console.ReadKey();
Result :
IsNullOrEmpty : True
IsNullOrWhiteSpace : True
**************************************************************
string testString = " MDS ";
IsNullOrEmpty : False
IsNullOrWhiteSpace : False
**************************************************************
string testString = " ";
IsNullOrEmpty : False
IsNullOrWhiteSpace : True
**************************************************************
string testString = string.Empty;
IsNullOrEmpty : True
IsNullOrWhiteSpace : True
**************************************************************
string testString = null;
IsNullOrEmpty : True
IsNullOrWhiteSpace : True
มันเป็นฟังก์ชั่นที่แตกต่างกัน คุณควรตัดสินใจในสิ่งที่คุณต้องการ
ฉันไม่คิดว่าจะใช้สิ่งใดสิ่งหนึ่งในสิ่งเหล่านี้ในทางปฏิบัติ เวลาส่วนใหญ่IsNullOrEmpty()
ก็เพียงพอแล้ว แต่คุณมีทางเลือก :)
Contains
ที่คุณควรใช้ หากคุณต้องการให้แน่ใจว่าชื่อผู้ใช้ต้องไม่ประกอบด้วยช่องว่างเท่านั้น - IsNullOrWhiteSpace
ก็โอเค IsNullOrEmpty
ทำให้มั่นใจได้ว่าชื่อผู้ใช้นั้นถูกป้อนอย่างใด
นี่คือการใช้งานจริงของทั้งสองวิธี (ถอดรหัสโดยใช้ dotPeek)
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsNullOrEmpty(string value)
{
if (value != null)
return value.Length == 0;
else
return true;
}
/// <summary>
/// Indicates whether a specified string is null, empty, or consists only of white-space characters.
/// </summary>
///
/// <returns>
/// true if the <paramref name="value"/> parameter is null or <see cref="F:System.String.Empty"/>, or if <paramref name="value"/> consists exclusively of white-space characters.
/// </returns>
/// <param name="value">The string to test.</param>
public static bool IsNullOrWhiteSpace(string value)
{
if (value == null)
return true;
for (int index = 0; index < value.Length; ++index)
{
if (!char.IsWhiteSpace(value[index]))
return false;
}
return true;
}
IsNullOrWhiteSpace
ก็เป็นจริงstring.Empty
เช่นกัน! นั่นเป็นโบนัส :)
มันบอกว่ามันทั้งหมดIsNullOrEmpty()
ไม่รวมระยะห่างสีขาวในขณะที่IsNullOrWhiteSpace()
ไม่!
IsNullOrEmpty()
หากสตริงคือ:
-Null
-Empty
IsNullOrWhiteSpace()
หากสตริงคือ:
-Null
-Empty -Contains
White Spaces เท่านั้น
ลองใช้ IsNullOrEmpty และ IsNullOrwhiteSpace
string sTestes = "I like sweat peaches";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < 5000000; i++)
{
for (int z = 0; z < 500; z++)
{
var x = string.IsNullOrEmpty(sTestes);// OR string.IsNullOrWhiteSpace
}
}
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
Console.ReadLine();
คุณจะเห็นว่า IsNullOrWhiteSpace ช้ากว่ามาก: /
string.IsNullOrEmpty (str) - หากคุณต้องการตรวจสอบค่าสตริง
string.IsNullOrWhiteSpace (str) - โดยทั่วไปนี่เป็นการดำเนินการทางตรรกะทางธุรกิจอยู่แล้ว (เช่นทำไม "" ไม่ดี แต่สิ่งที่ชอบ "~~" นั้นดี)
คำแนะนำของฉัน - อย่าผสมตรรกะธุรกิจกับการตรวจสอบทางเทคนิค ตัวอย่างเช่น string.IsNullOrEmpty เป็นวิธีที่ดีที่สุดในการใช้ที่จุดเริ่มต้นของวิธีการตรวจสอบพารามิเตอร์อินพุต
เกี่ยวกับสิ่งนี้สำหรับการจับทั้งหมด ...
if (string.IsNullOrEmpty(x.Trim())
{
}
สิ่งนี้จะตัดช่องว่างทั้งหมดหากมีการหลีกเลี่ยงการปรับประสิทธิภาพของ IsWhiteSpace ซึ่งจะเปิดใช้งานสตริงเพื่อให้ตรงกับเงื่อนไข "ว่างเปล่า" ถ้าไม่ใช่ null
ฉันยังคิดว่านี่เป็นวิธีที่ชัดเจนกว่าและโดยทั่วไปแล้วมันเป็นวิธีที่ดีในการตัดแต่งสตริงโดยเฉพาะถ้าคุณใส่มันลงในฐานข้อมูลหรืออะไรบางอย่าง
ใน. Net มาตรฐาน 2.0:
string.IsNullOrEmpty()
: ระบุว่าสตริงที่ระบุเป็นโมฆะหรือสตริงว่าง
Console.WriteLine(string.IsNullOrEmpty(null)); // True
Console.WriteLine(string.IsNullOrEmpty("")); // True
Console.WriteLine(string.IsNullOrEmpty(" ")); // False
Console.WriteLine(string.IsNullOrEmpty(" ")); // False
string.IsNullOrWhiteSpace()
: ระบุว่าสตริงที่ระบุเป็น null ว่างหรือประกอบด้วยอักขระ white-space เท่านั้น
Console.WriteLine(string.IsNullOrWhiteSpace(null)); // True
Console.WriteLine(string.IsNullOrWhiteSpace("")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True