2010-09-12 74 views
9

nếu tôi làm điều gì đó như thế này ...C#: Lẫn lộn về ToUpper() và ToLower()

String myVar = "in"; 
if(myVar.ToUpper() == "in") 
{ 
    //do something 
} 

này sẽ không đi vào bên trong "nếu" khối ..right?

hoặc

Nó sẽ kiểm tra BOTH cho "in" AND "IN" và làm bất cứ điều gì có trong đó nếu? Nếu vậy, tại sao vậy? Không phải là nó phải bỏ qua những gì bên trong của khối "nếu"?

Cùng nhầm lẫn là khoảng ToLower() quá

Sửa: Vì vậy, để kiểm tra cho cả hai trường hợp, tôi cần phải viết:

if((myVar.ToUpper().Equals("in"))&&(myVar.Equals("in"))) 

Giống như this..right?

+1

Lời khuyên của Jon rất vững chắc, nhưng tôi muốn giải thích những gì đã xảy ra ở trên. Nếu bạn muốn kiểm tra nó là "in" và không quan tâm đến case, bạn có thể làm 'ToLower' và so sánh với" in "hoặc' ToUpper' và so sánh với 'IN'. Bạn không cần nhiều so sánh. Trong mọi trường hợp, tôi khuyên bạn nên làm những gì Jon khuyên. –

Trả lời

43

Thay vì chuyển đổi sang chữ hoa và sau đó so sánh, bạn nên sử dụng so sánh bình đẳng có thể khiến trường hợp không phân biệt chữ hoa chữ thường. Ví dụ:

if (myVar.Equals("in", StringComparison.OrdinalIgnoreCase)) 
{ 
    ... 
} 

Bạn nên cân nhắc cẩn thận chính xác các quy tắc phù hợp - thứ tự, văn hóa hiện nay, văn hóa bất biến, hoặc có thể là nền văn hóa hoàn toàn khác (ví dụ sử dụng StringComparer.Create(culture, true)).

Để biết thêm chi tiết về điều này, hãy đọc bài viết MSDN Best Practices for Using Strings in the .NET Framework.

+0

+1 cho (cho đến nay) câu trả lời duy nhất đề cập đến "văn hóa" bên cạnh chữ thường và chữ hoa. – stakx

+0

Đối với các câu lệnh if tôi hoàn toàn đồng ý với bạn, nhưng câu lệnh chuyển đổi của chuỗi thì sao? Tôi đã đọc ở đâu đó tốt nhất để chuyển đổi chuỗi thành chữ hoa, ví dụ: switch (myVar.ToUpper()) {case "MYCASE1": ...} –

+0

@ mjf196: Điều đó phụ thuộc vào ngữ cảnh - điều gì đang được đặt ở trên? Nếu đó là đầu vào của người dùng, bạn thực sự cần phải suy nghĩ về chính xác những gì bạn muốn hành vi được. –

2

"IN" không bằng "in" - do đó, nó không thực thi khối if. Trong trường hợp toLower() nó sẽ thực hiện khối if là "in" bằng "in" ..

5

Biểu thức something.ToUpper().Equals("lowercaseletters") sẽ không bao giờ đúng, vì vậy trong ví dụ của bạn nếu khối sẽ không được thực thi. Và tất nhiên, điều này cũng áp dụng cho ToLower; something.ToLower().Equals("UPPERCASE") cũng sẽ không bao giờ đúng.

2

Đầu tiên nếu bạn muốn so sánh chuỗi sử dụng Equals()

myVar.toUpper().Equals("in") 

Thứ hai đầu tiên tất cả các mã bên trong nếu được thực thi, chỉ sau đó sự trở lại được thử nghiệm.

nên

String myVar="in"; 
if(myVar.toUpper().Equals("in")) 
{ 
    //do something 
} 

không "làm điều gì đó".

+1

Ok, tôi sẽ cắn: tại sao sử dụng 'Bằng’? –

+0

Steven: fampinheiro được viết bằng Java rõ ràng, trong đó 'Equals' là bắt buộc vì' == 'không bị quá tải cho chuỗi. – Gabe

+0

Trong một số ngôn ngữ toán tử "==" so sánh hai tham chiếu đối tượng để xem liệu chúng có tham chiếu đến cùng một cá thể hay không. Tôi không tin rằng đây là trường hợp trong C# mặc dù; nhà điều hành gọi String :: Equals under the hood. Nó vẫn so sánh các giá trị byte-by-byte mặc dù, vì vậy bạn có thể muốn .Compare() – RJFalconer

2

Nếu bạn làm điều gì đó như bạn nói, nó sẽ không đi vào nếu khối, và đây là lý do:

nhà khai thác được áp dụng cho các đối tượng ở bên trái. Vì vậy, mã của bạn cũng giống như bài viết này:

String myVar="in"; 
String testVar = myVar.ToUpper(); 
if(testVar=="in") //This will never be true 
{ 
    //do something 
} 

Trong chỉnh sửa của bạn, bạn vẫn không kiểm tra nếu chuỗi của bạn là == "IN", bạn đang làm 2 bài kiểm tra để xem nếu chuỗi của bạn là == "trong".

Nếu bạn đã thay đổi ban đầu của bạn vào đó nó sẽ làm việc:

String myVar="in"; 
if(myVar.ToUpper()=="IN") 
{ 
    //do something 
} 

chỉnh sửa của bạn nên được như thế này để kiểm tra cả hai trường hợp:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

EDIT: Một số giải thích thêm từ Comment của Steven:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

Mẫu mã đó có 2 so sánh, nhưng nếu myVar sẽ chỉ bao giờ là phiên bản trường hợp hỗn hợp s trong (IE: trong In iN IN) thì so sánh thứ hai là không cần thiết. Khi tôi đã chuyển đổi chuỗi thành ToUpper(), bạn chỉ cần kiểm tra xem nó có bằng IN hay không. Vì vậy, tôi sẽ thay thế mà phù hợp với:

if(myVar.ToUpper().Equals("IN")) 

hoặc

if(myVar.ToUpper() == "IN") 

Cá nhân tôi sẽ sử dụng == không phải là phương pháp Equals.

+0

Tôi không thấy điểm làm cả hai bài kiểm tra. Nếu điều thứ hai là đúng, thì điều thứ nhất cũng sẽ là. Tương tự như vậy, tôi không biết tại sao bạn đang sử dụng 'Equals'. Bạn có? –

+0

@Steven Tôi đang sử dụng nó bởi vì đó là những gì OP được sử dụng trong các câu hỏi của mình. Trong tình huống thứ hai, bạn là chính xác. Chỉ cần sử dụng nó bởi vì đó là những gì OP được sử dụng. – thorkia

+0

Vâng, điều đó giải thích nó, nhưng tôi đảm bảo với bạn rằng câu trả lời của chúng tôi không bắt buộc phải lặp lại bất kỳ lỗi nào từ các câu hỏi. :-) –

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