예 ( 사례 참고 ) :
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
, 별칭은 값 유형에 대한 모든입니다. decimal
CLR의 기본 유형이 아닌 값 유형입니다. 별칭이없는 유일한 기본 유형은 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.String
IL (Intermediate Language) 로 컴파일 되므로 차이가 없습니다. 원하는 것을 선택하고 사용하십시오. C #으로 코딩 string
하는 경우 C # 유형 별칭이며 C # 프로그래머가 잘 알고 있기 때문에 선호 합니다.
( int
, System.Int32
) 등에 대해서도 동일하게 말할 수 있습니다 .
답변
C #에서 제공된 유형 별칭을 사용하는 것에 대해 들었던 가장 좋은 대답은 Jeffrey Richter가 그의 책 CLR Via C # 에서 왔습니다 . 그의 세 가지 이유는 다음과 같습니다.
- 코드에서 문자열 또는 문자열 을 사용할지 여부를 모르고 많은 개발자들이 혼란스러워하는 것을 보았습니다 . C #에서 문자열 (키워드)은 System.String (FCL 유형)에 정확하게 매핑되므로 차이가 없으며 둘 다 사용할 수 있습니다.
- C #에서 long 은 System.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
.