[c#] C #에서 문자열과 문자열의 차이점은 무엇입니까?

예 ( 사례 참고 ) :

string s = "Hello world!";
String s = "Hello world!";

각각의 사용에 대한 지침은 무엇입니까? 차이점은 무엇입니까?



답변

string에 대한 C #의 별칭입니다 System.String.
따라서 기술적으로 차이는 없습니다. int vs. System.Int32 와 같습니다 .

지침에 따르면 일반적으로 string물체를 언급 할 때 사용 하는 것이 좋습니다 .

예 :

string place = "world";

마찬가지로 String클래스를 구체적으로 참조 해야하는 경우 일반적으로 사용 하는 것이 좋습니다 .

예 :

string greet = String.Format("Hello {0}!", place);

이것은 Microsoft 가 예제 에서 사용하는 스타일입니다 .

StyleCop은 이제 C # 특정 별칭의 사용을 강제하기 때문에이 영역의 지침이 변경되었을 수 있습니다 .


답변

완벽을 기하기 위해 여기에 관련된 정보의 두뇌 덤프가 있습니다 …

다른 사람들이 지적했듯이 string의 별칭입니다 System.String. 그것들은 동일한 코드로 컴파일되므로 실행 시간에는 아무런 차이가 없습니다. 이것은 C #의 별칭 중 하나 일뿐입니다. 전체 목록은 다음과 같습니다.

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

그렇다에서 string하고 object, 별칭은 값 유형에 대한 모든입니다. decimalCLR의 기본 유형이 아닌 값 유형입니다. 별칭이없는 유일한 기본 유형은 System.IntPtr입니다.

사양에서 값 형식 별칭은 “단순 형식”이라고합니다. 리터럴은 모든 단순 유형의 상수 값에 사용될 수 있습니다. 다른 값 유형에는 리터럴 양식을 사용할 수 없습니다. (VB와 비교하면 DateTime리터럴 을 허용 하고 별칭도 있습니다.)

당신이하는 하나의 상황이 명시 적으로 열거의 기본 형식을 지정하는 경우 : 별칭을 사용하는가. 예를 들어 :

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

즉, 방법의 문제 스펙을 정의 열거 선언입니다 – 콜론 뒤 부분이되어야합니다 필수 유형 중 하나 토큰 생산, sbyte, byte, short, ushort, int, uint, long, ulong, char… A와 반대되는 유형의 생산 등을 예를 들어 변수 선언에 사용됩니다. 다른 차이점은 없습니다.

마지막으로, 사용할 때 : 개인적으로 구현의 모든 곳에서 별칭을 사용하지만 API의 경우 CLR 유형을 사용합니다. 구현 측면에서 어느 것을 사용하는지는 실제로 중요하지 않습니다. 팀 간의 일관성은 좋지만 아무도 신경 쓰지 않을 것입니다. 반면에 API에서 유형을 참조하는 경우 언어 중립적 인 방식으로 수행하는 것이 중요합니다. 호출되는 메소드 ReadInt32는 모호하지 않지만 호출 된 메소드 ReadInt는 해석이 필요합니다. 예를 들어, 발신자는에 대한 int별칭을 정의하는 언어를 사용할 수 있습니다 Int16. 닷넷 프레임 워크의 디자이너는이 패턴을 따랐다 좋은 예는에있는 BitConverter, BinaryReader그리고 Convert클래스.


답변

String의 약자이며 System.String.NET Framework 유형입니다. 에 대한 C # 언어 string의 별칭 입니다 System.String. 둘 다 System.StringIL (Intermediate Language) 로 컴파일 되므로 차이가 없습니다. 원하는 것을 선택하고 사용하십시오. C #으로 코딩 string하는 경우 C # 유형 별칭이며 C # 프로그래머가 잘 알고 있기 때문에 선호 합니다.

( int, System.Int32) 등에 대해서도 동일하게 말할 수 있습니다 .


답변

C #에서 제공된 유형 별칭을 사용하는 것에 대해 들었던 가장 좋은 대답은 Jeffrey Richter가 그의 책 CLR Via C # 에서 왔습니다 . 그의 세 가지 이유는 다음과 같습니다.

  • 코드에서 문자열 또는 문자열 을 사용할지 여부를 모르고 많은 개발자들이 혼란스러워하는 것을 보았습니다 . C #에서 문자열 (키워드)은 System.String (FCL 유형)에 정확하게 매핑되므로 차이가 없으며 둘 다 사용할 수 있습니다.
  • C #에서 longSystem.Int64로 매핑 되지만 다른 프로그래밍 언어에서는 long 으로 Int16 또는 Int32로 매핑 될 수 있습니다 . 실제로 C ++ / CLI는 실제로 Int32 로 취급 합니다. 한 언어로 된 소스 코드를 읽는 사람이 다른 프로그래밍 언어로 프로그래밍하는 데 익숙한 경우 코드의 의도를 쉽게 잘못 해석 할 수 있습니다. 사실, 대부분의 언어도 취급하지 않습니다 키워드로와하지 않습니다 컴파일 코드가 사용하는 그것.
  • FCL에는 메소드 이름의 일부로 유형 이름이있는 많은 메소드가 있습니다. 예를 들어 BinaryReader 형식은 ReadBoolean , ReadInt32 , ReadSingle 등과 같은 메서드를 제공 하고 System.Convert 형식은 ToBoolean , ToInt32 , ToSingle 등과 같은 메서드를 제공합니다 . 다음 코드를 작성하는 것이 합법적이지만 float가있는 줄은 나에게 부자연스럽고 줄이 올바른지 확실하지 않습니다.
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

그래서 당신은 그것을 가지고 있습니다. 나는 이것들이 모두 정말 좋은 포인트라고 생각합니다. 그러나 제 코드에서 Jeffrey의 조언을 사용하지 마십시오. 어쩌면 나는 C # 세계에 갇혀 있지만 코드를 프레임 워크 코드처럼 보이게하려고합니다.


답변

string예약어이지만 String클래스 이름 일뿐입니다. 이것은 string그 자체로 변수 이름으로 사용될 수 없음을 의미 합니다.

어떤 이유로 string 이라는 변수를 원한다면 다음 컴파일 중 첫 번째 만 볼 수 있습니다.

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

string 이라는 변수 이름을 정말로 원한다면 @접두사로 사용할 수 있습니다 .

StringBuilder @string = new StringBuilder();

또 다른 중요한 차이점 : 스택 오버플로는 다르게 강조 표시합니다.


답변

한 가지 차이점 이 있습니다 . 사전에 사용 String하지 않으면 사용할 수 없습니다 using System;.


답변

그것은 위에 덮여있다; 그러나 string반사에 사용할 수는 없습니다 . 를 사용해야합니다 String.