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


6505

예 ( 사례 참고 ) :

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

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


72
@ORMapper하지만 실제로 남아 stringA는 어휘 는 C # 1의 구조 문법 반면 System.String단지 타입이다. 어떤 사양에서 언급 된 명백한 차이에 관계없이 , 이러한 모호한 차이가 여전히 모호하게 적용될 수 있습니다. 언어 자체 string 구현이 BCL의 특정 클래스에 대해 고려할 의무가없는 방식으로 지원 해야합니다 .
Kirk Woll

106
언어 사양에 따라, 언어 자체는 : @KirkWoll 해야한다 고려 stringBCL 유형과 정확히 동일하게 System.String, 아무것도. 전혀 모호하지 않습니다. 물론 C # 문법을 사용하여 자체 컴파일러를 구현하고 C # 언어 사양에 정의 된 것과 무관 한 임의의 토큰에 대해 발견 된 모든 토큰을 사용할 수 있습니다. 그러나 결과 언어는 C #과 유사하며 C #으로 간주 될 수 없습니다.
또는 매퍼

88
string시스템에 대한 지시문없이 사용할 수 있습니다 . 으로 할 수 없습니다 String.
Wilsu

14
Algol과 Fortran에서 온 누군가에게이 토론은에 문제가 있음을 보여줍니다 string. 약자를 사용해야 System.String하지만 별칭으로 정확히 같은 것은 아니지만 별명으로 보입니다. 그러나 몇 년 동안 C #을 한 후에는 간단하게 사용 string하고 string.Format()걱정하지 않아도 안전합니다 System.String.
Roland

8
@Sangeeta 무슨 말이야? System.String클래스는 여전히 존재하고, string키워드는 여전히의 별칭입니다. 그냥 좋아 System.Int32하고 int. 그들은 문자 그대로 같습니다.
Craig

답변:


6104

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

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

예 :

string place = "world";

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

예 :

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

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

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


163
StyleCop을 사용하기로 결정한 경우 해당 언어에 맞는 유형을 사용하라는 메시지가 표시됩니다. - 그래서 C #을 위해 당신은 문자열 (대신 문자열의), INT (대신 INT32의), 플로트 (대신에 단일의)해야합니다 stylecop.soyuz5.com/SA1121.html
도미닉 Zukiewicz

144
언젠가는 별칭으로 작동하기 때문에 언젠가 유용 할 것이라고 가정했기 때문에 항상 별칭을 사용하므로 알 필요없이 구현이 변경 될 수 있습니다.
Rob

37
Visual Studio 2015에 따르면 String.Format을 string.Format으로 변경해야한다고 Microsoft가 그렇게 생각합니다. 정적 메서드에는 항상 String을 사용했습니다.
Sami Kuhmonen

32
이것들을 읽었을 때 나는 몇 가지 의견이 단순히 틀렸다는 것을 알았습니다. @ DRAirey1 시간이 지나면 이전 방식이 여전히 최고임을 알 수 있습니다. 의심 스러우면 Visual Studio를 사용하지 않고 C # 코드를 작성해보십시오. 사실상 불가능하며 웹 개발 작업에서 때때로 발생하는 상황입니다. @Vlad String을 사용하기 위해 아무것도 가져올 필요가 없습니다. @Abhi 귀하의 의견은 의미가 없으며 똑같이 사실입니다 string.Format(). @KlitosG 아니요, 사실이 아닙니다. 그들은 모두 똑같이 작동합니다.
krowe2

46
실제로 차이가 있다는 말을 추가 할 수 있습니까? 예를 들어 : nameof(string)컴파일하지 않고 컴파일 nameof(String)합니다.
Jeroen Vannevel

3439

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

다른 사람들이 지적했듯이 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클래스.


82
열거 형의 상속 상황은 흥미 롭습니다. 별명을 열거에 사용해야하는 이유에 대한 문서를 가리킬 수 있습니까? 아니면 이것이 알려진 버그입니까?
JaredPar

149
사양의 섹션 14.1에 있습니다 (너무 길기 때문에 쉽게 인용 할 수 없습니다). 별명을 사용해야한다고 명시 적으로 말하지는 않지만 별명은 자체 유형 으로 처리됩니다. 모두 조금 이상합니다.
Jon Skeet

32
@PiPeep 다량의 공감 율보다 더 놀라운 것은 엄청난 양의 공감 율입니다 (상위 5 개 게시물에 총 2000 개가 넘는 공감 율이 있지만 그 중에서도 1 개의 공감 율이 있다고 생각하십시오). 특히 당신이 어떤 공동체에 항상 "증오 자"가 있다는 개념을 고려할 때, 나는 정말 놀라운 것을 발견했습니다.
corsiKa

