문제

다음과 같이 선언된 매개변수를 사용하는 함수가 있습니다. int privateCount.이 매개변수에 대해 ToString()을 호출하려고 하면 ReSharper는 이를 회색으로 표시하고 중복 호출로 표시합니다.그래서 궁금해서 ToString()을 제거했는데도 코드는 계속 빌드됩니다!

C# 컴파일러는 이를 어떻게 허용할 수 있습니까? str 문자열인가요?

str += privateCount + ...

도움이 되었습니까?

해결책

문자열의 + 연산자는 표현식의 왼쪽과 오른쪽을 전달하는 String.Concat을 호출하도록 오버로드됩니다.따라서:

string x = "123" + 45;

다음과 같이 컴파일됩니다.

String.Concat("123", 45);

String.Concat은 두 개의 개체를 사용하므로 오른쪽(45)이 박싱된 다음 ToString()이 호출됩니다.

이 "오버로딩"은 언어의 연산자 오버로딩을 통해서가 아니라(op_Addition이라는 메서드가 아님) 컴파일러에 의해 처리됩니다.

다른 팁

이는 나쁜 습관일 뿐만 아니라 성능도 떨어집니다.String.Concat에서는 객체를 예상하지만 int.ToString()에서는 박싱이 필요하지 않으므로 정수를 박싱해야 합니다.

C#은 자동으로 개체를 문자열로 변환합니다.다음 코드 줄을 고려해보세요.

aString = aString + 23;

이것은 유효한 C#입니다.두 개체를 인수로 사용하는 String.Concat()에 대한 호출로 컴파일됩니다.해당 개체는 자동으로 문자열 개체로 변환됩니다.

다음과 같이 작성할 때에도 동일한 일이 발생합니다.

aString += 23;

다시 말하지만, 이는 String.Concat()에 대한 동일한 호출로 컴파일됩니다.단지 다르게 쓰여졌을 뿐입니다.

변수가 문자열인지 정수인지 두 번 생각해야 하기 때문에 이것은 유효한 나쁜 습관입니다.변수가 myInt라고 불린다면 어떻게 될까요?

myInt = myInt + 23;

이 형식이 더 읽기 쉽고 이해하기 쉽나요?

myInt = mInt + "23";

또는:

myInt = string.Format("{0}{1}", myInt, 23);

우리는 코드를 통해 그것이 정수가 아니라 문자열이라는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top