문제

예 (사건을 기록하다):

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가 사용하는 경향이 있는 스타일입니다. 그들의 예.

이 부분에 대한 지침이 다음과 같이 변경되었을 수 있습니다. 스타일캅 이제 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, 별칭은 모두 값 유형입니다. 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 이라는 메서드는 모호하지 않지만 ReadInt 해석이 필요합니다.호출자는 다음을 정의하는 언어를 사용하고 있을 수 있습니다. int 별칭 Int16, 예를 들어..NET 프레임워크 디자이너는 이 패턴을 따랐으며, 좋은 예는 다음과 같습니다. BitConverter, BinaryReader 그리고 Convert 클래스.

String 약자 System.String .NET Framework 유형입니다. string 별칭입니다 C# 언어로 System.String.둘 다 다음과 같이 컴파일됩니다. System.String 일리노이에서 (중급 언어)이므로 차이가 없습니다.마음에 드는 것을 선택해서 사용하세요.C#으로 코딩한다면, 나는 string 이는 C# 유형 별칭이고 C# 프로그래머에게 잘 알려져 있기 때문입니다.

나도 똑같이 말할 수 있어 (int, System.Int32) 등..

C#에서 제공된 유형 별칭을 사용하는 것에 대해 제가 들어본 최고의 답변은 Jeffrey Richter의 저서에서 나왔습니다. C#을 통한 CLR.그의 3가지 이유는 다음과 같습니다.

  • 많은 개발자들이 사용 여부를 모르고 혼란스러워하는 것을 보았습니다. 또는 그들의 코드에서.C#에서는 문자열(키워드)이 정확하게 System.String(FCL 유형)에 매핑되므로 차이가 없으며 둘 중 하나를 사용할 수 있습니다.
  • C#에서는 매핑 시스템.Int64, 하지만 다른 프로그래밍 언어에서는 매핑할 수 있습니다. 정수16 또는 Int32.실제로 C++/CLI는 실제로 long을 다음과 같이 처리합니다. Int32.한 언어로 된 소스 코드를 읽는 사람이 다른 프로그래밍 언어로 프로그래밍하는 데 익숙하다면 코드의 의도를 쉽게 잘못 해석할 수 있습니다.사실 대부분의 언어는 심지어 처리조차 하지 않습니다. 키워드로 사용되며 이를 사용하는 코드를 컴파일하지 않습니다.
  • FCL에는 메서드 이름의 일부로 형식 이름이 있는 메서드가 많이 있습니다.예를 들어, 바이너리리더 유형은 다음과 같은 방법을 제공합니다. 읽기부울, ReadInt32, 읽기단일, 등등, 그리고 시스템.변환 유형은 다음과 같은 방법을 제공합니다. To부울, 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 단독으로 변수 이름으로 사용할 수 없습니다.

어떤 이유로 인해 다음과 같은 변수를 원했다면 , 다음 컴파일 중 첫 번째 컴파일만 표시됩니다.

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

정말로 변수 이름을 원한다면 당신이 사용할 수있는 @ 접두어로:

StringBuilder @string = new StringBuilder();

또 다른 중요한 차이점은 다음과 같습니다.스택 오버플로는 이를 다르게 강조 표시합니다.

한 가지 차이점이 있습니다 - 당신은 사용할 수 없습니다 String 없이 using System; 미리.

위에서 다루었습니다.그러나 당신은 사용할 수 없습니다 string 반성하면서;당신은 사용해야합니다 String.

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

지침에 대해서는 너무 얽매이지 않고 원하는 대로 사용하겠습니다. 인생에는 더 중요한 것이 있으며 코드는 어쨌든 동일할 것입니다.

사용 중인 정수의 크기를 지정해야 하고 자주 사용하는 시스템을 구축하는 경우 Int16, Int32, UInt16, UInt32 등.그러면 좀 더 자연스럽게 사용할 수 있을 것 같아요 String - 그리고 다른 .net 언어 사이를 이동할 때 상황을 더 이해하기 쉽게 만들 수 있습니다. 그렇지 않으면 문자열과 int를 사용합니다.

나는 대문자를 선호한다 .NET 형식 지정상의 이유로 별칭이 아닌 유형을 지정합니다.그만큼 .NET 유형은 다른 객체 유형과 동일하게 색상이 지정됩니다(결국 값 유형은 적절한 객체입니다).

