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





string c++ (25)


둘 다 동일합니다. 그러나 코딩 지침 관점에서 String 대신 String 을 사용하는 것이 좋습니다. 이것은 일반적으로 개발자가 사용하는 것입니다. 예를 들어 Int32 대신 Int32 를 사용하는 대신 Int32 에 대한 별칭을 사용할 수 있습니다.

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

예 ( 사례 참고 ) :

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

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




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




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




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



필자는 형식 지정 이유로 대문자가 아닌 .NET 형식 (별칭이 아닌)을 선호합니다. .NET 유형은 다른 오브젝트 유형과 동일하게 표시됩니다 (값 유형은 결국 올바른 오브젝트입니다).

조건 키워드 및 제어 키워드 ( if , switchreturn 과 같은)는 소문자이며 진한 파란색으로 채색되어 있습니다 (기본적으로). 그리고 나는 사용과 포맷에있어 의견 차가 생기지 않을 것입니다.

중히 여기다:

String someString; 
string anotherString; 



위에서 다뤘습니다. 그러나 리플렉션에서 string 을 사용할 수는 없습니다. String 을 사용해야합니다.




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




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




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

string 은 C #의 한 유형입니다.

System.String 은 CLR의 한 형식입니다.

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

이론적으로 Java 바이트 코드를 생성하는 C # - 컴파일러를 구현할 수 있습니다. 이 컴파일러의 합리적인 구현은 java.lang.Stringstring 을 매핑하여 Java 런타임 라이브러리와 상호 운용 할 수 있습니다.




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

유일하게 실제적인 차이점은 언급 한 바와 같이 구문 강조가 있으며 String 을 사용하는 경우 using System 을 사용 using System 작성해야한다는 것입니다.




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

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




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

가이드 라인까지는 일반적으로 객체를 참조 할 때마다 string 을 사용하는 것이 좋습니다.

string place = "world";

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

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

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

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







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




다른 점이 없다.

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

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




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 은 예약어이지만 String 은 클래스 이름입니다. 즉 string 을 변수 이름으로 사용할 수 없습니다.

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

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

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

StringBuilder @string = new StringBuilder();

또 다른 중요한 차이점은 가 다른 점을 강조한다는 것입니다.




다니엘 솔리스 (Daniel Solis)의 저서 에서이 문제에 대한 견적이 있습니다.

미리 정의 된 모든 유형은 기본 .NET 유형에 직접 매핑됩니다. C # 유형 이름 (문자열)은 .NET 유형 (String 또는 System.String)의 별칭이므로 .NET 이름을 사용하면 문법적으로 잘 작동하지만 권장하지는 않습니다. C # 프로그램 내에서 .NET 이름 대신 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 # 세계에 너무 갇혀 있지만 프레임 워크 코드처럼 내 코드를 만들려고 노력하게 될 것입니다.




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




늦게 파티에 와서 : 나는 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 참조를 변경하기를 기대합니다.




StringSystem.String 약자이며 .NET Framework 유형입니다. string System.String 의 C # 언어 별칭 입니다. 둘 다 IL (중급 언어)의 System.String 으로 컴파일되므로 아무런 차이가 없습니다. 당신이 좋아하는 것을 선택하고 그것을 사용하십시오. C #으로 코딩하면 C # 형식 별칭이고 C # 프로그래머가 잘 알고 있기 때문에 string 을 선호 string .

나는 ( int , System.Int32 )에 대해서도 똑같이 말할 수있다.




바인딩 은 이름을 코드 단위로 매핑하는 프로세스입니다.

후기 바인딩 은 이름을 사용하지만 매핑을 연기한다는 것을 의미합니다. 즉, 먼저 이름을 작성 / 언급하고 후속 프로세스에서 해당 이름에 대한 코드 매핑을 처리하도록합니다.

이제 고려해보십시오.

  • 인간과 비교할 때, 기계는 검색과 분류에 정말 능숙합니다.
  • 기계와 비교할 때, 인간은 발명과 혁신에 정말로 뛰어납니다.

따라서 짧은 대답은 다음과 같습니다. virtual 은 기계 (런타임)에 대한 후기 바인딩 명령입니다. 반면 abstract 은 휴먼 (프로그래머)에 대한 런타임 바인딩 명령입니다.

즉, virtual 이란 다음을 의미합니다.

" 런타임 에 최선을 다해 적절한 코드를이 이름에 바인딩하십시오 : 검색 "

반면 abstract 의미 :

" 프로그래머 여러분, 최선을 다해서이 코드에 적절한 코드를 묶어주십시오 : 발명 "

완전성을 위해 과부하 란 다음을 의미합니다.

" 컴파일러 님 , 최선을 다해서이 이름에 적절한 코드를 바인딩하십시오 : 정렬 ".





c# .net string types alias