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



15 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 클래스에 있습니다.

c++

예 ( 사례 참고 ) :

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

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




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 # 세계에 너무 갇혀 있지만 프레임 워크 코드처럼 내 코드를 만들려고 노력하게 될 것입니다.




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




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

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

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




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

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




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



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

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




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




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




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




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

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

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

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

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




컨벤션 문제입니다. string 은 C / C ++ 스타일과 비슷하게 보입니다. 일반적인 규약은 선택한 언어에서 제공 한 바로 가기를 사용하는 것입니다 ( Int32 int / Int). 이것은 "객체"와 decimal 에도 해당됩니다.

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




6 년 5 개월 후 새로운 대답 (지연).

while 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다른 문맥에서 사용할 수 있습니다 . 예를 들어 네임 스페이스와 지시문 에 따라 OK 일 수 있습니다 .String local = "Hi mum!";using

더 나쁜 : Saying String.Concat(someSequence)가능성이 높습니다 ( usings 에 따라 ) 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"은 그 값 으로 변환 될 수 없습니다.




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

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

string String = "I am a string";

이 키워드 stringSystem.String키워드 문제 외에도 별칭입니다 . 둘은 정확히 동일합니다.

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



이 둘의 차이점은 없습니다 string. 그러나 다른 개발자의 소스 코드를 고려할 때 선호되는 옵션 인 것으로 보입니다.




Related