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


Answers

완전성을 위해서, 여기에 관련된 정보의 두뇌 덤프가 있습니다 ...

다른 사람들이 언급했듯이 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 리터럴이 가능하며 별칭도 있습니다.)

별명을 사용해야하는 한 가지 상황이 있습니다. 명시 적으로 enum의 기본 유형을 지정할 때입니다. 예를 들면 :

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

이는 사양에서 enum 선언을 정의하는 방식의 문제입니다. 콜론이 sbyte , byte , short , ushort , int , uint , long , ulong , char 중 하나의 토큰 인 통합 유형 프로덕션이어야하는 부분입니다. .. 예를 들어 변수 선언에서 사용되는 타입 프로덕션과는 대조적입니다. 다른 차이점을 나타내지는 않습니다.

마지막으로, 사용할 때 : 개인적으로 구현을 위해 별칭을 사용하지만 모든 API의 CLR 유형을 사용합니다. 구현 측면에서 사용하는 것은별로 중요하지 않습니다. 팀 간의 일관성은 좋지만 아무도 신경 쓰지 않을 것입니다. 반면에 API의 유형을 참조하면 언어 중립적 인 방식으로 그렇게하는 것이 중요합니다. ReadInt32 라는 ReadInt32 는 모호하지 않지만 ReadInt 메서드는 해석이 필요합니다. 호출자는 예를 들어 Int16int 별칭을 정의하는 언어를 사용할 수 있습니다. .NET Framework 설계자는이 패턴을 따라 BitConverter 좋은 예가 BitConverter , BinaryReaderConvert 클래스에 있습니다.

Question

예 ( 사례 참고 ) :

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

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




There is no difference between the two - string , however, appears to be the preferred option when considering other developers' source code.




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

하지만 지금은 긴 텍스트 답변입니다.

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

" System.String "일명 "String"(대문자 "S")은 .NET Framework 데이터 형식이고 "string"은 C# 데이터 형식입니다.

간단히 말해서 "문자열"은 "문자열"의 별칭 (다른 이름으로 불리는 동일한 것)입니다. 따라서 기술적으로 아래의 두 코드 구문 모두 동일한 출력을 제공합니다.

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

이제 프로그래머의 관점에서 볼 때 백만 달러의 질문입니다. "문자열"과 "문자열"을 언제 사용해야합니까?

혼란을 피하기위한 첫 번째 일은 일관되게 그들 중 하나를 사용하십시오. 그러나 모범 사례 관점에서 변수 선언을 할 때는 "문자열"(작은 "s")을 사용하는 것이 좋으며 클래스 이름으로 사용할 때는 "문자열"(대문자 "S")을 사용하는 것이 좋습니다.

아래 코드에서 왼쪽은 변수 선언이고 "string"을 사용하여 선언됩니다. 오른쪽에서 우리는 메서드를 호출하므로 "String"이 더 현명합니다.

string s = String.ToUpper() ;



