IT

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

lottoking 2020. 3. 29. 09:14
반응형

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


예 ( 사례 참고 ) :

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

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


string에 대한 C #의 별칭입니다 System.String.
따라서 기술적으로 차이는 없습니다. 그것은처럼 int 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.


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

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

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


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

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

치다:

String someString; 
string anotherString; 

stringString(대문자 "S"를 제외한) 모든면에서 동일하다. 어느 쪽의 성능 영향도 없습니다.

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


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

string C #의 유형입니다.

System.String CLR의 유형입니다.

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

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


이 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() ;

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

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


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

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


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

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


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


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다른 유형when 이면 현재 유형 안에 중첩됩니다.

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"그 가치 로 전환 될 수 없습니다.


시스템 유형을 사용하면 C #과 VB.Net 간을 쉽게 이식 할 수 있습니다.


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


string의 별칭 (또는 속기)입니다 System.String. 즉, 입력 string을 통해 의미 System.String합니다. think 링크에서 더 읽을 수 있습니다 : 'string'은 System.String의 별칭 / 속기입니다.


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 방법입니다.

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


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


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


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

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

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

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

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


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

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


다른 점이 없다.

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

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


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

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


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

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

string String = "I am a string";

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

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

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


string그러나 다른 개발자의 소스 코드를 고려할 때 옵션 사이에는 차이가 없습니다 .

참고 URL : https://stackoverflow.com/questions/215255/string-vs-string-in-c-sharp

반응형