조건부 및 제어 키워드(예: if, switch, 그리고 return)은 소문자이며 진한 파란색으로 표시됩니다(기본값).그리고 나는 오히려 사용과 형식에 있어서 의견 차이가 없기를 바랍니다.

고려하다:

String someString; 
string anotherString; 

string 그리고 String 모든 면에서 동일합니다(대문자 "S" 제외).어느 쪽이든 성능에 미치는 영향은 없습니다.

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

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

string C#의 유형입니다.

System.String CLR의 유형입니다.

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

이론적으로는 Java 바이트코드를 생성하는 C# 컴파일러를 구현할 수 있습니다.이 컴파일러의 합리적인 구현은 아마도 다음과 같습니다. string 에게 java.lang.String Java 런타임 라이브러리와 상호 운용됩니다.

이 유튜브 비디오는 실제로 그들이 어떻게 다른지 보여줍니다.

하지만 이제 긴 텍스트 답변이 필요합니다.

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

enter image description here

"System.String" 일명 "문자열"(대문자 "S")은 .NET 프레임워크 데이터 유형인 반면 "문자열"은 C# 데이터 형식.

enter image description here

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

String s = "I am String";

또는

string s = "I am String";

마찬가지로 아래와 같이 다른 C# 데이터 유형에 대한 별칭도 있습니다.

물체: System.Object, 끈: System.String, 부울: System.Boolean, 바이트: System.Byte, s바이트: System.SByte, 짧은: System.Int16 등등

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

혼란을 피하려면 먼저 둘 중 하나를 일관되게 사용하십시오.그러나 모범 사례 관점에서 변수 선언을 수행할 때는 "문자열"(작은 "s")을 사용하는 것이 좋으며 이를 클래스 이름으로 사용할 때는 "문자열"(대문자 "S")이 선호됩니다.

아래 코드에서 왼쪽은 변수 선언이며 "문자열"을 사용하여 선언되었습니다.오른쪽에서는 메서드를 호출하므로 "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

fyi“키워드 문자열은 단순히 사전 정의 된 클래스의 별칭입니다. System.String.” -C# 언어 사양 4.2.3http://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 지시문).

더 나쁜:속담 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 언제나 피아노야 , MyPiano.String.회원 없음(static 아니면 아님) Format 존재합니다(또는 기본 클래스에서 상속됩니다).그리고 그 가치 "Goodbye" 으로 변환할 수 없습니다.

시스템 유형을 사용하면 C#과 VB.Net 간 포팅이 더 쉬워집니다.

다른 프로그래머들 사이에서 흔히 볼 수 있는 관행에 비해 나는 String ~ 위에 string, 사실을 강조하기 위해 String Jon Skeet이 언급했듯이 참조 유형입니다.

string 의 별칭(또는 약어)입니다. System.String.즉, 다음을 입력하여 string 우리는 의미 System.String.Think 링크에서 더 많은 내용을 읽을 수 있습니다. 'string'은 System.String의 별칭/약어입니다.

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

Ritchers 책의 lfousts 답변에 다음을 추가하고 싶습니다.

