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




string 문자열 자르기 c++ (20)

예 ( 사례 참고 ) :

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

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


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

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

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

첫째, 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 OK 일 수 있습니다.

더 나쁜 것은 : String.Concat(someSequence) 이 (s using 에 따라 다름) Linq 확장 메소드 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 은 항상 피아노 string MyPiano.String 입니다. 멤버가 없습니다 ( static 이든 아니든). Format 이 존재하거나 기본 클래스에서 상속됩니다. 그리고 "Goodbye" 값은이 값으로 변환 될 수 없습니다.


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 을 사용해야합니다.


다른 사람들이 말했듯이 그들은 동일합니다. StyleCop 규칙은 기본적으로 String.Format , String.Join , String.Concat 등과 같은 System.String 정적 함수를 참조 할 때를 제외하고 string 을 C # 코드 스타일 모범 사례로 사용하도록 강제합니다.


소문자 stringSystem.String 의 별칭입니다. C# 에서도 동일합니다.

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


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

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

stringobject 외에도 별명은 모두 값 유형입니다. 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 중 하나의 토큰 인 정수 유형 생산이어야합니다. .. 예를 들어 변수 선언에서 사용되는 형식 생성과 반대입니다. 다른 차이점은 없습니다.

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


이 YouTube 비디오는 실제로 어떻게 다른지 보여줍니다.

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

.NET 에 대해 이야기 할 때 .NET 프레임 워크가 있고 다른 프레임 워크를 사용하는 언어 ( C# , VB.NET 등)가 있습니다.

" System.String " "일명"String "(대문자"S ")은 .NET 프레임 워크 데이터 유형이고"string "은 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 은 C.에서 System.String 에 대한 별칭입니다.
따라서 기술적으로 차이는 없습니다. int vs. System.Int32 와 같습니다.

지침에 따르면 일반적으로 객체를 참조 할 때마다 string 을 사용하는 것이 좋습니다.

예 :

string place = "world";

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

예 :

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

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

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


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


System.String 은 .NET 문자열 클래스입니다. C # stringSystem.String 의 별칭이므로 사용시 동일합니다.

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

사용중인 정수의 크기를 지정해야하고 Int16 , Int32 , UInt16 , UInt32 등을 사용하는 경향이있는 빌딩 시스템을 찾으면 String 을 사용하는 것이 더 자연스럽게 보일 수 있습니다. .net 언어를 사용하면 이해하기 쉬울 수 있습니다. 그렇지 않으면 string과 int를 사용합니다.


stringSystem.String 의 별칭입니다. 컴파일러는 그것들을 동일하게 취급 할 것입니다.

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


string 은 예약어이지만 String 은 단지 클래스 이름입니다. 이는 string 자체를 변수 이름으로 사용할 수 없음을 의미합니다.

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

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

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

StringBuilder @string = new StringBuilder();

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


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

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

string String = "I am a string";

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

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

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


다른 점이 없다.

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

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


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


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


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


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


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

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





alias