40
사이 한 가지 흥미로운 차이 string와는 Stringstring' is a keyword in c#, so you can not use it as a variable name.For Ex: "안녕하세요"= 문자열 문자열; //compiler error, but String String = "hi";`는 String키워드가 아닌 identifire 와 마찬가지로 허용됩니다 .
Sanjeev Rai

33
@ SanjeevRai : 예. 마치 마치 @string식별자를 만드는 데 사용할 수 있습니다 string. 일종의 탈출 메커니즘입니다.
Jon Skeet 2013 년

715

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

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


3
`C #으로 코딩하는 경우 C # 프로그래머가 잘 알고있는 C # 유형 별칭이므로 C # 사용자가 .NET 프레임 워크를 알지 못하는 문자열을 선호합니다. 내가 일반적으로 이것이 가장 좋은 대답이라고 생각할 때 +1이지만, 내가 언급 한 요점은 이상하게 보인다.
MyDaftQuestions

4
개인적으로 "Int32"를 사용하는 것이 좋습니다. 즉, 값의 범위가 즉시 표시되기 때문입니다. 더 높은 비트 시스템에서 "int"유형을 업그레이드했다고 상상해보십시오. c에서 'int'는 "대상 프로세서가 가장 효율적으로 작업하는 정수 유형"으로 표시되며 " 최소 16 비트"로 정의됩니다. 나는 거기에 예측 가능한 일관성을 선호합니다. 대단히 감사합니다.
Nyerguds

2
@MyDaftQuestions 동의합니다. .net 유형 이 언어에 무관하고 어떤 언어와도 상관없이 유형이 명확하기 때문에 .net 유형일관되게 사용하는 것이 합리적 입니다 (F # 또는 VB의 고유성을 모두 알고 있습니까?).
복직 자 Monica

5
@Nyerguds 단순히 걱정하지 않는 데는 두 가지 이유가 있습니다. 하나는 intC # 언어 사양에서 하드웨어에 관계없이 32 비트 정수로 정의되어 있다는 것 입니다. C #은 시간이 흐르면서 공유 된 유산에도 불구하고 실제로 C가 아닙니다. int64 비트 정수로 변경하면 사양과 언어가 크게 변경됩니다. 현재 64 비트 정수 long와 마찬가지로 재정의도 필요 long합니다. 걱정할 필요가없는 또 다른 이유는 유형이 절대 변경되지 않기 때문에 .NET은 관련이 없습니다. 그러나 .NET은 99 %의 시간을 생각할 필요가 없습니다. ;-)
Craig

5
내가 어디 오래된 독점 게임 형식을 많이 파고 @Craig 않는 모든 시간에 대해 생각해야하지만,. 그리고 사용 Int16, Int32그리고 Int64A는 많은 오히려 nondescriptive를 사용하는 것보다 코드에 더욱 투명 short, int그리고long
Nyerguds

504

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 # 세계에 갇혀 있지만 코드를 프레임 워크 코드처럼 보이게하려고합니다.


24
두 번째 포인트는 이유처럼 실제로 소리 없는 사용에 string, int
MauganRa

15
@MauganRa 그리고이 책의 저자는 그가 별칭을 사용하지 않는 이유에 대해 설명 합니다.
tomi.lee.jones

31
"누군가 C # 소스 코드를 읽는 경우 다른 언어 사양이 아닌 언어 사양에 따라 오랫동안 해석해야합니다." 그것은 요점을 완전히 놓친 것입니다. 어떤 사람이 코드를 잘못 해석 하려는 것은 아니며 , 프로그래머가 다른 맥락에서 매일 보는 유형과 다른 의미를 가질 때 두뇌가 잘못된 결론으로 ​​넘어 가기 쉽습니다. 우리는 모두 실수를 해요; 명시 적으로 명명 된 형식을 사용하면 이러한 실수가 줄어 듭니다.
Darryl

10
+ 이러한 이유는 그 문제에 대한 나의 감정을 요약합니다. C #에서 코딩을 시작했을 때 (Java / C ++ / C 백그라운드에서 온) 별칭이 추악하다고 생각했습니다. 나는 아직도 그런 식으로 느끼지만 불행히도 대부분의 세계는 나에게 동의하지 않는 것 같거나 신경 쓰지 않으므로 소문자를 사용합니다.
gusgorman

8
@jinzai 문제는 long플랫폼이나 컴파일러에 관계없이 부호있는 64 비트 정수로 정의 되는 C #에 관한 것 입니다. 적어도 어떤 경우에는 그래서, 그래, 그것은 않는 언어에 따라 달라집니다.
phoog

455

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

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

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

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

StringBuilder @string = new StringBuilder();

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


20
로컬 @string이름은 PDB에만 존재하므로 로컬 호출 은 실제로 의미가 없습니다. 그것을 _string또는 무엇 이라고 부를 수도 있습니다. 리플렉션을 통해 액세스 가능한 이름을 가진 것들에 대해 더 의미 @string가 있습니다 "string".
로마 Starkov

25
또한 예약 된 단어를 변수 이름으로 사용하는 것은 매우 중요하지 않습니다.
Elton

7
OP는 변수 이름으로 문자열 또는 문자열을 사용하지 않습니다. 그들은이 유형 들 사이의 차이점에 대한 설명을 요청했다 . 귀하의 답변은 더 혼란
스러운

1
사람들이 매듭을 묶는 방법을 가르치는 소프트웨어를 작성한다면 @craig?
Simon_Weaver

5
@Simon_Weaver 문자열의 매듭? 하하, 좋아 :-) 물론 스레드와 같은 다른 이름을 선택할 수 있습니다. 잠깐만 ... D' oh!
Craig

391

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


14
기본적으로 대부분의 사람들은 파일 맨 위에 어떤 방식 으로든 이것을 추가합니다. VS는 대부분의 경우 기본적 으로이 작업을 수행합니다!
IbrarMumtaz

9
기본적으로 using필요한 문장 만 추가 하고 필요 없는 내용은 명시 적으로 제거합니다. Power Productivity Tools> "[x] 저장시 사용 제거 및 포맷"
JMD

2
@JMD .cs 템플릿 파일을 수정하여 맨 위에 사용 문이 없도록했습니다! 또한 클래스 템플릿을로 변경했습니다 internal sealed.
ErikE

@JMD 나는 그 기능이 싫어. 때로는 변경되지 않은 파일을 변경하여 변경 세트에 포함 된 실제 변경 사항을 확인하기 어렵습니다. 물론 나는 보통 "스팸 사용"을 제거하지만 능동적으로 만 자동으로 제거하지는 않습니다.
mg30rg 2019

C #에서는 그렇지만 모든 .NET 언어는 아닙니다. (Powershell은 기본적으로 시스템 네임 스페이스를 가져옵니다.)
FSCKur

311

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


6
이 답변의 의미와 왜 불쾌한 지 이해가되지 않습니다. typeof(string)반성에 사용할 수 있습니다 . 예 1 : if (someMethodInfo.ReturnType == typeof(string)) { ... }예 2 : 두 번째 var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance);String아닌 어디를 사용해야 string합니까? Type.GetType("String")또는 과 같은 것을 시도 Type.GetType("string")하면 네임 스페이스가 없기 때문에 클래스를 찾지 못합니다. 일부 경우 바보 이유 당신이 비교 .Name에 유형의 "string"대소 문자를 구분하는 방법으로, 당신은 맞다.
Jeppe Stig Nielsen

256

System.String.NET 문자열 클래스입니다-C # string의 별칭입니다 System.String. 사용 중 동일합니다.

지침에 관해서는 너무 혼란스럽지 않고 당신이 느끼는 것을 사용하십시오-인생에 더 중요한 것들이 있으며 코드는 어쨌든 동일합니다.

당신은 당신이 사용하고있는 정수의 크기를 지정하는 것이 필요하다 시스템을 구축 자신을 발견하고 그래서 사용하는 경향이 경우 Int16, Int32, UInt16, UInt32등 그것은 사용하는 것이 더 자연 보일 수 있습니다 String- 다른 .NET 언어 사이의 주위에 이동하는 경우는 수도 일을 더 이해할 수있게하십시오. 그렇지 않으면 string과 int를 사용합니다.


2
하나만 골라 일관성을 유지하십시오. 집 스타일로 어딘가에서 일한다면 그것을 사용하십시오.
Alan B

3
불행히도 스타일은 개인적인 취향이며 전용 코드 소유자가없는 여러 팀의 대규모 코드 기반으로 시행하기에는 너무 비쌀 수 있습니다. 문자열 대 문자열보다는 항상 처리해야 할 중요한 문제가 있습니다. 이것은 우리를 "삶에서 더 중요한 것들"로 다시 데려옵니다
aiodintsov

이것은 분명히 선호되는 것입니다. 예를 들면 : 내가 사용하는 것을 선호 short, int, ushort, uint대신 Int16이 내가 배운 방법입니다 주로 때문에 등. 물론 Int16경험이 적은 사람들은 즉시 이해하기가 더 쉽습니다. +1 나에게서!
Candleshark

210

.NET형식상의 이유로 별명 대신 대문자로 된 유형을 선호합니다 . .NET종류가 다른 오브젝트 타입 (타입 값은 결국, 적절한 객체)와 같은 착색된다.

조건부 및 제어 키워드 (예 if: switch, 및 return)는 소문자이며 진한 파란색 (기본)입니다. 그리고 나는 사용과 형식에 대한 의견 불일치가 없습니다.

치다:

String someString; 
string anotherString; 

11
다음과 같은 코드도 작성하십시오. Int32 i = 1; int i = 1이 아니라; ? 사용 가능한 문자열 별칭을 사용하지 않는 것으로 보입니다.
bytedev

29
@nashwan : 실제로, 예, 나는 전자가 내 의도에 Int32 i=1;비해 int i = 1;더 읽기 쉬운 것을 발견 하지 못했습니다 . 즉, 32 비트 부호있는 정수를 원한다는 것입니다.
NotMe

5
글쎄, 개발자가 C # 코드 (문자열) 또는 .NET 코드 (문자열)를 작성한다고 생각하는지 여부에 따라 달라집니다. 개인적으로 저는 C #을 쓰고 있다고 생각합니다 (그리고 .NET을 사용하는 C #입니다).
bytedev

7
@ 알렉스 : 내 요점은 단순히 모호성을 제거하기 위해 코딩에 매우 구체적 인 것을 선호한다는 것입니다.
NotMe

22
스펙트럼의 절대 다른 쪽 끝에서 나는 거의 항상 사용합니다var
tic

192

stringString(대문자 "S"를 제외한) 모든면에서 동일하다. 성능에 영향을주지 않습니다.

string구문 강조로 인해 대부분의 프로젝트에서 소문자 를 선호합니다


Jeffrey Richter는 모든 경우에 CLR 유형 (C #을 통한 CLR)을 사용하여 여기서 일어나는 혼란을 정확히 피할 것을 권장합니다.
Josh

분명히 S를 사용하든 s를 사용하든이 질문을 일으켰을 것이므로 Richter에게 투표하십시오. ;)
Brad Wilson

Richter는 문자열이 옵션이 아니어야한다는 것을 의미했습니다. Microsoft는 언어로 문자열을 사용해서는 안됩니다. 당신은 리히터에게 투표를 할 수 없습니다-그는 전설입니다! :)
Joe Ratzer 2009 년

1
별칭을 전혀 사용하지 않는 것이 더 나을 수도 있음에 동의 합니다. 그러나 우리가 그것들을 가지고 있다고 생각하면 그것들을 사용하는 것이 좋다고 생각합니다 (그러나 메소드 이름은 아닙니다)
Jon Skeet

10
"문자열"은 "문자열"과 다릅니다. "System.String"을 의미합니다. "String"을 사용한다면 네임 스페이스를 포함시키기 위해 "using System"을
넣어야

185

C #은 CLR과 함께 사용되는 언어입니다.

string C #의 유형입니다.

System.String CLR의 유형입니다.

C #과 함께 C #을 사용하면에 CLR string이 매핑됩니다 System.String.

이론적으로 Java 바이트 코드를 생성 한 C # 컴파일러를 구현할 수 있습니다. 이 컴파일러의 합리적인 구현은 아마지도 할 stringjava.lang.String자바 런타임 라이브러리와 상호 운용하기 위해.


1
stringC # 의 유형 이 아닙니다 . CLR의 유형에 매핑되는 예약어입니다.
CesarGon

@CesarGon : ECMA-334, 섹션 8.2.1에 따르면 : "C #은 사전 정의 된 유형 세트를 제공합니다. [...] 사전 정의 된 참조 유형은 객체 및 문자열입니다."
라스무스 파버

10
ECMA-334, 섹션 9.4.3에 따르면 "문자열"은 키워드입니다. :-) 의미에 중점을두면 "문자열"은 유형이지만 구문에 중점을두면 키워드 (예 : 예약어)라고 말하고 싶습니다. 표준은 두 가지 관점을 모두 뒷받침합니다 (아마도 모호합니다!). 나에게 OP는 구문에 관한 것이므로 답변을 볼 때 구문에 집중하는 경향이 있지만 요점도 보입니다. 또한, 귀하의 대답은 그대로 두 가지 다른 유형이 존재한다는 것을 의미하는 것으로 해석 될 수 있습니다 : 문자열과 문자열, 그렇지 않은 경우. 하나는 다른 하나에 대한 매핑입니다.
CesarGon

이것에 대해 분명히합시다. 'string'은 예약 된 별명입니다. 실제 데이터 유형이 아닙니다. 그것은 다른 것을 가리키는 것입니다. 이 별명을 모두 제거하거나 사용하지 않을 수 있으며 프로그래밍 언어가 완벽합니다.
Quarkly

168

이 YouTube 동영상은 실제로 어떻게 다른지 보여줍니다.

그러나 지금은 긴 텍스트 답변입니다.

우리가 이야기 할 때 .NET다른 두 가지가 하나가 .NET프레임 워크와 다른 언어 (이 있습니다 C#, VB.NET그 프레임 워크를 사용하는 등).

여기에 이미지 설명을 입력하십시오

" System.String"일명 "문자열"(대문자 "S")은 .NET프레임 워크 데이터 유형이고 "문자열"은 C#데이터 유형입니다.

여기에 이미지 설명을 입력하십시오

간단히 말해서 "String"은 "string"의 별명 (다른 이름으로 호출 된 것과 동일한 것)입니다. 따라서 기술적으로 아래 코드 문은 모두 동일한 출력을 제공합니다.

String s = "I am String";

또는

string s = "I am String";

같은 방법으로 다른 c # 데이터 형식에 대한 별칭이 아래와 같습니다.

object : System.Object, string : System.String, bool : System.Boolean, byte : System.Byte, sbyte : System.SByte, short : System.Int16

프로그래머의 관점에서 볼 때 백만 달러짜리 질문 "String"과 "string"은 언제 사용합니까?

혼동을 피하기 위해 가장 먼저해야 할 일은 일관성있게 사용하는 것입니다. 그러나 모범 사례 관점에서 변수 선언을 할 때는 "문자열"(작은 "s")을 사용하는 것이 좋으며 클래스 이름으로 사용하는 경우 "문자열"(자본 "S")이 선호됩니다.

아래 코드에서 왼쪽은 변수 선언이며 "string"을 사용하여 선언되었습니다. 오른쪽에서 우리는 메소드를 호출하여 "String"이 더 합리적입니다.

string s = String.ToUpper() ;

25
"즉,"문자열 "은"문자열 "의 별명 (다른 이름으로 호출 된 것과 동일한 것)입니다. 이것은 정확하지 않습니다. 별명이 "문자열"입니다.
Xavier Egea 12

3
변수 선언을 할 때는 "string"(작은 "s")을 사용하는 것이 좋으며 클래스 이름으로 사용하는 경우 "String"(자본 "S")이 선호됩니다. 이 컨벤션은 더 이상 유효하지 않은 것 같습니다. Visual Studio 2015를 사용하여 작성하려고 String하면 "코드를 단순화"하고 다음을 수행하도록 제안하십시오 string.
Massimiliano Kraus

165

소문자 string는의 별칭입니다 System.String. 그들은에서 동일 C#합니다.

당신은 시스템 유형 (사용할지 여부를 통해 논쟁이있다 System.Int32, System.String등) 유형 또는 C# aliases( int, string, 등). 나는 개인적으로 당신이을 사용해야한다고 생각 C# aliases하지만, 그것은 내 개인적인 취향 일뿐입니다.


4
문제입니다. 'C #'별칭이 아니며 'C'별칭입니다. C # 언어에는 기본 '문자열'또는 'int'가 없으며 구문 설탕 만 있습니다.
Quarkly

16
C # 5 언어 사양에서 "키워드 문자열은 미리 정의 된 클래스 System.String의 별칭"이므로 "C"가 어디에서 왔는지 확실하지 않습니다. 85 페이지의 단락 4.2.4. 모든 고급 언어는 CPU 명령어 세트와 바이트 코드에 대한 구문 설탕입니다.
aiodintsov

156

string에 대한 별칭 일뿐입니다 System.String. 컴파일러는 그것들을 동일하게 취급 할 것입니다.

실용적인 차이점은 언급 한대로 구문 강조 표시이며 using System를 사용하는 경우 작성 해야합니다 String.


String을 사용하기 위해 System을 접두사로 사용할 필요는 없습니다.
Joe Ratzer

18
using System사용할 때 를 포함해야합니다 String. 그렇지 않으면 다음 오류가 발생합니다.The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
Ronald

143

둘 다 동일합니다. 그러나 코딩 지침의 관점에서는 string대신 사용하는 것이 좋습니다 String. 이것이 일반적으로 개발자들이 사용하는 것입니다. 대신 사용의 예를 들어 Int32우리가 사용하는이 int같은 int에 별명입니다Int32

참고 "키워드 문자열은 단순히 사전 정의 된 클래스의 별칭입니다 System.String." -C # 언어 사양 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx


120

다른 사람들이 말했듯이 그들은 동일합니다. StyleCop 규칙은 기본적으로 사용할 시행한다 string는 C # 코드 스타일로 참조 할 때를 제외하고 가장 좋은 방법은, System.String같은 정적 함수, String.Format, String.Join, String.Concat, 등 ...


4
정적 메서드를 제외하고 StyleCop이 String 사용을 플래그로 지정한다는 것을 알지 못했습니다. 정적 멤버에 액세스 할 때 유형 선언을위한 문자열과 문자열을 항상 사용하는 방식이므로 훌륭하다고 생각합니다.
Goyuix

101

6 년 5 개월 후의 새로운 답변 (발견).

string항상 고정 된 의미를 갖는 예약 된 C # 키워드 이지만 , 무엇이든 참조 할 수 String있는 일반적인 식별자 일뿐 입니다. 현재 유형의 멤버에 따라 현재 네임 스페이스와 적용된 using지시문 및 해당 배치 String는 값 또는 고유 한 유형일 수 있습니다 global::System.String.

using지시어가 도움이되지 않는 두 가지 예를 제시 하겠습니다 .


먼저, 현재 유형 (또는 지역 변수) String 은 다음과 같습니다.

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

위의 IEnumerable<>정적이 아닌 멤버가 없기 때문에 위의 코드는 컴파일 되지 않으며 Format확장 메서드가 적용되지 않습니다. 위의 경우, 유형 이 구문 상 유일한 가능성이있는 String다른 상황에서 여전히 사용할 수 있습니다 . 예를 들어 네임 스페이스 및 지시문 에 따라 정상일 수 있습니다 .String local = "Hi mum!";using

더 나쁜 것은 : s String.Concat(someSequence)에 따라 아마 usingLinq 확장 방법으로 갈 것 Enumerable.Concat입니다. 정적 메소드로 이동하지 않습니다 string.Concat.


두 번째로, String다른 유형 인 경우 현재 유형 내에 중첩됩니다.

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Example메소드의 명령문은 컴파일 되지 않습니다 . 여기 String에는 항상 피아노 MyPiano.String있습니다. 멤버가 static없거나 Format기본 클래스에서 상속 된 멤버가 없습니다 . 그리고 그 가치 "Goodbye"는 그 가치 로 전환 될 수 없습니다.


4
나는 악마가 될 수 있다고 생각합니다 using String = System.Int32; using Int32 = System.String; . 그런 다음 버그를 세십시오.
Steve

7
이것이 정답입니다. string입니다 System.String. String무엇이든 될 수 있습니다.
Dave Cousineau

@DaveCousineau에 동의-그게 별칭의 요점입니다. StringSystem.String 개체로 설정되지 않은 다른 유형을 만들 수 있습니다 . 체크 아웃 : blog.paranoidcoding.com/2019/04/08/…
Kristopher

"키워드 string는 C #에서 구체적인 의미를 갖습니다. System.String핵심 런타임 어셈블리에 존재 하는 유형 입니다. 런타임은 본질적으로이 유형을 이해하고 개발자 strings가 .NET에서 기대할 수있는 기능을 제공합니다 . C #의 존재는 해당 유형이 코드 줄을 파싱하기 전에 컴파일러가 종료 string되므로 C # 코드에서 정확하고 명확한 의미를 가지 String므로 C #에서는 구체적인 의미는 없지만 식별자는 모든 이름 조회 규칙을 통과하는 식별자입니다. as Widget,, Student등… "
Kristopher



87

무슨 일이 다른 프로그래머들 사이 일반적인 관행 것 같다 반대, 내가 선호하는 String이상 string단지 사실을 강조하기 위해, String존 소총가 언급 한 바와 같이, 참조 형식입니다.



78

Ritchers 책에서 lfousts 답변에 이것을 추가하고 싶습니다.

C # 언어 사양에는 "스타일에 따라 전체 시스템 유형 이름보다 키워드를 사용하는 것이 좋습니다." 언어 사양에 동의하지 않습니다. FCL 유형 이름을 사용하고 기본 유형 이름을 완전히 피하는 것을 선호합니다. 실제로 컴파일러가 기본 유형 이름을 제공하지 않았고 개발자가 FCL 유형 이름을 대신 사용하도록 강요했습니다. 내 이유는 다음과 같습니다.

  • 코드에서 문자열 또는 문자열 을 사용할지 여부를 모르고 많은 개발자들이 혼란스러워하는 것을 보았습니다 . C # 문자열 (키워드)에서 System.String (FCL 유형)에 정확하게 매핑 되므로 차이가 없으며 둘 다 사용할 수 있습니다. 마찬가지로 일부 개발자 는 응용 프로그램이 32 비트 OS에서 실행될 때 int 가 32 비트 정수를 나타내고 응용 프로그램이 64 비트 OS에서 실행될 때 64 비트 정수를 나타낸다고 말합니다. 이 문장은 절대로 거짓입니다. C #에서 int는 항상 System.Int32에 매핑 되므로 코드가 실행되는 OS에 관계없이 32 비트 정수를 나타냅니다. 프로그래머가코드에서 Int32 를 사용하면 이러한 잠재적 혼란도 제거됩니다.

  • 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
  • C #을 독점적으로 사용하는 많은 프로그래머는 다른 프로그래밍 언어가 CLR에 대해 사용될 수 있다는 사실을 잊어 버리는 경향이 있으며, 이로 인해 C # -ism은 클래스 라이브러리 코드로 들어갑니다. 예를 들어, Microsoft의 FCL은 거의 독점적으로 C #으로 작성되었으며 FCL 팀의 개발자는 이제 ArrayGetLongLength 와 같은 메소드를 라이브러리에 도입 하여 C # 에서는 길지만 C ++과 같은 다른 언어 로는 Int64 값을 반환합니다. / CLI). 또 다른 예는 System.Linq.Enumerable s LongCount 방법입니다.

나는 완전한 단락을 읽기 전에 그의 의견을 얻지 못했습니다.


72

문자열 ( System.String)은 기본 클래스 라이브러리의 클래스입니다. string (소문자)은 C #에서 예약 된 작업으로 System.String의 별칭입니다. Int32와 int는 비슷한 상황입니다 Boolean vs. bool. 이러한 C # 언어 별 키워드를 사용하면 C와 유사한 스타일로 기본 요소를 선언 할 수 있습니다.


67

String키워드가 아니며 식별자로 사용할 수 있지만 string키워드는 식별자로 사용할 수 없습니다. 그리고 기능적인 관점에서 둘 다 동일합니다.


67

정말 관습의 문제입니다. stringC / C ++ 스타일처럼 보입니다. 일반적인 규칙은 선택한 언어가 제공 한 모든 단축키 (int / Int for Int32)를 사용하는 것입니다. 이것은 "객체"와 decimal함께갑니다.

이론적으로 이것은 "int"가 의미하는 미래의 64 비트 표준으로 코드를 이식하는 데 도움이 될 수 Int64있지만, 요점은 아니며 업그레이드 마법사가 int참조를 변경 Int32하기 위해 안전하다고 생각합니다.


66

파티에 늦게 오는 : 나는 CLR 유형 시간의 100 %를 사용합니다 (물론, 경우를 제외시켰다 강제 는 C # 형식을 사용하는 것이 아니라 마지막 시간이었다 그 때 나는 기억하지 않는다).

Ritchie의 CLR 서적에 따라 원래 몇 년 전에 작업을 시작했습니다. 모든 CLR 언어는 궁극적으로 CLR 유형 집합을 지원할 수 있어야하므로 CLR 유형을 사용하면 더 명확하고 "재사용 가능한"코드가 제공됩니다.

이제 몇 년 동안 해왔으므로 습관이되고 VS가 CLR 유형에 대해 보여주는 채색이 마음에 듭니다.

유일한 단점은 자동 완성이 C # 유형을 사용한다는 것입니다. 따라서 자동 생성 된 유형을 다시 입력하여 CLR 유형을 대신 지정합니다.

또한, "int"또는 "string"을 볼 때 1970 년대 C 코드를보고있는 것처럼 그것은 나에게 정말로 잘못 보입니다.


49

다른 점이 없다.

C # 키워드 string는 .NET 유형에 매핑 System.String됩니다. 이는 언어의 명명 규칙을 유지하는 별칭입니다.

마찬가지로에 int매핑됩니다 System.Int32.


64 비트 빌드에서 int는 System.Int64 (8 바이트)에 매핑되고 32 비트 빌드에서는 System.Int32 (4 바이트)에 매핑됩니다.
Alex

1
IntPtr 및 UIntPtr은 플랫폼에 따라 크기가 변경되는 유일한 유형입니다 ( [U] IntPtr 또는 실제 포인터로 구성된 유형과 같은 실제 포인터 유형은 무시 int*).
P 아빠

45

Daniel Solis의 저서 에서이 문제에 대한 인용문이 있습니다.

미리 정의 된 모든 유형은 기본 .NET 유형에 직접 매핑됩니다. C # 형식 이름 (문자열)은 단순히 .NET 형식 (문자열 또는 System.String)의 별칭이므로 .NET 이름을 사용하는 것은 권장되지 않지만 구문 상으로는 잘 작동합니다. C # 프로그램 내에서 .NET 이름 대신 C # 이름을 사용해야합니다.


41

string 은 키워드이므로 string을 식별자로 사용할 수 없습니다.

문자열 은 키워드가 아니며 식별자로 사용할 수 있습니다.

string String = "I am a string";

키워드 stringSystem.String키워드 문제 를 제외하고 는 별명이며 둘은 정확히 동일합니다.

 typeof(string) == typeof(String) == typeof(System.String)

2
유일한 작은 차이점은 String 클래스를 사용하는 경우 파일 맨 위에 System 네임 스페이스를 가져와야하지만 string 키워드를 사용할 때는이 작업을 수행 할 필요가 없다는 것입니다.
Uttam

등식 명령문이 실패하는 간단한 유스 케이스가 있습니다. blah 네임 스페이스에서 유형 호출 문자열을 정의하고 해당 네임 스페이스를 등식 명령문이 실행중인 파일로 가져 오는 것과 같습니다.
rick

40

네, 그냥 같은 그들 사이에 차이가 없다 bool하고 Boolean.


40

@JaredPar (C # 컴파일러 개발자 및 많은 SO 사용자!)는 이 문제에 대한 훌륭한 블로그 게시물 을 작성했습니다 . 여기에서 공유 할 가치가 있다고 생각합니다. 우리의 주제에 대한 좋은 관점입니다.

stringvs. String는 스타일 토론이 아닙니다

[...]

키워드 string는 C #에서 구체적인 의미를 갖습니다. System.String핵심 런타임 어셈블리에 존재 하는 유형 입니다. 런타임은 본질적으로이 유형을 이해하고 개발자가 .NET의 문자열에 기대하는 기능을 제공합니다. 그 존재는 C #에 매우 중요하므로 해당 유형이 존재하지 않으면 코드 줄을 구문 분석하기 전에 컴파일러가 종료됩니다. 따라서 stringC # 코드에서 정확하고 명확한 의미를 갖습니다.

StringC #에서는 식별자에 구체적인 의미가 없습니다. 그것은 모든 이름 조회 규칙 통과 식별자 인 Widget, Student등 ..이 문자열에 결합 할 수 있거나 다른 조립체 전적으로 그 목적보다 완전히 상이 할 수있는 타입의 결합 있었다 string. 더 나쁜 것은 코드와 같은 방식으로 정의 될 수 있습니다 String s = "hello". 계속 컴파일했다.

class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}

실제 의미 String는 항상 이름 확인에 달려 있습니다. 이는 프로젝트의 모든 소스 파일과 참조 된 모든 어셈블리에 정의 된 모든 유형에 따라 달라집니다. 즉 그것은 문맥을 꽤 필요로 알고 무슨 뜻인지.

사실 대부분의 경우에 것을 String하고 string동일한 유형에 바인딩됩니다. 그러나 String여전히 사용 한다는 것은 하나의 정답 만있는 곳에서 개발자가 프로그램을 해석 할 수 있도록하는 것을 의미합니다. String잘못된 유형에 바인딩 하면 개발자가 몇 시간 동안 디버깅하고 컴파일러 팀에 버그를 제기하고 일반적으로을 사용하여 절약 할 수있는 시간을 낭비 할 수 string있습니다.

차이점을 시각화하는 또 다른 방법은이 샘플을 사용하는 것입니다.

string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code

많은 사람들은 이것이 기술적으로 정확한 정보 String이지만, 코드베이스가이 이름의 유형을 정의하는 것은 매우 드물기 때문에 여전히 사용하기에 충분하다고 주장합니다 . 또는 String정의 되면 잘못된 코드베이스의 표시입니다.

[...]

당신은 그 볼 String이 라이브러리의 경우 ... 등 반사 헬퍼, 직렬화 라이브러리, 렉서, 프로토콜 : 완전히 유효한 목적의 숫자에 대해 정의 된 Stringstring코드가 사용되는 위치에 따라 실제 결과를 초래한다.

따라서 Stringstring토론 을 볼 때 이것이 스타일이 아니라 시맨틱에 관한 것임을 기억하십시오 . 문자열을 선택하면 코드 기반에 뚜렷한 의미가 있습니다. 선택 String하는 것은 잘못이 아니지만 앞으로 놀랍게도 문을 열어두고 있습니다.

참고 : 보관 이유 때문에 대부분의 블로그 게시물을 복사 / 붙여 넣었습니다. 일부 부분은 무시하므로 가능하면 블로그 게시물 을 건너 뛰고 읽는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.