2011-01-10 34 views
18

Chỉ là một câu hỏi ngắn về sự tò mò.Làm các chuỗi C# kết thúc bằng chuỗi rỗng?

string str = "string"; 
Console.WriteLine(str.EndsWith(string.Empty));     //true 
Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length); //false 
//of course string are indexed from 0, 
//just wrote if for fun to check whether empty string get some extra index 
///somehow by a miracle:) 

//finally 

Console.WriteLine(str.LastIndexOf(string.Empty) 
       == str.LastIndexOf('g'));      //true :) 
+0

Khái niệm của bạn về 'string.Empty' là gì? Nó là gì? – thecoop

+7

Mọi thứ đều không có gì. Không có gì ở khắp mọi nơi. – BoltClock

+0

Câu hỏi của tôi là tại sao có quá nhiều phiếu bầu cho một câu hỏi vô nghĩa như vậy? Tại sao chính xác có vấn đề là người ta biết nếu một chuỗi C# không hoặc không kết thúc bằng một chuỗi rỗng? Làm thế nào chính xác bạn sẽ sử dụng thông tin có giá trị như vậy? – Blake7

Trả lời

17

EndsWith:

Xác định xem khi kết thúc dụ chuỗi này phù hợp với chuỗi định.

Tất cả các chuỗi sẽ khớp với "" ở cuối ... hoặc bất kỳ phần nào khác của chuỗi. Tại sao? Bởi vì khái niệm, có các chuỗi rỗng xung quanh mọi ký tự.

"" + "abc" + "" == "abc" == "" + "a" + "" + "b" + "" + "c" + "" 

Cập nhật:

Về ví dụ cuối cùng của bạn - đây là tài liệu trên LastIndexOf:

Nếu giá trị là String.Empty, giá trị trả về là vị trí chỉ số cuối cùng trong này ví dụ.


Một vấn đề liên quan là việc sử dụng null như một terminator chuỗi - đó xảy ra trong C và C++, nhưng không phải C#.

Từ MSDN - String Class (System):

Trong .NET Framework, một đối tượng String có thể bao gồm ký tự null, mà được tính là một phần của chiều dài của chuỗi nhúng. Tuy nhiên, trong một số ngôn ngữ như C và C++, một ký tự null cho biết kết thúc của một chuỗi; nó không được coi là một phần của chuỗi và không được tính là một phần của chiều dài chuỗi.

6

Hãy thử điều này:

string str = "string"; 
Console.WriteLine(str.EndsWith(string.Empty));     //true 
Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length-1); // true 
Console.ReadLine(); 

Vì vậy, có như Oded nói, họ luôn luôn phù hợp.

+0

ooh Tốt cộng với một vì có một trang web quan trọng trên Q? đoạn mã – Badr

+0

Tôi không nghĩ rằng mã OP 'str.LastIndexOf (string.Empty) == str.Length' là một sai lầm mặc dù, như OP nghĩ' string.Empty' là cái gì đó sau ** g ** – Bolu

+1

Tất nhiên, chuỗi sử dụng chỉ mục 0 dựa trên, tôi chỉ viết nó cho vui để kiểm tra xem chuỗi rỗng có được một số chỉ số phụ bằng cách nào đó bằng phép lạ không :) – nan

2

Hãy suy nghĩ theo cách này: LastIndexOf là loại vô nghĩa với chuỗi rỗng. Bạn có thể nói chuỗi trống tồn tại tại mỗi chỉ số trong một chuỗi, giữa mỗi ký tự. Các documentation do đó cung cấp một câu trả lời dứt khoát cho những gì nên được trả lại:

Nếu giá trị là String.Empty, giá trị trả về là vị trí chỉ số cuối cùng trong trường hợp này.

Ít nhất trong trường hợp này, nó trả về chỉ số thực tế. Nếu nó trả về độ dài của chuỗi (biểu thị chỉ mục "sau" kết thúc, mà tôi tin là quan điểm của bạn), nó sẽ trả về kết quả cho một phương thức có tên là LastIndexOf thậm chí không phải là chỉ mục.

Và đây là một cách khác để nhìn vào nó: Nếu tôi có điều này:

Dim index As Integer = str.LastIndexOf("") 

... sau đó tôi sẽ có thể làm điều này:

Dim substr As String = str.Substring(index, "".Length) 

... và nhận được "" trở lại. Chắc chắn, khi LastIndexOf trả về chỉ số cuối cùng trong chuỗi, nó hoạt động. Nếu nó trả về độ dài của chuỗi, tôi sẽ nhận được ArgumentOutOfRangeException. Chỉnh sửa: Ồ, có vẻ như tôi đã sai ở đó. Hy vọng rằng điểm đầu tiên của tôi đủ mạnh cho chính mình;)

0

Có thêm một số thông tin trong số this question và các câu trả lời của nó.

Cụ thể, "Indeed, the empty string logically occurs between every pair of characters."

Các vấn đề liên quan