늦게 파티에 와서 : 나는 CLR 형식을 100 % 사용합니다 (C # 형식을 사용 하도록 강요 하는 경우를 제외하고 글쎄, 마지막 시간은 기억이 안납니다).

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

이제까지 수년간 해왔으므로 습관인데 VS에서 CLR 유형에 대해 보여주는 색상이 마음에 들었습니다.

유일한 진정한 단점은 자동 완성 기능이 C # 형식을 사용하므로 CLR 형식을 지정하기 위해 자동 생성 된 형식을 다시 입력하는 것입니다.

또한, "int"또는 "string"을 볼 때, 1970 년의 C 코드를 보는 것처럼 나에게 정말로 잘못되었습니다.




C #에서 제공된 유형 별칭을 사용하는 것에 대해 내가 들어 본 최고의 답변은 제프리 리히터 (Jeffrey Richter)의 책 CLR C #에서 나온 것입니다. 그의 3 가지 이유는 다음과 같습니다.

  • 여러 개발자가 코드에서 문자열 또는 문자열 중 어떤 것을 사용할 지 알지 못하고 혼란 스러웠습니다. C #에서는 문자열 (키워드)이 System.String (FCL 유형)에 정확히 매핑되기 때문에 차이가 없으며 둘 중 하나를 사용할 수 있습니다.
  • C #에서는 longSystem.Int64에 매핑되지만 다른 프로그래밍 언어에서는 LongInt16 또는 Int32에 매핑 될 수 있습니다. 실제로 C ++ / CLI는 사실 Int32 와 같이 오래 취급합니다. 하나의 언어로 소스 코드를 읽는 누군가는 다른 프로그래밍 언어로 프로그래밍하는 데 익숙하다면 코드의 의도를 쉽게 오해 할 수 있습니다. 사실, 대부분의 언어는 키워드로 오래 취급하지 않으며 그것을 사용하는 코드를 컴파일하지 않습니다.
  • FCL에는 메소드 이름의 일부로 유형 이름을 갖는 많은 메소드가 있습니다. 예를 들어, BinaryReader 형식은 ReadBoolean , ReadInt32 , ReadSingle 등과 같은 메서드를 제공하고 System.Convert 형식은 ToBoolean , ToInt32 , ToSingle 등과 같은 메서드를 제공합니다. 다음 코드를 작성하는 것이 합법적이지만 플로트가있는 행은 나에게 부 자연스러운 느낌을 가지며 행이 올바른지 확실하지 않습니다.
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // Ok, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

그래서 거기 있습니다. 나는 이것이 모두 좋은 점이라고 생각한다. 그러나 제프리의 조언을 제 자신의 코드로 사용해서는 안됩니다. 어쩌면 나는 C # 세계에 너무 갇혀 있지만 프레임 워크 코드처럼 내 코드를 만들려고 노력하게 될 것입니다.




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




Yes, that's no difference between them, just like the bool and Boolean .




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

가이드 라인에 관해서는 너무 느긋 해져서 당신이 좋아하는 것을 사용해서는 안됩니다. 인생에서 더 중요한 것들이 있고 코드는 어쨌든 똑같을 것입니다.

사용중인 정수의 크기를 지정해야하는 곳에서 시스템을 구축하면 Int16 , Int32 , UInt16 , UInt32 등을 사용하는 경향이 있습니다. 그러면 String 을 사용하는 것이 더 자연스러워 보일 수 있습니다. .net 언어를 사용하면 더 쉽게 이해할 수 있습니다. 그렇지 않으면 string과 int를 사용합니다.




다른 프로그래머들 사이에 일반적인 관행 인 것처럼 보이지만 String 보다 String 을 선호합니다. Jon Skeet이 언급 한 것처럼 String 이 참조 유형이라는 사실을 강조하기 위해.




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

소문자 string 은 구문 강조 표시로 인해 대부분의 프로젝트에서 선호됩니다.




New answer after 6 years and 5 months (procrastination).

While string is a reserved C# keyword that always has a fixed meaning, String is just an ordinary identifier which could refer to anything. Depending on members of the current type, the current namespace and the applied using directives and their placement, String could be a value or a type distinct from global::System.String .

I shall provide two examples where using directives will not help .

First, when String is a value of the current type (or a local variable):

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

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

The above will not compile because IEnumerable<> does not have a non-static member called Format , and no extension methods apply. In the above case, it may still be possible to use String in other contexts where a type is the only possibility syntactically. For example String local = "Hi mum!"; could be OK (depending on namespace and using directives).

Worse: Saying String.Concat(someSequence) will likely (depending on using s) go to the Linq extension method Enumerable.Concat . It will not go to the static method string.Concat .

Secondly, when String is another type , nested inside the current type:

class MyPiano
{
  protected class String
  {
  }

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

Neither statement in the Example method compiles. Here String is always a piano string , MyPiano.String . No member ( static or not) Format exists on it (or is inherited from its base class). And the value "Goodbye" cannot be converted into it.




다른 사람들이 말하는 것처럼, 그들은 동일합니다. StyleCop 규칙은 기본적으로 String.Format , String.Join , String.Concat 등의 System.String 정적 함수를 참조하는 경우를 제외하고 C # 코드 스타일 모범 사례로 string 을 사용하도록 string .




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

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




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




컨벤션 문제입니다. "문자열"은 C / C ++ 스타일과 비슷합니다. 일반적인 규약은 선택한 언어에서 제공 한 바로 가기를 사용하는 것입니다 (Int32의 경우 int / Int). 이것은 "object"와 "decimal"에도 적용됩니다.

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




Related