C# Language Specification은 "스타일의 문제로서 키워드의 사용은 전체 시스템 유형 이름을 사용하는 것보다 선호됩니다." 나는 언어 사양에 동의하지 않습니다.FCL 유형 이름을 사용하고 원시 유형 이름을 완전히 피하는 것이 좋습니다.사실, 컴파일러가 원시 유형 이름과 강제 개발자가 대신 FCL 유형 이름을 사용하도록 제공하지 않기를 바랍니다.내 이유는 다음과 같습니다.

  • 많은 개발자들이 사용 여부를 모르고 혼란스러워하는 것을 보았습니다. 또는 그들의 코드에서.왜냐하면 C#에서는 (키워드)는 다음과 정확히 일치합니다. 시스템.문자열 (FCL형) 차이는 없으며 둘 다 사용할 수 있습니다.마찬가지로 일부 개발자들이 그렇게 말하는 것을 들었습니다 정수 응용 프로그램이 32 비트 OS에서 실행될 때 32 비트 정수를 나타냅니다. 응용 프로그램이 64 비트 OS에서 실행될 때 64 비트 정수를 나타냅니다.이 진술은 완전히 거짓입니다.C#에서는 정수 항상지도 시스템.Int32, 따라서 코드가 실행중인 OS에 관계없이 32 비트 정수를 나타냅니다.프로그래머가 사용한다면 Int32 코드 에서이 잠재적 혼란도 제거됩니다.

  • C#에서는 매핑 시스템.Int64, 하지만 다른 프로그래밍 언어에서는 매핑할 수 있습니다. 정수16 또는 Int32.실제로 C++/CLI는 다음을 처리합니다. 로서 Int32.한 언어로 소스 코드를 읽는 사람은 다른 프로그래밍 언어로 프로그래밍하는 데 익숙한 경우 코드의 의도를 쉽게 해석 할 수 있습니다.사실 대부분의 언어는 심지어 처리조차 하지 않습니다. 키워드로 사용하는 코드를 컴파일하지 않습니다.

  • FCL에는 메서드 이름의 일부로 형식 이름이 있는 메서드가 많이 있습니다.예를 들어, 바이너리리더 유형은 다음과 같은 방법을 제공합니다. 읽기부울, ReadInt32, 읽기단일, 등등, 그리고 시스템.변환 유형은 다음과 같은 방법을 제공합니다. To부울, ToInt32, ToSingle, 등등.다음 코드를 작성하는 것은 합법적이지만 뜨다 나에게 매우 부자연스럽고 라인이 정확하다는 것은 분명하지 않습니다.

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • C#을 독점적으로 사용하는 많은 프로그래머는 다른 프로그래밍 언어가 CLR에 대해 사용될 수 있다는 것을 잊어 버린 경향이 있으며, 이로 인해 C# -isms는 클래스 라이브러리 코드에 들어갑니다.예를 들어, Microsoft의 FCL은 거의 C#에 독점적으로 작성되었으며 FCL 팀의 개발자는 이제 라이브러리에 방법을 도입했습니다. 정렬'에스 GetLong길이, 이는 Int64 값은 C#에서는 다른 언어 (C ++/CLI와 같은)에서는 그렇지 않습니다.또 다른 예는 System.Linq.Enumerable'에스 롱카운트 방법.

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

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

파티에 늦게 오다:나는 CLR 유형을 100% 사용합니다. 강요된 C# 유형을 사용하려고 했는데 마지막이 언제였는지 기억이 나지 않습니다.)

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

이제 수년간 해왔으니 습관이 되었고 VS가 CLR 유형에 대해 보여주는 색상이 마음에 듭니다.

유일한 문제는 자동 완성이 C# 유형을 사용하므로 대신 CLR 유형을 지정하기 위해 자동으로 생성된 유형을 다시 입력하게 된다는 것입니다.

또한 이제 "int" 또는 "string"을 보면 1970년대 C 코드를 보는 것처럼 정말 잘못된 것처럼 보입니다.

실제로는 관례의 문제입니다. string C/C++ 스타일에 더 가깝습니다.일반적인 관례는 선택한 언어에서 제공하는 단축키(int/Int)를 사용하는 것입니다. Int32).이것은 "객체"에 적용되며 decimal 또한.

이론적으로 이것은 "int"가 의미할 수 있는 미래의 64비트 표준으로 코드를 포팅하는 데 도움이 될 수 있습니다. Int64, 하지만 그게 요점이 아니므로 업그레이드 마법사가 무엇이든 변경할 것이라고 기대합니다. int 에 대한 언급 Int32 어쨌든 안전을 위해서요.

다른 점이 없다.

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

비슷하게, int 매핑 System.Int32.

이 문제에 대한 인용문이 있습니다. 다니엘 솔리스의 책.

사전 정의 된 모든 유형은 기본 .NET 유형에 직접 매핑됩니다.C# 유형 이름 (String)은 단순히 .NET 유형 (String 또는 System.String)의 별명이므로 .NET 이름을 사용하는 것은 구문 적으로 작동하지만 권장되지는 않습니다.C# 프로그램 내에서 .NET 이름 대신 C# 이름을 사용해야합니다.

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

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

string String = "I am a string";

키워드 string 의 별칭입니다 System.String 키워드 문제 외에도 두 사람은 정확히 동일합니다.

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

네, 그건 그들 사이에 아무런 차이가 없습니다. bool 그리고 Boolean.

둘 사이에는 아무런 차이가 없습니다 - string, 그러나 다른 개발자의 소스 코드를 고려할 때 선호되는 옵션인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top