C #에서 문자열과 문자열의 차이점은 무엇입니까?
예 ( 사례 참고 ) :
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 가 예제 에서 사용하는 스타일입니다 .
StyleCop은 이제 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
... A와 반대되는 유형의 생산 등을 예를 들어 변수 선언에 사용됩니다. 다른 차이점은 없습니다.
마지막으로 사용할 때 : 개인적으로 구현의 모든 곳에서 별칭을 사용하지만 API의 경우 CLR 유형을 사용합니다. 구현 측면에서 어느 것을 사용하는지는 중요하지 않습니다. 팀 간의 일관성은 좋지만 아무도 신경 쓰지 않습니다. 반면에 API에서 유형을 참조하는 경우 언어 중립적 인 방식으로 수행해야합니다. 호출되는 메소드 ReadInt32
는 모호하지 않지만 호출 된 메소드 ReadInt
는 해석이 필요합니다. 예를 들어, 발신자는에 대한 int
별칭을 정의하는 언어를 사용할 수 있습니다 Int16
. 닷넷 프레임 워크의 디자이너는이 패턴을 따랐다 좋은 예는에있는 BitConverter
, BinaryReader
그리고 Convert
클래스.
String
의 약자이며 System.String
.NET Framework 유형입니다. 에 대한 C # 언어 string
의 별칭 입니다 System.String
. 둘 다 System.String
IL (Intermediate Language) 로 컴파일 되므로 차이가 없습니다. 원하는 것을 선택하고 사용하십시오. C #으로 코딩 string
하는 경우 C # 유형 별칭이며 C # 프로그래머가 잘 알고 있기 때문에 선호 합니다.
( int
, System.Int32
) 등에 대해서도 동일하게 말할 수 있습니다 .
C #에서 제공된 유형 별칭을 사용하는 것에 대해 들었던 가장 좋은 대답은 Jeffrey Richter가 그의 책 CLR Via C # 에서 왔습니다 . 그의 세 가지 이유는 다음과 같습니다.
- 코드에서 문자열 또는 문자열 을 사용할지 여부를 모르고 많은 개발자들이 혼란스러워하는 것을 보았습니다 . C #에서 문자열 (키워드)은 System.String (FCL 유형)에 정확하게 매핑되므로 차이가 없으며 둘 다 사용할 수 있습니다.
- C #에서 long 은 System.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
클래스 이름 일뿐입니다. 이것은 string
그 자체로 변수 이름으로 사용될 수 없음을 의미 합니다.
어떤 이유로 string 이라는 변수를 원한다면 다음 컴파일 중 첫 번째 만 볼 수 있습니다.
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
string 이라는 변수 이름을 정말로 원한다면 @
접두사로 사용할 수 있습니다 .
StringBuilder @string = new StringBuilder();
또 다른 중요한 차이점 : 스택 오버플로는 다르게 강조 표시합니다.
한 가지 차이점 이 있습니다- 사전에 사용 String
하지 않으면 사용할 수 없습니다 using System;
.
그것은 위에 덮여있다; 그러나 string
반사에 사용할 수는 없습니다 . 를 사용해야합니다 String
.
System.String
.NET 문자열 클래스입니다-C # string
의 별칭입니다 System.String
. 사용 중 동일합니다.
지침에 관해서는 너무 혼란스럽지 않고 당신이 느끼는 것을 사용하십시오-인생에서 더 중요한 것들이 있으며 코드는 어쨌든 동일합니다.
당신은 당신이 사용하고있는 정수의 크기를 지정하는 것이 필요하다 시스템을 구축 자신을 발견하고 그래서 사용하는 경향이 경우 Int16
, Int32
, UInt16
, UInt32
등 그것은 사용하는 것이 더 자연 보일 수 있습니다 String
- 다른 .NET 언어 사이의 주위에 이동하는 경우는 수도 일을 더 이해할 수있게하십시오-그렇지 않으면 string과 int를 사용합니다.
.NET
형식상의 이유로 별명 대신 대문자로 된 유형을 선호합니다 . .NET
종류가 다른 오브젝트 타입 (타입 값은 결국, 적절한 객체)와 같은 착색된다.
조건부 및 제어 키워드 (예 if
: switch
, 및 return
)는 소문자이며 진한 파란색 (기본)입니다. 그리고 나는 사용과 형식에 대한 의견 불일치가 없습니다.
치다:
String someString;
string anotherString;
string
및 String
(대문자 "S"를 제외한) 모든면에서 동일하다. 어느 쪽의 성능 영향도 없습니다.
string
구문 강조로 인해 대부분의 프로젝트에서 소문자 를 선호합니다
C #은 CLR과 함께 사용되는 언어입니다.
string
C #의 유형입니다.
System.String
CLR의 유형입니다.
C #과 함께 C #을 사용하면에 CLR string
이 매핑됩니다 System.String
.
이론적으로 Java 바이트 코드를 생성 한 C # 컴파일러를 구현할 수 있습니다. 이 컴파일러의 합리적인 구현은 아마지도 할 string
에 java.lang.String
자바 런타임 라이브러리와 상호 운용하기 위해.
이 YouTube 동영상은 실제로 어떻게 다른지 보여줍니다.
그러나 지금은 긴 텍스트 답변입니다.
우리가 이야기 할 때 .NET
다른 두 가지가 하나가 .NET
프레임 워크와 다른 언어 (이 있습니다 C#
, VB.NET
그 프레임 워크를 사용하는 등).
" System.String
"일명 "문자열"(대문자 "S")은 .NET
프레임 워크 데이터 유형이고 "문자열"은 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
는의 별칭입니다 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
참고로“키워드 문자열은 단순히 미리 정의 된 클래스의 별칭입니다 System.String
.” -C # 언어 사양 4.2.3 http://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
더 나쁜 것은 : s String.Concat(someSequence)
에 따라 아마 using
Linq 확장 방법으로 갈 것 Enumerable.Concat
입니다. 정적 메소드로 이동하지 않습니다 string.Concat
.
두 번째로, String
다른 유형 이 when 이면 현재 유형 안에 중첩됩니다.
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
존 소총가 언급 한 바와 같이, 참조 형식입니다.
string
의 별칭 (또는 속기)입니다 System.String
. 즉, 입력 string
을 통해 의미 System.String
합니다. think 링크에서 더 읽을 수 있습니다 : 'string'은 System.String의 별칭 / 속기입니다.
Ritchers 책에서 lfousts 답변에 이것을 추가하고 싶습니다.
C # 언어 사양에는 "스타일에 따라 전체 시스템 유형 이름보다 키워드를 사용하는 것이 좋습니다." 언어 사양에 동의하지 않습니다. FCL 유형 이름을 사용하고 기본 유형 이름을 완전히 피하는 것을 선호합니다. 실제로 컴파일러가 기본 유형 이름을 제공하지 않았고 개발자가 FCL 유형 이름을 대신 사용하도록 강요했습니다. 내 이유는 다음과 같습니다.
코드에서 문자열 또는 문자열 을 사용할지 여부를 모르고 많은 개발자들이 혼란스러워하는 것을 보았습니다 . C # 문자열 (키워드)에서 System.String (FCL 유형)에 정확하게 매핑 되므로 차이가 없으며 둘 다 사용할 수 있습니다. 마찬가지로 일부 개발자 는 응용 프로그램이 32 비트 OS에서 실행될 때 int 가 32 비트 정수를 나타내고 응용 프로그램이 64 비트 OS에서 실행될 때 64 비트 정수를 나타낸다고 말합니다. 이 문장은 절대로 거짓입니다. C #에서 int는 항상 System.Int32에 매핑 되므로 코드가 실행되는 OS에 관계없이 32 비트 정수를 나타냅니다. 프로그래머가 Int32를 사용한다면 그들의 코드에서, 이러한 잠재적 혼란도 제거된다.
C #에서 long 은 System.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
C #을 독점적으로 사용하는 많은 프로그래머는 다른 프로그래밍 언어가 CLR에 대해 사용될 수 있다는 사실을 잊어 버리는 경향이 있으며, 이로 인해 C # -ism은 클래스 라이브러리 코드로 들어갑니다. 예를 들어, Microsoft의 FCL은 거의 독점적으로 C #으로 작성되었으며 FCL 팀의 개발자는 이제 Array 의 GetLongLength 와 같은 메소드를 라이브러리에 도입 하여 C # 에서는 길지만 C ++과 같은 다른 언어 로는 Int64 값을 반환합니다. / CLI). 또 다른 예는 System.Linq.Enumerable s LongCount 방법입니다.
나는 완전한 단락을 읽기 전에 그의 의견을 얻지 못했습니다.
문자열 ( System.String
)은 기본 클래스 라이브러리의 클래스입니다. string (소문자)은 System.String의 별칭 인 C #에서 예약 된 작업입니다. Int32와 int는 비슷한 상황입니다 Boolean vs. bool
. 이러한 C # 언어 별 키워드를 사용하면 C와 유사한 스타일로 기본 요소를 선언 할 수 있습니다.
String
키워드가 아니며 식별자로 사용할 수 있지만 string
키워드는 식별자로 사용할 수 없습니다. 그리고 기능적인 관점에서 둘 다 동일합니다.
파티에 늦게 오는 : 나는 CLR 유형 시간의 100 %를 사용합니다 (물론, 경우를 제외시켰다 강제 는 C # 형식을 사용하는 것이 아니라 마지막 시간이었다 그 때 나는 기억하지 않는다).
Ritchie의 CLR 서적에 따라 원래 몇 년 전에 작업을 시작했습니다. 모든 CLR 언어는 궁극적으로 CLR 유형 집합을 지원할 수 있어야하므로 CLR 유형을 사용하면 더 명확하고 "재사용 가능한"코드를 제공 할 수 있습니다.
이제 몇 년 동안 해왔으므로 습관이되고 VS가 CLR 유형에 대해 보여주는 채색이 마음에 듭니다.
유일한 단점은 자동 완성이 C # 유형을 사용한다는 것입니다. 따라서 자동 생성 된 유형을 다시 입력하여 CLR 유형을 대신 지정합니다.
또한, "int"또는 "string"을 볼 때 1970 년대 C 코드를보고있는 것처럼 그것은 나에게 정말로 잘못 보입니다.
정말 관습의 문제입니다. string
C / C ++ 스타일처럼 보입니다. 일반적인 규칙은 선택한 언어가 제공 한 모든 단축키 (int / Int for Int32
)를 사용하는 것입니다. 이것은 "객체" decimal
도 마찬가지입니다.
이론적으로 이것은 "int"가 의미하는 미래의 64 비트 표준으로 코드를 포팅하는 데 도움이 될 수 Int64
있지만, 요점은 아니며 업그레이드 마법사가 int
참조를 변경 Int32
하기 위해 안전하다고 생각합니다.
다른 점이 없다.
C # 키워드 string
는 .NET 유형에 매핑 System.String
됩니다. 이는 언어의 명명 규칙을 유지하는 별칭입니다.
마찬가지로에 int
매핑됩니다 System.Int32
.
Daniel Solis의 저서 에서이 문제에 대한 인용문이 있습니다.
미리 정의 된 모든 유형은 기본 .NET 유형에 직접 매핑됩니다. C # 형식 이름 (문자열)은 .NET 형식 (문자열 또는 System.String)의 별칭 일 뿐이므로 .NET 이름을 사용하는 것은 권장하지 않지만 구문 상으로는 잘 작동합니다. C # 프로그램 내에서 .NET 이름 대신 C # 이름을 사용해야합니다.
string 은 키워드이므로 string을 식별자로 사용할 수 없습니다.
문자열 은 키워드가 아니며 식별자로 사용할 수 있습니다.
예
string String = "I am a string";
키워드 string
는 System.String
키워드 문제 를 제외하고 는 별명이며 둘은 정확히 동일합니다.
typeof(string) == typeof(String) == typeof(System.String)
네, 그냥 같은 그들 사이에 차이가 없다 bool
하고 Boolean
.
string
그러나 다른 개발자의 소스 코드를 고려할 때 두 옵션 사이에는 차이가 없습니다 .
참고 URL : https://stackoverflow.com/questions/215255/string-vs-string-in-c-sharp
'IT' 카테고리의 다른 글
이클립스 댓글 / 댓글 바로 가기? (0) | 2020.03.29 |
---|---|
Java에서 "논리적 배타적"연산자 만들기 (0) | 2020.03.29 |
Git에서 분기를 언제 삭제합니까? (0) | 2020.03.29 |
루비는 파이썬이 가지고 있지 않은 것과 그 반대의 것을 가지고 있습니까? (0) | 2020.03.29 |
Android 플랫폼에서 푸시 알림 (0) | 2020.03.29 |