C 샤프 구문

C Sharp syntax

이 문서는 C# 프로그래밍 언어구문에 대해 설명합니다.설명된 기능은 와 호환됩니다.NET FrameworkMono.

기초

식별자

식별자코드에 있는 요소의 이름입니다.문자, 숫자 및 밑줄을 포함할 수 있습니다(_), 및 대소문자 구분(FOO와는 다릅니다.foo). 이 언어는 식별자 이름에 다음과 같은 제한을 가합니다.

  • 숫자로 시작할 수 없습니다.
  • 키워드가 아니면 기호로 시작할 수 없습니다.
  • 문자 수는 511자를 초과할 수 없습니다.

식별자 이름 앞에는 at 기호()가 붙여질 수 있습니다.@), 하지만 이는 중요하지 않습니다.@name와 동일한 식별자입니다.name.

마이크로소프트는 C#에서 식별자에 대한 명명 규칙을 발표하였는데, C#에서는 타입과 대부분의 타입 멤버의 이름에 파스칼케이스를 사용하고, 변수와 개인 또는 내부 필드에 대해서는 camelCase를 사용할 것을 권장합니다.[1]그러나 이러한 명명 규칙은 언어로 적용되지 않습니다.

키워드

키워드는 특별한 통사적 의미를 가진 미리 정의된 예약된 단어입니다.[2]이 언어에는 문맥과 예약이라는 두 가지 유형의 키워드가 있습니다.예약된 키워드:false아니면byte키워드로만 사용할 수 있습니다.다음과 같은 상황별 키워드를 사용됩니다.where아니면from특정 상황에서만 키워드로 취급됩니다.[3]예약된 키워드와 동일한 식별자가 필요한 경우 구분하기 위해 at 기호 앞에 붙여둘 수 있습니다.예를들면,@out는 식별자로 해석되는 반면.out키워드로서이 구문은 의 재사용을 용이하게 합니다.다른 언어로 작성된 NET 코드.[4]

다음 C# 키워드는 예약어입니다.[2]

  • abstract
  • as
  • base
  • bool
  • break
  • byte
  • case
  • catch
  • char
  • checked
  • class
  • const
  • continue
  • decimal
  • default
  • delegate
  • do
  • double
  • else
  • enum
  • event
  • explicit
  • extern
  • false
  • finally
  • fixed
  • float
  • for
  • foreach
  • goto
  • if
  • implicit
  • in
  • int
  • interface
  • internal
  • is
  • lock
  • long
  • namespace
  • new
  • null
  • object
  • operator
  • out
  • override
  • params
  • private
  • protected
  • public
  • readonly
  • ref
  • return
  • sbyte
  • sealed
  • short
  • sizeof
  • stackalloc
  • static
  • string
  • struct
  • switch
  • this
  • throw
  • true
  • try
  • typeof
  • uint
  • ulong
  • unchecked
  • unsafe
  • ushort
  • using
  • virtual
  • void
  • volatile
  • while

상황별 키워드는 코드에서 특정 의미를 제공하는 데 사용되지만 C#에서 예약된 단어는 아닙니다.다음과 같은 상황별 키워드partial그리고.where, 다양한 맥락에서 특별한 의미를 갖습니다.다음 C# 키워드는 상황에 맞는 키워드입니다.[5]

  • add
  • and
  • alias
  • ascending
  • args
  • async
  • await
  • by
  • descending
  • dynamic
  • equals
  • from
  • get
  • global
  • group
  • init
  • into
  • join
  • let
  • managed
  • nameof
  • nint
  • not
  • notnull
  • nuint
  • on
  • or
  • orderby
  • partial
  • record
  • remove
  • required
  • select
  • set
  • unmanaged
  • value
  • var
  • when
  • where
  • with
  • yield

리터럴

정수
십진의 23456, [0..9]+
십육진법의 0xF5, 0x[0..9, A..F, a..f]+
이진법의 0b010110001101, 0b[0,1]+
부동 소수점 값
흘러가다 23.5F, 23.5f; 1.72E3F, 1.72E3f, 1.72e3F, 1.72e3f
두 배의 23.5, 23.5D, 23.5d; 1.72E3, 1.72E3D, ...
십진의 79228162514264337593543950335m, -0.0000000000000000000000000001m, ...
성격.
차를 'a', 'Z', '\u0231', '\x30', '\n'
줄들
끈을 "Hello, world"
"C:\\Windows\\",@"C:\Windows\"[verb타임 문자열(@로 preceded)에 줄 바꿈 및 캐리지 리턴 문자가 포함될 수 있음]
$"Hello, {name}!"보간 문자열.버바텀 문자열로서:$@"Hello, {name}!"
문자열에서 문자가 빠져나갑니다.
유니코드 문자 \u16진수 유니코드 코드 포인트 다음에
확장_아스키 문자 \x다음에 16진수 확장 ASCII 코드 포인트가 표시됩니다.
Null 문자[a] \0
\t
백스페이스 \b
캐리지 리턴 \r
양식사료 \f
백슬래시 \\
인용구 하나 \'
큰따옴표 \"
라인피드 \n
  1. ^ 문자열은 C#에서 null-terminal되지 않으므로 null 문자가 문자열의 어디에나 나타날 수 있습니다.

숫자 구분 기호

C# 7.0부터는 가독성을 위해 숫자 값의 숫자를 구분하는 데 밑줄 기호를 사용할 수 있습니다.컴파일러는 이러한 밑줄을 무시합니다.

인트  = 0b1101_0010_1011_0100; 인트 육각형의 = 0x2F_BB_4A_F1; 인트 12월의 = 1_000_500_954; 두 배의 진짜 = 1_500.200_2e-1_000; 

일반적으로 숫자 문자 사이에만 넣을 수 있습니다.처음에 넣을 수 없습니다(_121) 또는 값의 끝 (121_아니면121.05_), 부동 소수점 값( ) 옆에 있습니다.10_.0), 지수 문자 옆(1.1e_1), 또는 형식 지정자 옆에 있습니다(10_f).

변수

변수는 값과 연관된 식별자입니다.이들은 변수의 유형과 이름을 기록함으로써 선언되며, 선택적으로 동일한 문에서 초기화됩니다.

선언하다

인트 마이인트;         // 'int' 유형의 'myInt'라는 초기화되지 않은 변수를 선언합니다. 

할당중

인트 마이인트;        // 초기화되지 않은 변수 선언 마이인트 = 35;       // 변수에 값 할당 

초기화

인트 마이인트 = 35;   // 변수 선언 및 초기화 

하나의 문에서 동일한 유형의 여러 변수를 선언하고 초기화할 수 있습니다.

인트 a, b;         // 동일한 유형의 여러 변수 선언  인트 a = 2, b = 3; // 동일한 유형의 여러 변수를 선언하고 초기화 

로컬 변수 유형 추론

이것은 C# 3.0의 특징입니다.

C# 3.0은 유형 추론을 도입하여 변수 선언의 유형 지정자를 키워드로 대체할 수 있게 했습니다.var, 실제 유형이 이니셜라이저에서 정적으로 결정될 수 있는지 여부.이를 통해 특히 여러 개의 일반 유형 매개 변수를 가진 유형의 경우 반복을 줄이고 DRY 원칙을 더욱 엄격하게 준수할 수 있습니다.

변태의 나의 차스 = 신규 차를[] {'A', 'ö'}; // 또는 char[] myChars = new char[] {'A', 'ö'};  변태의 마이넘스 = 신규 목록.<인트>();  // 또는 List<int> myNums = newList<int>(); 

상수

상수는 불변의 값입니다.

const

로컬 변수 또는 필드를 선언할 때const키워드를 접두사로 선언할 때 값을 지정해야 합니다.그 후에는 잠금 상태가 되어 변경할 수 없습니다.필드 또는 로컬 변수로 컨텍스트에서 선언할 수 있습니다.상수는 암시적으로 정적입니다.

머리를 짜다 두 배의 PI = 3.14; 

키워드의 두 가지 용도를 모두 나타냅니다.

일반의 학급  {     사적인 머리를 짜다 두 배의 X = 3;      일반의 ()     {         머리를 짜다 인트 y = 2;     } } 

readonly

readonly키워드는 필드와 유사한 작업을 수행합니다.로 표시된 유사 필드const한 번 초기화하면 변경할 수 없습니다.생성자에서 초기화하거나 런타임 전까지 알 수 없는 값으로 초기화하도록 선택할 수 있습니다.필드에서만 작동합니다.readonly필드는 인스턴스 또는 정적 클래스 멤버의 멤버가 될 수 있습니다.

코드 블록

꼬불꼬불한 교정기{ ... }코드 블록과 새 범위를 나타내는 데 사용됩니다.다양한 맥락에서 이러한 교정기 안에서 살 수 있는 것의 예로 학급 구성원과 방법의 본체를 들 수 있습니다.

Method Body(메소드 바디) 내부에서 브레이스를 사용하여 다음과 같은 새 스코프를 만들 수 있습니다.

공허한 어떻게 좀 해봐.() {     인트 a;      {         인트 b;         a = 1;     }      a = 2;     b = 3; // 변수가 내부 범위에 선언되므로 실패합니다. } 

프로그램구조

C# 어플리케이션은 클래스와 해당 클래스의 멤버로 구성됩니다.클래스 및 기타 유형은 네임스페이스에 존재하지만 다른 클래스 내에 중첩될 수도 있습니다.

주법

콘솔이든 그래픽 인터페이스 애플리케이션이든 프로그램은 일종의 진입점을 가져야 합니다.C# 애플리케이션의 진입점은 다음과 같은 메서드입니다.Main. 하나만 있을 수 있고, 그것은 수업에서 정적인 방식입니다.메소드는 일반적으로 반환됩니다.void명령줄 인수를 문자열 배열로 전달합니다.

정적인 공허한 주된(끈을[] 아그스) { } // OR Main 메서드는 파라미터 없이 정의할 수 있습니다. 정적인 공허한 주된() { } 

주 메서드는 지정된 경우 정수 값을 반환할 수도 있습니다.

정적인 인트 주된(끈을[] 아그스) {     돌아가다 0; } 

비동기 메인

이것은 C# 7.1의 특징입니다.

비동기 작업은 에서 대기할 수 있습니다.Main반환 형식으로 선언하여 메서드Task.

정적인 비동기의 작업 주된(끈을[] 아그스) {     기다리다 DoWork 비동기화(42); } 

의 모든 조합.Task, 아니면Task<int>,그리고 그것이 있건 없건 간에.string[] args매개 변수가 지원됩니다.

최상위 문

이것은 C# 9.0의 특징입니다.

스크립팅 언어에서와 유사하게 최상위 단계의 문장은 다음을 선언해야 하는 의식을 제거합니다.ProgramA급Main방법.

대신 하나의 특정 파일에 문장을 직접 작성할 수 있으며, 해당 파일이 프로그램의 시작점이 됩니다.다른 파일의 코드는 클래스에서 정의해야 합니다.

이것은 C#를 덜 장황하게 만들고, 따라서 초보자들이 더 쉽게 시작할 수 있도록 하기 위해 도입되었습니다.

사용. 시스템.;  콘솔.쓰기 선("헬로 월드!"); 

유형은 문 다음에 선언되며, 위의 문에서 자동으로 사용할 수 있습니다.

네임스페이스

네임스페이스는 형식 이름의 일부이며 이름이 지정된 엔티티를 다른 엔티티와 그룹화 및/또는 구별하는 데 사용됩니다.

시스템..IO.디렉토리정보 // 디렉토리정보가 시스템에 있습니다.IO 네임스페이스 

네임스페이스는 다음과 같이 정의됩니다.

네임스페이스 푸네임스페이스 {     // 멤버들 } 

using지시의

usingDirective는 참조된 어셈블리에서 특정 네임스페이스를 로드합니다.일반적으로 코드 파일의 맨 위(또는 헤더)에 배치되지만 원하는 경우 클래스 내부와 같이 다른 곳에 배치할 수 있습니다.[citation needed]

사용. 시스템.; 사용. 시스템.소장품; 

지시어를 사용하여 기존 네임스페이스 또는 유형의 다른 이름을 정의할 수도 있습니다.이름이 너무 길어 읽을 수 없을 때 유용합니다.

사용. 그물 = 시스템..그물; 사용. DirInfo = 시스템..IO.디렉토리정보; 

using static지시의

using staticDirective는 지정된 유형의 정적 멤버를 현재 범위로 로드하여 멤버 이름으로 직접 액세스할 수 있도록 합니다.

사용. 정적인 시스템..콘솔;  쓰기 선("안녕, 세상이여!"); 

연산자

작업자구분 연산자
산술학 +,-,*,/,%
논리적(부울 및 비트 단위) &, ,^,!,~,&&, ,true,false
문자열 연결 +
증분, 감소 ++,--
시프트 <<,>>
관계형(조건부) ==,!=,<,>,<=,>=
과제 =,+=,-=,*=,/=,%=,&=, =,^=,<<=,>>=
회원접속 .,?.,?[]
인덱싱 []
출연자들 ()
조건부(삼차) ?:
딜러 연결 및 제거 +,-
객체생성 new
유형정보 as,is,sizeof,typeof
오버플로 예외 컨트롤 checked,unchecked
간접 및 주소 *,->,[],&
연합체 ??
람다식 =>

연산자 과부하

기존 연산자 중 일부는 오버로드 방식을 작성하여 오버로드가 발생할 수 있습니다.

일반의 정적인  교환입니다.+( 푸우,  ) {     돌아가다 신규 (푸우.가치 + .가치); } 

과부하가 걸리는 연산자는 다음과 같습니다.

연산자
+,-,!,~,++,--,true,false 단항 연산자
+,-,*,/,%,&, ,^,<<,>> 이진 연산자
==,!=,<,>,<=,>= 비교 연산자, 쌍으로 오버로드해야 합니다.
  • 할당 연산자(+=, *=등)은 이항 연산자와 할당 연산자의 조합입니다(=과부하가 발생할 수 있는 일반 연산자를 사용하여 평가할 예정입니다.
  • 캐스트 오퍼레이터(( ))을(를) 오버로드할 수는 없지만 변환 연산자를 정의할 수 있습니다.
  • 배열 색인화([ ]연산자를 오버로드할 수는 없지만 새 인덱서를 정의할 수 있습니다.

변환 연산자

캐스트 연산자는 과부하가 걸리지 않지만 대상 클래스에 있는 변환 연산자 메서드를 작성할 수 있습니다.변환 방법은 암시적 변환 연산자와 명시적 변환 연산자의 두 가지 다양한 연산자를 정의할 수 있습니다.암시적 연산자는 캐스트 연산자를 지정하지 않고 캐스트합니다(( )) 및 명시적 연산자는 이를 사용하도록 요구합니다.

암묵적 변환 연산자

학급  {     일반의 인트 가치;      일반의 정적인 암묵의 교환입니다. (인트 가치)     {         돌아가다 신규 (가치);     } } // 암묵적 변환  푸우 = 2; 

명시적 변환 연산자

학급  {     일반의 인트 가치;      일반의 정적인 명시적 교환입니다. (인트 가치)     {         돌아가다 신규 (가치);     } } // 명시적 변환  푸우 = ()2; 

as교환입니다.

as연산자는 지정된 형식에 대해 무음 캐스트를 시도합니다.가능하면 개체를 새 형식으로 반환하고 그렇지 않으면 null을 반환합니다.

개울. 개울. = 파일.열다.(@"C:\Temp\data.dat"); 파일스트림 fstream = 개울. ~하듯이 파일스트림; // 개체를 반환합니다.   str = 개울. ~하듯이 ; // null을 반환합니다. 

Null 병합 연산자

이것은 C# 2.0의 특징입니다.

다음 사항:

돌아가다 ifNotNull 값 ?? 그렇지 않으면 값; 

는 다음의 약자입니다.

돌아가다 ifNotNull 값 != 귀무의 ? ifNotNull 값 : 그렇지 않으면 값; 

그 의미는 만약 변수의 내용이ifNotNullValuenull이 아닙니다. 해당 내용이 반환됩니다. 그렇지 않으면 변수의 내용이 반환됩니다.otherwiseValue반환됩니다.

C# 8.0은 다음과 같은 null-coaling 할당을 도입합니다.

변수 ??= 그렇지 않으면 값; 

와 동치입니다.

한다면 (변수  귀무의) 변수 = 그렇지 않으면 값; 

제어구조

C#은 C/C++의 대부분의 제어 구조를 계승하고 또한 C/C++와 같은 새로운 구조를 추가합니다.foreach진술.

조건부 구조

이러한 구조는 주어진 조건을 통해 프로그램의 흐름을 제어합니다.

if진술

if문장은 주어진 조건이 참일 때 입력됩니다.일반적으로 대부분 선호하는 단일 행 대소문자는 블록 브레이스가 필요하지 않습니다.

간단한 한 줄문:

한다면 (i == 3) ... ; 

다른 블록이 있는 다중선(브레이싱 없음):

한다면 (i == 2)     ... 또 다른     ... 

if-문에 대해 권장되는 코딩 규칙.

한다면 (i == 3) {     ... } 또 다른 한다면 (i == 2) {     ... } 또 다른 {     ... } 

switch진술

switchconstruct는 다양한 값에 대한 필터 역할을 합니다.각 값은 "케이스"로 이어집니다.케이스 섹션을 통과할 수 없으므로 키워드를 입력할 수 없습니다.break일반적으로 사건을 끝낼 때 사용됩니다.무조건적인return케이스 섹션을 사용하여 케이스를 종료할 수도 있습니다.방법도 참조goto문장은 한 케이스에서 다음 케이스로 넘어가는데 사용될 수 있습니다.많은 경우에 동일한 코드로 연결될 수 있습니다.기본 케이스는 구성에서 처리하지 않은 다른 모든 케이스를 처리합니다.

스위치를 () {     사례. 'A':         진술;         ...         브레이크.;     사례. 'B':         진술;         브레이크.;     사례. '다': // 스위치 섹션에는 여러 개의 대소문자 레이블이 있을 수 있습니다.     사례. :         ...         브레이크.;     체납:         ...         브레이크.; } 

반복 구조

반복문은 주어진 조건이 참이라고 평가될 때 반복적으로 실행되는 문입니다.

while고리

하는 동안에 (i == 진실의) {     ... } 

do ... while고리

하다 {  } 하는 동안에 (i == 진실의); 

for고리

for루프는 선언, 조건, 카운터 표현의 세 부분으로 구성됩니다.그 중 어떤 것도 선택사항이기 때문에 생략될 수 있습니다.

위해서 (인트 i = 0; i < 10; i++) {     ... } 

이 코드가 a로 표시되는 것과 같습니까?while여기를 제외하고는.i변수가 루프에 로컬이 아닙니다.

인트 i = 0; 하는 동안에 (i < 10) {     //...     i++; } 

foreach고리

foreach문장은 다음에서 파생됩니다.for문장(statement)과 C#의 언어 사양에 설명된 특정 패턴을 사용하여 반복할 요소의 열거자를 얻고 사용합니다.

주어진 컬렉션의 각 항목은 반환되며 코드 블록의 컨텍스트에서 도달할 수 있습니다.블록이 실행되면 남은 항목이 없을 때까지 다음 항목이 반환됩니다.

각개별로 (인트 i 인에 intList) {     ... } 

점프문

점프 문은 C/C++에서 상속되고 궁극적으로 이를 통해 언어를 어셈블리합니다.단순히 프로그램의 흐름을 제어하는 어셈블리 언어의 점프 명령을 나타냅니다.

레이블 및goto진술

레이블은 코드에서 다음을 사용하여 점프할 수 있는 포인트를 제공합니다.goto진술.

시작하는:     .......     에 가다 시작하는; 

라벨이 다음에 위치할 필요는 없습니다.gotostatement; 소스 파일에서 이전일 수 있습니다.

goto문장을 사용할 수 있습니다.switch한 사례에서 다른 사례로 점프하거나 한 사례에서 다음 사례로 넘어지는 진술.

스위치를 (n) {     사례. 1:         콘솔.쓰기 선("케이스 1");         브레이크.;     사례. 2:         콘솔.쓰기 선("케이스2");         에 가다 사례. 1;     사례. 3:         콘솔.쓰기 선("케이스 3");     사례. 4: // C#에서 사례를 통과할 수 없기 때문에 여기서는 컴파일이 실패합니다.         콘솔.쓰기 선("케이스4");         에 가다 체납; // 이것이 다음 사건으로 넘어가기 위한 올바른 방법입니다.     사례. 5:  // 동일한 코드에 대해 여러 레이블이 정상입니다.     사례. 6:     체납:         콘솔.쓰기 선("기본값");         브레이크.;  // 기본값도 끝점에 도달하면 안 됩니다. } 

break진술

break문장은 가장 가까운 루프에서 깨집니다.switch진술.종료된 문장이 있는 경우, 문장에서 실행이 계속됩니다.

인트 e = 10; 위해서 (인트 i = 0; i < e; i++) {     하는 동안에 (진실의)     {         브레이크.;     }     // 여기까지 하겠습니다. } 

continue진술

continuestatement는 현재 control statement의 현재 반복을 중단하고 다음 반복을 시작합니다.

인트 ; 하는 동안에 (( = 콘솔.읽어주세요()) != -1) {     한다면 ( == ' ')         계속하다.;    // 나머지 시간 루프를 건너뜁니다.      // 나머지 시간 루프     ... } 

while위의 코드에서 루프를 호출하여 문자를 읽습니다.GetChar(), 문자가 공백인 경우 루프 본문의 문을 건너뜁니다.

예외처리

C#의 런타임 예외 처리 메서드는 Java 및 C++에서 상속됩니다.

기본 클래스 라이브러리에 다음과 같은 클래스가 있습니다.System.Exception다른 모든 예외 클래스들이 파생된 것입니다. 안Exception-object에는 특정 예외와 발생한 내부 예외에 대한 모든 정보가 포함됩니다.프로그래머들은 그들 자신의 예외를 정의할 수 있습니다.Exception학급.

예외는 다음과 같은 방식으로 처리할 수 있습니다.

던지다 신규 구현되지 않음예외.(); 

try ... catch ... finally진술들

예외는 내에서 관리됩니다.try ... catch토막토막

해라 {     // 예외를 허용할 수 있는 문구     ... } 또 만나 (예외. 전의) {     // 여기서 예외를 포착하여 처리합니다.     ... } 마침내. {     // 시도/캐치 블록 다음에 항상 실행되는 문     ... } 

안에 있는 문장들은try블록이 실행되고, 그들 중 하나가 예외를 던지면, 블록의 실행은 중단되고 예외는 에 의해 처리됩니다.catch막다른 골목여러 개가 있을 수 있습니다.catchblocks. 이 경우, 예외 변수가 있는 첫 번째 블록이 실행되며, 예외 변수의 유형이 허용된 예외의 유형과 일치합니다.

안되면catchblock은 다음을 포함하는 바깥쪽 block(또는 method)의 실행인 던져진 예외의 유형과 일치합니다.try ... catch문장이 중단되고 예외는 포함된 블록 또는 메서드의 위쪽 및 바깥쪽으로 전달됩니다.예외는 일치할 때까지 콜 스택을 통해 위로 전파됩니다.catch블록은 현재 활성화된 메서드 중 하나 내에서 찾을 수 있습니다.예외가 맨 위까지 전파되는 경우Main()일치하지 않는 방법catch블록이 발견되면 전체 프로그램이 종료되고 예외에 대한 텍스트 설명이 표준 출력 스트림에 기록됩니다.

안에 있는 문장들은finally블록은 항상 다음에 실행됩니다.try그리고.catch예외가 발생했는지 여부에 관계없이 블록.이러한 블록은 정리 코드를 제공하는 데 유용합니다.

둘중에 하나는catch블록, afinally블록 또는 둘 다 뒤에 따라야 합니다.try막다른 골목

종류들

C#은 C나 C++와 같이 정적으로 입력된 언어입니다.이는 모든 변수와 상수가 선언될 때 고정된 유형을 갖는다는 것을 의미합니다.값 유형참조 유형의 두 가지 유형이 있습니다.

값 유형

값 유형의 인스턴스가 스택에 있습니다. 즉, 해당 인스턴스는 해당 변수에 바인딩됩니다.값 유형에 대한 변수를 선언하면 메모리가 직접 할당됩니다.변수가 범위를 벗어나면 개체도 함께 제거됩니다.

구조물들

구조물은 일반적으로 구조물로 알려져 있습니다.Structs는 사용자 정의 값 유형으로, 다음을 사용하여 선언됩니다.struct키워드.클래스와 매우 비슷하지만 경량 타입에 더 적합합니다.클래스와 구조체 간의 몇 가지 중요한 구문적 차이점은 이 기사의 뒷부분에 제시됩니다.

짜임새 있는  {     ... } 

원시 데이터 유형은 모두 구조입니다.

기정형

이것들이 원시 데이터 유형입니다.

원시형
유형명 BCL 당량 가치 범위 크기 기본값
sbyte System.SByte 정수의 -128 ~ +127 8비트(1바이트) 0
short System.Int16 정수의 -32,768 ~ +32,767 16비트(2바이트) 0
int System.Int32 정수의 -2,147,483,648 ~ +2,147,483,647 32비트(4바이트) 0
long System.Int64 정수의 -9,223,372,036,854,775,808~
+9,223,372,036,854,775,807
64비트(8바이트) 0
byte System.Byte 부호 없는 정수 0 ~ 255 8비트(1바이트) 0
ushort System.UInt16 부호 없는 정수 0 ~ 65,535 16비트(2바이트) 0
uint System.UInt32 부호 없는 정수 0 ~ 4,294,967,295 32비트(4바이트) 0
ulong System.UInt64 부호 없는 정수 0 ~ 18,446,744,073,709,551,615 64비트(8바이트) 0
decimal System.Decimal 부호가 있는 십진수 -79,228,162,514,264,337,593,543,950,335~
+79,228,162,514,264,337,593,543,950,335
128비트(16바이트) 0.0
float System.Single 부동 소수점 번호 ±1.401298E-45 ~ ±3.402823E+38 32비트(4바이트) 0.0
double System.Double 부동 소수점 번호 ±4.94065645841246E-324~
±1.79769313486232E+308
64비트(8바이트) 0.0
bool System.Boolean 부울 true아니면false 8비트(1바이트) false
char System.Char 단일 유니코드 문자 '\u0000'통해.'\uFFFF' 16비트(2바이트) '\u0000'

참고: string(System.String)는 구조체가 아니며 원시형이 아닙니다.

열거형

열거된 유형(표시됨)enum)는 정수 값을 나타내는 명명된 값입니다.

열거하다 계절 {     겨울 = 0,      = 1,     여름 = 2,     가을 = 3,     떨어지다 = 가을    // 가을은 미국영어로 Fall이라고 불립니다. } 

열거형 변수는 기본적으로 0으로 초기화됩니다.열거형으로 정의된 명명된 값에 할당하거나 초기화할 수 있습니다.

계절 계절; 계절 = 계절.; 

열거형 변수는 정수 값입니다.동일한 유형의 변수 간의 가감산은 특정 캐스트 없이 허용되지만 곱셈과 나눗셈은 다소 위험하며 명시적 캐스트가 필요합니다.열거형 변수를 정수 유형으로 변환하거나 정수 유형에서 변환하는 데도 깁스가 필요합니다.그러나 형식 정의로 값을 지정하지 않으면 캐스트는 예외를 발생시키지 않습니다.

계절 = (계절)2;  // 시즌 유형의 열거 값에 2를 캐스팅합니다. 계절 = 계절 + 1; // 값에 1을 더합니다. 계절 = 계절 + 시즌2; // 열거형 변수 두 개의 값을 추가합니다. 인트 가치 = (인트)계절; // 열거값을 정수 값으로 캐스팅하고 있습니다.  계절++; // 계절을.봄(1)이 계절이 됩니다.여름 (2). 계절--; // 계절을.여름(2)이 계절이 됩니다.스프링(1). 

bitwise-OR 연산자를 사용하여 값을 조합할 수 있습니다. .

색. 마이컬러즈 = 색..초록의   색..노란 색   색..파랑색; 

참고종류

참조 유형에 대해 생성된 변수는 유형 관리 참조입니다.생성자가 호출되면 힙에 개체가 생성되고 참조가 변수에 할당됩니다.개체의 변수가 범위를 벗어나면 참조가 끊어지고 참조가 남아 있지 않으면 개체가 가비지로 표시됩니다.그러면 쓰레기 수집가가 곧 그것을 수거해서 파괴할 것입니다.

참조 변수가 개체를 참조하지 않으면 null입니다.

배열

배열 유형은 특정 유형의 요소를 하나 이상 포함하는 공간을 나타내는 참조 유형입니다.모든 배열 유형은 공통 기본 클래스에서 파생됩니다.System.Array. 각 요소는 C++ 및 Java와 마찬가지로 인덱스에 의해 참조됩니다.

C#의 배열은 C++에서 동적 배열이라고 불리는 것입니다.

인트[] 수를 = 신규 인트[2]; 수를[0] = 2; 수를[1] = 5; 인트 x = 수를[0]; 
이니셜라이저

배열 초기화기는 배열 초기화에 편리한 구문을 제공합니다.

// 장문법 인트[] 수를 = 신규 인트[5]{ 20, 1, 42, 15, 34 }; // 단문법 인트[] 2번 = { 20, 1, 42, 15, 34 }; // 추론된 구문 변태의 3번 = 신규[] { 20, 1, 42, 15, 34 }; 
다차원 배열

배열은 하나 이상의 차원(예: 그리드를 나타내는 2차원)을 가질 수 있습니다.

인트[,] 수를 = 신규 인트[3, 3]; 수를[1,2] = 2;  인트[,] 2번 = 신규 인트[3, 3] { {2, 3, 2}, {1, 2, 6}, {2, 4, 5} }; 

참고 항목

클래스는 사용자 정의 참조 유형을 자체적으로 설명합니다.기본적으로 의 모든 유형입니다.NET Framework는 컴파일러 생성 클래스인 구조 및 enum을 포함한 클래스입니다.학급 구성원은private기본적으로 다음과 같이 선언할 수 있습니다.public수업 밖에서 볼 수 있거나 또는protected모든 계층의 후손들이 볼 수 있습니다.

줄들

System.String수업, 또는 간단히string, 유니코드 문자의 불변 순서를 나타냅니다. (char).

문자열에 대해 수행되는 작업은 항상 새 문자열을 반환합니다.

끈을 본문 = "헬로 월드!"; 끈을 기질을 = 본문.서브스트링(0, 5); 끈을[] 부품. = 본문.분열되다(신규 차를[]{ ' ' }); 

System.StringBuilder클래스는 가변 "스트링"이 필요할 때 사용할 수 있습니다.

변태의 누군가를 = 신규 스트링빌더(); 누군가를.부록('H'); 누군가를.부록("엘"); 누군가를.선 추가("로!"); 

인터페이스

인터페이스는 실제 구현 없이 구성원 정의를 포함하는 데이터 구조입니다.인터페이스 유형의 변수는 이 인터페이스를 구현하는 클래스의 인스턴스에 대한 참조입니다.#인터페이스 참조.

대의원

C#은 대리인 형태로 안전한 객체 지향 함수 포인터를 제공합니다.

학급 프로그램. {     // 위임자 유형:     위임인 인트 작동(인트 a, 인트 b);      정적인 인트 더하다(인트 i1, 인트 i2)     {         돌아가다 i1 + i2;     }      정적인 인트 후보선수(인트 i1, 인트 i2)     {         돌아가다 i1 - i2;     }      정적인 공허한 주된()     {         // 대리인을 인스턴스화하고 메소드를 대리인에게 할당합니다.         작동 op = 더하다;          // 딜러가 가리키는 메소드를 호출합니다.         인트 결과1 = op(2, 3);  // 5          op = 후보선수;         인트 결과2 = op(10, 2); // 8     } } 

익명 메서드로 위임자를 초기화하는 중입니다.

추가 = 위임인(인트 a, 인트 b) { 돌아가다 a + b; }; 

람다 식으로 딜러를 초기화하는 중입니다.

추가 = (a, b) => a + b; 

이벤트

이벤트는 여러 메서드를 가리킬 수 있는 포인터입니다.보다 정확하게 말하면 메서드 포인터를 하나의 식별자에 바인딩합니다.따라서 이는 딜러들에게까지 확대된 것으로 볼 수 있습니다.일반적으로 UI 개발에서 트리거로 사용됩니다.C# 및 나머지 공용어 인프라스트럭처에서 사용되는 양식은 고전적인 Visual Basic에 있는 양식을 기반으로 합니다.

위임인 공허한 마우스 이벤트 처리기(물건 발송인, 마우스 이벤트Args e);  일반의 학급 단추 : 시스템..창문들.컨트롤.통제 {     사적인 이벤트성 마우스 이벤트 처리기 _onClick;      /* 가상 트리거 함수 */     공허한 클릭()     {         _onClick(이것., 신규 마우스 이벤트Args(데이터.));     } } 

이벤트를 수행하려면 Windows Presentation FoundationWindows Forms와 같은 플랫폼 특정 라이브러리에서 일반적으로 보내는 사람과 이벤트 인수의 두 가지 매개 변수를 사용하는 특별 위임자의 이벤트 핸들러가 필요합니다.CLI 기본 라이브러리의 일부인 EventArgs 클래스에서 파생된 이벤트 인수 개체의 유형입니다.

클래스에서 이벤트를 호출할 수 있는 유일한 방법은 소유자 내부에서 실행하는 것입니다.리스너 방식은 이벤트가 발화될 때 트리거되도록 외부에서 구현될 수 있습니다.

일반의 학급 주 창 : 시스템..창문들.컨트롤. {     사적인 단추 _버튼1;      일반의 주 창()     {         _버튼1 = 신규 단추();         _버튼1.본문 = "클릭!";          /* 이벤트 가입 */         _버튼1.이벤트 클릭 += 버튼1_OnClick;          /* 오래된 것으로 간주되는 대체 구문: _버튼 1.마우스 클릭 += 새 마우스 이벤트 처리기(Button1_OnClick); */     }      보호를 받는 공허한 버튼1_OnClick(물건 발송인, 마우스 이벤트Args e)     {         메시지 상자.("딸깍!");     } } 

맞춤형 이벤트 구현도 가능합니다.

 사적인 이벤트 처리기 _clickHandles = (s, e) => { };   일반의 이벤트성 이벤트 처리기 클릭  {   더하다   {    // 처리기를 추가할 때 실행할 코드가 있습니다.    ...     _clickHandles += 가치;   }   제거한다.   {    // 핸들러가 제거되면 실행할 코드가 있습니다.    ...     _clickHandles -= 가치;   }  } 

참고 항목

Nullable 유형

이것은 C# 2.0의 특징입니다.

Nullable type은 값 유형을 null로 설정하기 위해 C# 2.0에 처음 도입되었습니다(데이터베이스 작업 시 유용함).

int? n = 2; n = 귀무의;  콘솔.쓰기 선(n.Has Value); 

사실 이것은 사용하는 것과 같습니다.Nullable<T>짜임새 있는

널블<인트> n = 2; n = 귀무의;  콘솔.쓰기 선(n.Has Value); 

포인터

C#은 안전하지 않은 컨텍스트에서 선택된 유형(일부[6] 프리미티브, 열거형, 문자열, 포인터, 심지어 포인팅할 수 있는 유형만 포함하는 경우 배열 및 구조체)에 대한 포인터를 가지고 허용합니다(메소드 및 코드블록 표시).unsafe. 이것들은 C와 C++의 포인터들과 통사적으로 같습니다.그러나 런타임 검사는 내부에서 사용할 수 없습니다.unsafe토막토막

정적인 공허한 주된(끈을[] 아그스) {     불안한     {         인트 a = 2;         인트* b = &a;          콘솔.쓰기 선("a의 주소: {0}. 값: {1}", (인트)&a, a);         콘솔.쓰기 선("b의 주소: {0}. 값: {1}. *b의 값: {2}", (인트)&b, (인트)b, *b);          // 다음과 같은 것을 출력합니다.         // 주소: 71953600.값 : 2         // b의 주소: 71953596.값: 71953600.*b의 값 : 2     } } 

Structs는 문자열이나 다른 클래스와 같이 관리되는 참조 유형의 멤버가 없는 순수한 Structs여야 합니다.

일반의 짜임새 있는 마이 스트럭트 {     일반의 차를 성격;     일반의 인트 정수; }  일반의 짜임새 있는 내 컨테이너 구조 {     일반의 바이트로 바이트;     일반의 마이 스트럭트 마이 스트럭트; } 

사용 중:

내 컨테이너 구조 x; 내 컨테이너 구조* ptr = &x;  바이트로 가치 = ptr->바이트; 

역학

이것은 C# 4.0 의 기능입니다.NET Framework 4.0.

유형dynamic는 정적인 방식으로 C#에 대한 동적 런타임 조회를 가능하게 하는 기능입니다.동적은 컴파일 시간이 아닌 런타임에 해결되는 유형의 개체를 가진 변수를 나타냅니다.

이 기능은 DLR(Dynamic Language Runtime)의 이점을 활용하며 IronPythonIronRuby(PythonRuby for)와 같은 동적 유형 언어와의 상호 작용을 목표로 특별히 설계되었습니다.NET).

또한 동적 지원은 COM 개체와의 상호 작용을 용이하게 합니다.

역학 x = 신규 (); x.어떻게 좀 해봐.();  // 런타임에 컴파일 및 확인합니다.유효하지 않은 경우 예외가 삭제됩니다. 

익명형

이것은 C# 3.0의 특징입니다.

익명 유형은 컴파일러에 의해 생성되는 이름 없는 클래스입니다.개체를 반환하는 LINQ 쿼리가 있는 경우와 같은 시나리오에서는 소모성이지만 매우 유용합니다.select몇 가지 특정 값을 반환하고 싶을 뿐입니다.그런 다음 값에 대한 자동 생성 읽기 전용 필드를 포함하는 익명 유형을 정의할 수 있습니다.

동일한 서명으로 다른 익명 형식 선언을 인스턴스화할 때 컴파일러에 의해 형식이 자동으로 유추됩니다.

변태의 칼로 찌르다 = 신규 { 이름. = , 나이 = 35 }; // 형식의 이름은 컴파일러에서만 알 수 있습니다. 변태의 메리 = 신규 { 이름. = 메리, 나이 = 22 }; // 위 식과 동일한 형식 

복싱과 언복싱

복싱은 값 유형의 값을 해당 기준 유형의 값으로 변환하는 작업입니다.[7]C#의 복싱은 암시적입니다.

Unboxing은 참조 유형(이전에 박스화된)의 값을 값 유형의 값으로 변환하는 작업입니다.[7]C#에서 복싱을 해제하려면 명시적 유형 캐스트가 필요합니다.

예:

인트 푸우 = 42;         // 값 유형. 물건  = 푸우;     // foo는 bar에 박제되어 있습니다. 인트 foo2 = (인트);  // 값 유형으로 다시 상자를 열었습니다. 

객체 지향 프로그래밍(OOP)

C#은 객체 지향 프로그래밍을 직접 지원합니다.

물건들

개체는 유형을 템플릿으로 사용하여 생성되며 해당 특정 유형의 인스턴스라고 합니다.

C#에서 개체는 참조 또는 값입니다.코드에 있는 것들 사이에 더 이상의 통사적인 구별은 이루어지지 않습니다.

객체 클래스

모든 유형, 심지어 박스 형태의 값 유형도 은연중에 다음에서 상속됩니다.System.Object클래스, 모든 물체의 궁극 기본 클래스.이 클래스는 모든 개체가 공유하는 가장 일반적인 메서드를 포함합니다.이것들 중 일부는virtual무시할 수 있습니다.

클래스 상속System.Object직접적으로 또는 다른 기본 클래스를 통해 간접적으로.

회원들
Object 클래스의 일부 멤버:

  • Equals- 개체 간 비교를 지원합니다.
  • Finalize- 개체를 자동으로 회수하기 전에 정리 작업을 수행합니다.(기본 파괴자)
  • GetHashCode- 해시 테이블의 사용을 지원할 개체의 값에 해당하는 번호를 가져옵니다.
  • GetType- 현재 인스턴스의 Type을 가져옵니다.
  • ToString- 클래스의 인스턴스를 설명하는 사용자가 읽을 수 있는 텍스트 문자열을 만듭니다.일반적으로 유형의 이름을 반환합니다.

클래스는 C#과 같은 객체 지향 언어의 기본입니다.개체의 템플릿 역할을 합니다.그들은 데이터를 실제와 같은 방식으로 저장하고 조작하는 구성원들을 포함되어 있습니다.

클래스와 구조간의 차이

계층과 구조는 선언되는 방식과 사용되는 방식 모두에서 유사하지만, 몇 가지 중요한 차이가 있습니다.클래스는 참조 유형이고 구조는 값 유형입니다.구조가 선언되고 변수가 주소에 바인딩되면 스택에 구조가 할당됩니다.값이 직접 포함되어 있습니다.메모리가 힙에 개체로 할당되어 있기 때문에 클래스가 다릅니다.변수는 객체를 가리키는 스택에서 관리되는 포인터입니다.참고 자료입니다.

구조물은 다른 몇 가지 점에서 클래스와 다릅니다.예를 들어, 둘 다 인수를 사용하지 않는 암시적 기본 생성자를 제공하지만, 구조물에 대해서는 이 생성자를 재정의할 수 없습니다.매개 변수화된 생성자를 명시적으로 정의하면 클래스에서 암시적 기본 생성자를 억제하지만, 구조체에서는 억제하지 못합니다.구조물의 모든 필드는 이러한 종류의 생성자에서 초기화되어야 합니다.Structs에는 종결자가 없으므로 클래스처럼 다른 클래스에서 상속할 수 없습니다.암묵적으로, 그들은 봉인되어 있고 그로부터 물려받습니다.System.ValueType(다음에서 상속됨)System.Object구조는 적은 양의 데이터에 더 적합합니다.

다음은 차이점을 간단히 요약한 것입니다.

기본 생성자 피니셔 회원초기화 상속
필요 없음(자동 생성)[a] 네. 불요불급 예(기본 클래스가 아닌 경우)sealed)
구조물 필수(자동 생성)[b] 아니요. 필수의 지원되지 않음
  1. ^ 다른 컨스트럭터가 제공되지 않은 경우에만 생성됩니다.
  2. ^ 항상 자동으로 생성되며 프로그래머가 작성할 수 없습니다.

선언.

클래스는 다음과 같이 선언됩니다.

학급  {     // 회원선언문 } 
부분반
이것은 C# 2.0의 특징입니다.

부분 클래스는 코드가 개별 파일로 분할된 클래스 선언입니다.부분 클래스의 다른 부분은 키워드로 표시해야 합니다.partial.

// File1.cs 부분적인 학급  {     ... }  // File2.cs 부분적인 학급  {     ... } 

부분 클래스를 사용하는 일반적인 이유는 일부 클래스를 프로그래머가 유지 관리하는 부분과 도구가 유지 관리하는 부분으로 나누기 위해서입니다. 즉, 일부 코드는 사용자 인터페이스 설계 도구 등에 의해 자동으로 생성됩니다.

초기화

클래스의 멤버를 사용하려면 먼저 개체를 참조하여 변수를 초기화해야 합니다.생성하려면 다음을 사용하여 해당 생성자를 사용하여new키워드.클래스와 이름이 같습니다.

변태의 푸우 = 신규 (); 

구조물의 경우 기본 생성자가 자동으로 호출되므로 생성자를 명시적으로 호출하는 것은 선택 사항입니다.신고만 하면 표준값으로 초기화됩니다.

개체 초기화기
이것은 C# 3.0의 특징입니다.

개체의 공용 필드 및 속성을 보다 편리하게 초기화할 수 있는 방법을 제공합니다.기본 생성자가 있는 경우 생성자 호출은 선택 사항입니다.

변태의 사람인 = 신규 사람인 {     이름. = 존 도,     나이 = 39 };  // 같음 변태의 사람인 = 신규 사람인(); 사람인.이름. = 존 도; 사람인.나이 = 39; 
컬렉션 초기화자
이것은 C# 3.0의 특징입니다.

컬렉션 초기화기는 컬렉션을 초기화하기 위한 배열과 같은 구문을 제공합니다.컴파일러는 단순히 Add-method에 대한 호출을 생성합니다.인터페이스를 구현하는 클래스에 적용됩니다.ICollection.

변태의 목록. = 신규 목록.<인트> {2, 5, 6, 6};  // 같음 변태의 목록. = 신규 목록.<인트>(); 목록..더하다(2); 목록..더하다(5); 목록..더하다(6); 목록..더하다(6); 

구성원 액세스

인스턴스의 멤버와 클래스의 정적 멤버는 다음을 사용하여 액세스합니다..교환입니다.

인스턴스 멤버 액세스
인스턴스 멤버는 변수 이름을 통해 액세스할 수 있습니다.

끈을 푸우 = "안녕하세요"; 끈을 fooUpper = 푸우.갑피로(); 

정적 클래스 멤버 액세스
정적 구성원은 클래스 이름이나 다른 유형을 사용하여 액세스합니다.

인트 r = 끈을.비교하다(푸우, fooUpper); 

포인터를 통해 구성원 액세스
안전하지 않은 코드에서 포인터가 참조하는 값(구조형)의 멤버는 다음과 같이 액세스됩니다.->연산자는 C와 C++와 같습니다.

포인트 p; p.X = 2; p.Y = 6; 포인트* ptr = &p; ptr->Y = 4; 

수식어

수정자는 유형 및 유형 구성원의 선언을 수정하는 데 사용되는 키워드입니다.가장 눈에 띄는 것은 접근 수정자를 포함하는 하위 그룹입니다.

클래스 한정자
  • abstract- 클래스가 기본 클래스로만 사용되도록 지정합니다.상속 클래스에서 구현해야 합니다.클래스에 추상 메서드를 허용하기 위한 전제 조건.
  • sealed- 클래스를 상속할 수 없도록 지정합니다.
클래스 멤버 수식어
  • abstract- 파생된 모든 비추상 클래스에서 사용할 수 있는 메서드를 선언합니다.
  • const- 변수가 선언될 때 초기화해야 하는 상수 값임을 지정합니다.
  • event- 이벤트를 선언합니다.
  • extern- 본문이 없는 메서드 서명에서 DLL 가져오기를 사용하도록 지정합니다.
  • override- 메서드 또는 속성 선언이 가상 멤버의 재정의이거나 추상 클래스의 멤버의 구현임을 지정합니다.
  • readonly- 선언의 일부 또는 동일 클래스의 생성자로만 값을 할당할 수 있는 필드를 선언합니다.
  • unsafe- 포인터를 사용할 수 있는 안전하지 않은 컨텍스트를 지정합니다.
  • virtual- 메서드 또는 속성 선언을 파생 클래스에서 재정의할 수 있도록 지정합니다.
  • volatile- 외부 프로세스에 의해 수정될 수 있는 필드를 지정하고 최적화 컴파일러가 필드의 현재 값의 지속성을 추측하지 못하도록 합니다.
static수식어

staticmodifier는 멤버가 특정 개체가 아닌 클래스에 속한다고 말합니다.static으로 표시된 클래스는 static 멤버만 포함할 수 있습니다.정적 구성원은 클래스 인스턴스가 아닌 전체 클래스에 적용되므로 클래스 구성원이라고도 합니다.

일반의 학급  {     일반의 정적인 공허한 뭔가()     {         ...     } } // 클래스 메서드를 호출합니다. .뭔가(); 
액세스 수식어

액세스 수정자 또는 상속 수정자는 클래스, 메서드 및 기타 구성원의 액세스 가능성을 설정합니다.표시된 것public어디서든 연락이 가능합니다.private구성원은 자신이 선언된 클래스 내부에서만 액세스할 수 있으며 상속될 때 숨겨집니다.의 멤버.protected수식어는private, 상속이 되면 접근할 수 있습니다.internal클래스 및 구성원은 선언 어셈블리 내부에서만 액세스할 수 있습니다.

클래스와 구조는 암시적으로internal그리고 멤버들은 암묵적으로private액세스 수정자가 없는 경우.

일반의 학급  {     일반의 인트 ()     {         돌아가다 0;     }      일반의 학급      {      } } 

이 표는 액세스 수식어를 사용할 수 있는 위치를 정의합니다.

중첩되지 않은 유형 구성원(포함)중첩 유형) 접근 가능
public 네. 네. 모든.
protected internal 아니요. 네. 같은 반, 파생된 반, 그리고 같은 모임에 있는 모든 것.
protected 아니요. 네. 동류 및 파생류
internal 예(기본값) 네. 같은 집합체에 있는 모든 것
private protected 아니요. 네. 같은 반, 같은 모임에서 파생된 반.
private 아니요. 예(기본값) 동급의

컨스트럭터

생성자는 객체가 생성될 때 자동으로 호출되는 특별한 방법입니다.이것의 목적은 개체의 구성원을 초기화하는 것입니다.생성자는 클래스와 이름이 같고 명시적으로 반환하지 않습니다.암시적으로, 이들은 를 통해 호출될 때 새로 생성된 객체를 반환합니다.new교환입니다.다른 방법과 마찬가지로 모수를 사용할 수도 있습니다.매개 변수가 없는 생성자는 일반 형식 매개 변수에 필요한 제약 조건으로 지정할 수 있기 때문에 특수합니다.

학급  {     ()     {         ...     } } 

생성자는 다음과 같을 수 있습니다.public,private,protected아니면internal.

파괴자

개체를 가비지 수집기가 수동 정리를 수행하기 위해 수집할 때 디스트럭터가 호출됩니다.다음과 같은 기본 소멸자 메서드가 있습니다.finalize자신의 것을 선언함으로써 무시할 수 있습니다.

구문은 생성자의 구문과 비슷합니다.이름 앞에 ~가 있고 매개 변수를 포함할 수 없다는 차이점이 있습니다.하나 이상의 소멸자가 있을 수 없습니다.

학급  {     ...      ~()     {         ...     } } 

피니셔는 항상private.

방법들

C나 C++처럼 재사용 가능한 코드를 그룹화하는 기능이 있습니다.주요 차이점은 자바와 마찬가지로 기능이 클래스 내부에 상주해야 한다는 것입니다.따라서 함수를 메소드(method)라고 합니다.메서드에는 반환 값, 이름이 있으며 일반적으로 일부 인수와 함께 호출될 때 초기화된 일부 매개 변수가 있습니다.클래스 인스턴스에 속하거나 정적 멤버일 수 있습니다.

학급  {     인트 (인트 a, 인트 b)     {         돌아가다 a%b;     } } 

메소드는 다음을 사용하여 호출됩니다..특정 변수에 대한 표기법 또는 정적 메서드의 경우와 마찬가지로 유형의 이름입니다.

 푸우 = 신규 (); 인트 r = 푸우.(7, 2);  콘솔.쓰기 선(r); 
ref그리고.out매개변수들

키워드 앞에 매개 변수가 있는 메소드를 호출할 때 참조로 인수를 전달하도록 명시적으로 만들 수 있습니다.ref아니면out. 이러한 관리 포인터는 메서드 내부에서 수정하려는 변수를 참조로 전달할 때 유용합니다.그 둘의 가장 큰 차이점은out메서드가 반환될 때까지 메서드 내에 매개 변수가 할당되어 있어야 합니다.ref새 값을 할당할 수도 있고 할당하지 않을 수도 있지만 함수를 호출하기 전에 매개 변수 변수를 초기화해야 합니다.

공허한 패스레프(ref 인트 x) {     한다면 (x == 2)         x = 10; } 인트 Z = 7; 패스레프(ref Z);  공허한 패스아웃(나가. 인트 x) {     x = 2; } 인트 Q; 패스아웃(나가. Q); 
옵션 파라미터
이것은 C# 4.0의 특징입니다.

C# 4.0은 C++에서 볼 수 있는 기본값을 가진 선택적 매개변수를 도입합니다.예를 들어,

공허한 증분(ref 인트 x, 인트 dx = 1) {     x += dx; }  인트 x = 0; 증분(ref x);    // dx는 기본값인 1을 사용합니다. 증분(ref x, 2); // dx 값 2를 사용합니다. 

또한 옵션 파라미터를 보완하기 위해 메서드 호출에서 파라미터 이름을 명시적으로 지정할 수 있으므로 메서드에 대한 옵션 파라미터의 주어진 하위 집합을 선택적으로 전달할 수 있습니다.유일한 제한 사항은 명명된 매개 변수 뒤에 명명된 매개 변수를 배치해야 한다는 것입니다.매개변수 이름은 선택적 매개변수와 필수 매개변수 모두에 대해 지정할 수 있으며, 가독성을 향상시키거나 호출에서 임의로 인수의 순서를 바꾸는데 사용할 수 있습니다.예를 들어,

개울. 파일 열기(끈을 이름., 파일 모드 모드 = 파일 모드.열다., 파일 액세스 접근 = 파일 액세스.읽어주세요) { ... }  파일 열기("file.txt"); // "mode"와 "access" 모두에 기본값 사용 파일 열기("file.txt", 모드: 파일 모드.만들다); // "액세스"에 기본값 사용 파일 열기("file.txt", 접근: 파일 액세스.읽어주세요); // "mode"에 기본값 사용 파일 열기(이름.: "file.txt", 접근: 파일 액세스.읽어주세요, 모드: 파일 모드.만들다); // 가독성을 높이기 위해 모든 매개변수의 이름을 지정합니다. // 그리고 메소드 선언과 다른 순서를 사용합니다. 

옵션 파라미터를 사용하면 COM과의 상호 운용이 쉬워집니다.이전에는 C#가 COM 구성 요소의 방식으로 모든 파라미터를 전달해야 했고, 심지어 선택 사항인 파라미터도 전달해야 했습니다.예를 들어,

물건 fileName = "Test.docx"; 물건 실종된 = 시스템..반사.실종된.가치;  문서를.다른 이름으로 저장(ref fileName,     ref 실종된, ref 실종된, ref 실종된,     ref 실종된, ref 실종된, ref 실종된,     ref 실종된, ref 실종된, ref 실종된,     ref 실종된, ref 실종된, ref 실종된,     ref 실종된, ref 실종된, ref 실종된); 위로의.글줄("파일 저장 성공"); 

옵션 파라미터 지원을 통해 코드를 다음과 같이 단축할 수 있습니다.

문서를.다른 이름으로 저장(ref fileName); 
extern

C#의 특징은 네이티브 코드를 호출하는 기능입니다.메서드 서명은 본문 없이 간단히 선언되며 다음과 같이 표시됩니다.extern.그DllImport원하는 DLL 파일을 참조하기 위해 속성도 추가해야 합니다.

[Dll가져오기("win32.dll")] 정적인 외전의 두 배의 파워(두 배의 a, 두 배의 b); 

필드

데이터를 저장하기 위해 필드 또는 인스턴스 변수를 클래스 본문 내에서 선언할 수 있습니다.

학급  {     두 배의 푸우; } 

선언된 경우(구조로 선언되지 않은 경우) 필드를 직접 초기화할 수 있습니다.

학급  {     두 배의 푸우 = 2.3; } 

필드의 수식어:

  • const- 필드를 상수로 만듭니다.
  • private- 필드를 비공개로 만듭니다(기본값).
  • protected- 필드를 보호합니다.
  • public- 필드를 공개합니다.
  • readonly- 생성자에서 필드를 한 번만 초기화할 수 있습니다.
  • static- 필드를 정적 멤버, 즉 클래스 변수로 만듭니다.

특성.

속성은 필드와 같은 구문을 가져와 메소드의 힘과 결합합니다.속성에는 다음과 같은 두 개의 접근자가 있을 수 있습니다.get그리고.set.

일반의 학급 사람인 {     사적인 끈을 _이름;      끈을 이름.     {         얻다 { 돌아가다 _이름; }         세트 { _이름 = 가치; }     } }  // 속성 사용 변태의 사람인 = 신규 사람인(); 사람인.이름. = 로버트; 

속성의 수식어:

  • private- 속성을 개인 정보로 만듭니다(기본값).
  • protected- 속성을 보호합니다.
  • public- 속성을 공개합니다.
  • static- 속성을 정적 멤버로 만듭니다.

속성 접근자에 대한 수식어:

  • private- 접근자를 비공개로 만듭니다.
  • protected- 접근자를 보호합니다.
  • public- 접근자를 공개합니다.

접근자의 기본 수식어는 속성에서 상속됩니다.접근자의 수식어는 속성 수식어와 같거나 더 제한적일 수 있습니다.

자동 속성
이것은 C# 3.0의 특징입니다.

C# 3.0의 특징은 자동으로 구현된 속성입니다.본문이 없는 액세스자를 정의하면 컴파일러가 액세스자에 필요한 백킹 필드와 코드를 생성합니다.

일반의 두 배의  { 얻다; 사적인 세트; } 

인덱서

인덱서는 개체에 배열과 유사한 인덱싱 기능을 추가합니다.속성과 유사한 방식으로 구현됩니다.

내부의 학급 IntList {     사적인 인트[] _;      인트 이것.[인트 색인을 보다]     {         얻다 { 돌아가다 _[색인을 보다]; }         세트 { _[색인을 보다] = 가치; }     } }  // 인덱서 사용 변태의 목록. = 신규 IntList(); 목록.[2] = 2; 

상속

C#의 클래스는 하나의 클래스에서만 상속할 수 있습니다.클래스는 다음으로 표시되지 않은 클래스에서 파생될 수 있습니다.sealed.

학급 A { }   학급 B : A {  } 
virtual

표기방법virtual구현을 제공하지만, 이들은 다음을 사용하여 상속자들에 의해 무시될 수 있습니다.override키워드.

구현은 변수의 유형이 아니라 개체의 실제 유형에 의해 선택됩니다.

학급 작동 {     일반의 가상의 인트 ()     {         돌아가다 0;     } }  학급 새 작업 : 작동 {     일반의 덮어씌우다 인트 ()     {         돌아가다 1;     } } 
new

가상이 아닌 메서드를 다른 서명으로 오버로드하는 경우 키워드new사용될 수 있습니다.개체의 실제 유형 대신 변수의 유형에 따라 사용 방법이 선택됩니다.

학급 작동 {     일반의 인트 ()     {         돌아가다 0;     } }  학급 새 작업 : 작동 {     일반의 신규 두 배의 ()     {         돌아가다 4.0;     } } 

이는 다음과 같은 경우를 보여줍니다.

변태의 작동 = 신규 새 작업();  // 새 작업에서 "double Do()"를 호출합니다. 두 배의 d = 작동.();  작동 운용_ = 작동;  // 작업에서 "int Do()"를 호출합니다. 인트 i = 운용_.(); 
abstract

추상 클래스는 템플릿 역할만 하는 클래스이며 해당 유형의 개체를 초기화할 수 없습니다.그렇지 않으면 보통 수업과 같습니다.

추상적인 멤버도 있을 수 있습니다.추상 구성원은 구현이 없는 추상 클래스의 구성원입니다.구성원을 상속하는 추상적이 아닌 클래스는 이러한 클래스를 재정의해야 합니다.

추상적인 학급 포유류 {     일반의 추상적인 공허한 걸어.(); }  학급 인간을 : 포유류 {     일반의 덮어씌우다 공허한 걸어.()     {      }      ... } 
sealed

sealedmodifier는 클래스를 상속할 수 없도록 하거나 파생 클래스에서 클래스를 재정의하는 것을 허용하지 않는 메서드에 대한 선택적인 modifier로 다른 클래스와 결합할 수 있습니다.

내부의 밀봉된 학급  {     //... }  일반의 학급  {     일반의 가상의 공허한 액션.()     {         //...     } }  일반의 학급 바즈 :  {     일반의 밀봉된 덮어씌우다 공허한 액션.()     {         //...     } } 

인터페이스

인터페이스는 구성원 정의를 포함하는 데이터 구조이며 실제 구현은 아닙니다.이러한 도구는 구현 형태가 다른 구성원 간의 계약을 정의하려는 경우에 유용합니다.메서드, 속성 및 인덱서에 대한 정의를 선언할 수 있습니다.인터페이스 구성원은 암묵적으로 공개됩니다.인터페이스는 암시적으로 구현되거나 명시적으로 구현될 수 있습니다.

인테 IB 바이너리 오퍼레이션 {     두 배의 A { 얻다; 세트; }     두 배의 B { 얻다; 세트; }      두 배의 결과 가져오기(); } 

인터페이스 구현

인터페이스는 클래스에 의해 구현되거나 다른 인터페이스에 의해 확장됩니다. 당신이 다른 클래스로부터 클래스를 도출하는 것과 같은 방식으로.:표기법

암묵적 구현

인터페이스를 암묵적으로 구현할 때 인터페이스의 구성원은 다음과 같이 되어야 합니다.public.

일반의 학급 덧셈기 : IB 바이너리 오퍼레이션 {     일반의 두 배의 A { 얻다; 세트; }     일반의 두 배의 B { 얻다; 세트; }      일반의 두 배의 결과 가져오기()     {         돌아가다 A + B;     } }  일반의 학급 승수 : IB 바이너리 오퍼레이션 {     일반의 두 배의 A { 얻다; 세트; }     일반의 두 배의 B { 얻다; 세트; }      일반의 두 배의 결과 가져오기()     {         돌아가다 A * B;     } } 

사용 중:

IB 바이너리 오퍼레이션 op = 귀무의; 두 배의 결과;  // Adder는 인터페이스 IBinary Operation을 구현합니다.  op = 신규 덧셈기(); op.A = 2; op.B = 3;  결과 = op.결과 가져오기(); // 5  // 곱셈기는 인터페이스도 구현합니다.  op = 신규 승수(); op.A = 5; op.B = 4;  결과 = op.결과 가져오기(); // 20 

명시적 구현

구성원을 명시적으로 구현할 수도 있습니다.클래스에 의해 명시적으로 구현된 인터페이스의 구성원은 개체가 인터페이스 유형으로 처리될 때만 액세스할 수 있습니다.

일반의 학급 덧셈기 : IB 바이너리 오퍼레이션 {     두 배의 IB 바이너리 오퍼레이션.A { 얻다; 세트; }     두 배의 IB 바이너리 오퍼레이션.B { 얻다; 세트; }      두 배의 IB 바이너리 오퍼레이션.결과 가져오기()     {         돌아가다 ((IB 바이너리 오퍼레이션)이것.).A + ((IB 바이너리 오퍼레이션)이것.).B;     } } 

사용 중:

덧셈기 더하다 = 신규 덧셈기();  // 다음 구성원은 액세스할 수 없습니다. // 보탠다A = 2; // 보탠다B = 3; // 이중 결과 = 추가.결과 가져오기();  // 인터페이스 유형에 따라 캐스트하여 액세스합니다. IB 바이너리 오퍼레이션 2를 더하다 = 더하다; 2를 더하다.A = 2; 2를 더하다.B = 3;  두 배의 결과 = 2를 더하다.결과 가져오기(); 

참고: 확장되는 클래스의 속성IBinaryOperation컴파일러에 의해 자동으로 구현되고 백업 필드가 자동으로 추가됩니다(#자동 속성 참조).

여러 인터페이스 확장

인터페이스와 클래스는 여러 인터페이스를 확장할 수 있습니다.

학급 마이클래스 : 인터페이스A, 인터페이스B {     ... } 

여기 두 개의 인터페이스를 확장하는 인터페이스가 있습니다.

인테 인터페이스C : 인터페이스A, 인터페이스B {     ... } 

인터페이스 대 추상 클래스

인터페이스와 추상 클래스는 비슷합니다.다음은 몇 가지 중요한 차이점을 설명합니다.

  • 추상 클래스에는 멤버 변수뿐만 아니라 추상적이지 않은 메서드 또는 속성이 있을 수 있습니다.인터페이스는 할 수 없습니다.
  • 클래스 또는 추상 클래스는 하나의 클래스 또는 추상 클래스에서만 상속할 수 있습니다.
  • 클래스 또는 추상 클래스는 하나 이상의 인터페이스를 구현할 수 있습니다.
  • 인터페이스는 다른 인터페이스만 확장할 수 있습니다.
  • 추상 클래스에는 비공개 메서드 및 속성(추상 클래스도 있음)이 있을 수 있습니다.인터페이스에는 공용 구성원만 있을 수 있습니다.
  • 추상 클래스에는 상수, 정적 메서드 및 정적 멤버가 있을 수 있습니다.인터페이스는 할 수 없습니다.
  • 추상 클래스에는 생성자가 있을 수 있습니다.인터페이스는 할 수 없습니다.

제네릭

이것은 C# 2.0 의 기능입니다.NET Framework 2.0.

제네릭(또는 매개 변수화된 유형, 매개 변수 다형성)은 유형 매개 변수를 사용하므로 클래스 또는 메서드가 인스턴스화될 때까지 사용되는 유형을 지정하지 않는 클래스 및 메서드를 설계할 수 있습니다.주요 장점은 다음과 같이 일반형 매개변수를 사용하여 런타임 캐스트나 박싱 작업의 비용을 들이지 않고 사용할 수 있는 클래스와 메소드를 만들 수 있다는 것입니다.[8]

// 일반 클래스를 선언합니다.  일반의 학급 일반 목록<T> {     공허한 더하다(T 인풋) { } }  학급 테스트 일반 목록 {     사적인 학급 예제 클래스 { }     정적인 공허한 주된()     {         // int 입력 목록을 선언합니다.         변태의 list1 = 신규 일반 목록<인트>();          // 문자열 유형 목록을 선언합니다.         변태의 list2 = 신규 일반 목록<끈을>();          // ExampleClass 유형 목록을 선언합니다.         변태의 list3 = 신규 일반 목록<예제 클래스>();     } } 

C# 제네릭은 C++ 템플릿과 비교할 때 안전성을 강화할 수 있지만 기능도 다소 제한적입니다.[9]예를 들어, C# 제네릭 유형에서는 산술 연산자를 호출할 수 없습니다.[10]C++ 템플릿과 달리 .NET 매개 변수화된 유형은 컴파일러가 아닌 런타임에 인스턴스화되므로 C++ 템플릿은 그렇지 않은 반면 교차 언어가 될 수 있습니다.인터페이스를 사용하여 일반 매개변수에 대한 유형 제약과 같이 C++ 템플릿에서 직접 지원하지 않는 일부 기능을 지원합니다.반면 C#은 비형 일반 매개 변수를 지원하지 않습니다.

자바의 제네릭과는 달리, .NET 제네릭은 CLI(Common Language Infrastructure) 가상 시스템에서 매개 변수화된 유형을 1등급 개체로 만들기 위해 reification을 사용하며, 이를 통해 유형 정보를 최적화하고 보존할 수 있습니다.[11]

제네릭 사용

일반 클래스

클래스와 구조체는 일반적일 수 있습니다.

일반의 학급 목록.<T> {     ...     일반의 공허한 더하다(T 항목)     {          ...     } }  변태의 목록. = 신규 목록.<인트>(); 목록..더하다(6); 목록..더하다(2); 

일반 인터페이스

인테 IE 숫자화 가능<T> {     ... } 

일반 대의원

위임인 R 펑크<T1, T2, R>(T1 a1, T2 a2); 

제네릭 메소드

일반의 정적인 T[] 배열 조합<T>(T[] a, T[] b) {     T[] newArray = 신규 T[a.길이 + b.길이];     a.복사 대상(newArray, 0);     b.복사 대상(newArray, a.길이);     돌아가다 newArray; }  끈을[] a = 신규 끈을[] { "a", "b", "c" }; 끈을[] b = 신규 끈을[] { "1", "2", "3" }; 끈을[] c = 배열 조합(a, b);  두 배의[]  = 신규 두 배의[] { 1.2, 2.17, 3.141592 }; 두 배의[] db = 신규 두 배의[] { 4.44, 5.6, 6.02 }; 두 배의[] dc = 배열 조합(, db);  // c는 {"a", "b", "c", "1", "2", "3"}을(를) 포함하는 문자열 배열입니다. // dc는 {1.2, 2.17, 3.141592, 4.44, 5.6, 6.02}을(를) 포함하는 이중 배열입니다. 

유형 매개변수

type-parameter는 새로운 generic을 정의할 때 구체적인 type 대신 사용되는 이름입니다.유형 매개변수를 각괄호에 배치하여 클래스 또는 메서드와 연결할 수 있습니다.< >. 그런 다음 제네릭을 인스턴스화(또는 호출)할 때 선언에서 지정한 유형 매개변수를 특정 유형으로 대체할 수 있습니다.유형 매개변수는 다음을 사용하여 제한될 수 있습니다.where키워드 및 제약 조건 명세, 쉼표로 구분된 6개의 제약 조건 중 하나를 사용할 수 있습니다.[12]

제약조건 설명.
where T : struct type 매개 변수는 값 유형이어야 합니다.
where T : class type 매개 변수는 참조 유형이어야 합니다.
where T : new() type 매개 변수에 매개 변수가 없는 생성자가 있어야 합니다(마지막에 나타나야 함).
where T : <base_class> type 매개 변수는 다음에서 상속해야 합니다.<base_class>
where T : <interface> type 매개 변수는 이 인터페이스를 구현해야 하거나 구현해야 합니다.
where T : U naked 유형 매개 변수 제약 조건

공분산과 반변성

이것은 C# 4.0 의 기능입니다.NET Framework 4.0.

일반 인터페이스와 대리인은 키워드를 사용하여 유형 매개 변수를 공변 또는 반변으로 표시할 수 있습니다.out그리고.in,각각 다음과 같다.그런 다음 이러한 선언은 암묵적 및 명시적 형식 변환, 컴파일 시간 및 런타임 모두에 대해 존중됩니다.예를 들어, 기존 인터페이스는IEnumerable<T>다음과 같이 재정의되었습니다.

인테 IE 숫자화 가능<나가. T> {     IE 수기<T> GetEnumerator(); } 

그러므로, 어떤 수업을 구현하든지IEnumerable<Derived>어떤 부류는Derived와 호환되는 것으로 간주됩니다.IEnumerable<Base>모든 클래스 및 인터페이스에 대해Base그거Derived직접 또는 간접적으로 확장됩니다.실제로는 다음과 같은 코드를 작성할 수 있습니다.

공허한 모두 인쇄(IE 숫자화 가능<물건> 물건들) {     각개별로 (물건 o 인에 물건들)     {         시스템..콘솔.쓰기 선(o);     } }  IE 숫자화 가능<끈을> 줄들 = 신규 목록.<끈을>(); 모두 인쇄(줄들); // IEnumberable<string>이 IEnumberable<object>로 암시적으로 변환됩니다. 

모순점의 경우, 기존 인터페이스IComparer<T>다음과 같이 재정의되었습니다.

일반의 인테 비교자<인에 T> {     인트 비교하다(T x, T y); } 

그러므로, 어떤 수업을 구현하든지IComparer<Base>어떤 부류는Base와 호환되는 것으로 간주됩니다.IComparer<Derived>모든 클래스 및 인터페이스에 대해Derived에서 확장된Base. 다음과 같은 코드를 작성할 수 있습니다.

비교자<물건> object비교기 = 비교기 가져오기(); 비교자<끈을> 문자열비교기 = object비교기; 

열거자

열거자는 반복자입니다.열거자는 일반적으로 다음을 호출하여 얻을 수 있습니다.GetEnumerator()를 구현하는 객체의 방법.IEnumerable인터페이스.컨테이너 클래스는 일반적으로 이 인터페이스를 구현합니다.그러나 C# 문은 구현하지 않더라도 그러한 방법을 제공하는 모든 객체에 대해 동작할 수 있습니다.IEnumerable. 이 인터페이스는 에서 일반 버전으로 확장되었습니다.NET 2.0.

다음은 C# 2.0에서 반복기를 간단하게 사용하는 방법을 보여줍니다.

// 명시판 IE 수기<마이타입> 반복적으로 = 목록..GetEnumerator(); 하는 동안에 (반복적으로.다음으로 이동())     콘솔.쓰기 선(반복적으로.현재의);  // 암묵적 버전 각개별로 (마이타입 가치 인에 목록.)     콘솔.쓰기 선(가치); 

제너레이터 기능

이것은 C# 2.0의 특징입니다.

.NET 2.0 Framework는 C#가 A를 사용하여 제너레이터 기능을 제공하는 반복기를 도입할 수 있도록 했습니다.yield return와 유사한 구조를 보다yield파이썬으로[13]A와 함께yield return, 함수는 반복하는 동안 자동으로 상태를 유지합니다.

// 반복 가능한 입력을 취하는 방법(어레이일 가능성이 있음) // 모든 짝수를 반환합니다. 일반의 정적인 IE 숫자화 가능<인트> 겟이븐(IE 숫자화 가능<인트> 수를) {     각개별로 (인트 i 인에 수를)     {         한다면 (i%2 == 0)             양보 돌아가다 i;     } }  // 배열에서 짝수 숫자만 출력하는 방법 사용 정적인 공허한 주된() {     인트[] 수를 = { 1, 2, 3, 4, 5, 6};     각개별로 (인트 i 인에 겟이븐(수를))         콘솔.쓰기 선(i);  //outputs 2,4,6 } 

린큐

C# 3.0 및 의 기능입니다.NET Framework 3.0.

Language Integrated Querys의 줄임말인 LINQ는 입니다.데이터 처리를 단순화하는 NET Framework 기능.주로 어레이, 컬렉션 및 데이터베이스를 쿼리할 수 있는 지원 기능을 추가합니다.또한 바인더를 도입하여 데이터베이스와 데이터베이스 데이터에 쉽게 접근할 수 있습니다.

쿼리 구문

LINQ 쿼리 구문은 C# 3.0에서 도입되었으며 C#에서 SQL과 같은 쿼리를 작성할 수 있습니다.

변태의 목록. = 신규 목록.<인트>{ 2, 7, 1, 3, 9 };  변태의 결과 = 부터 i 인에 목록.              어디에 i > 1              선택한다. i; 

문은 메소드 호출로 컴파일되므로 메소드의 이름만 지정됩니다.어떤 방법이 궁극적으로 사용되는지는 일반적인 과부하 분해능에 의해 결정됩니다.따라서 번역의 최종 결과는 범위 내에 있는 기호에 따라 영향을 받습니다.

SQL과 다른 점은 from-statement가 SQL에서와 같이 마지막이 아닌 from-statement가 먼저라는 점입니다.이것은 C#[citation needed]에서 이와 같은 글이 더 자연스러워 보이고 "Intelisense"(편집자의 코드 완성)를 지원하기 때문입니다.

무기명 방식

익명 메소드 또는 현재 형태에서 흔히 "람다 표현"이라고 불리는 것은 코드에 인라인 클로저와 같은 함수를 쓸 수 있는 기능입니다.

익명 메서드를 만드는 방법은 다양합니다.C# 3.0 이전에는 딜러를 이용한 지원이 제한적이었습니다.

익명의 대리인단

이것은 C# 2.0의 특징입니다.

익명 위임자는 익명 메서드를 보유하는 함수 포인터입니다.기능 할당 프로세스를 간소화하여 딜러를 보다 쉽게 사용할 수 있도록 하는 것이 목적입니다.프로그래머는 코드에서 별도의 메서드를 선언하는 대신 구문을 사용하여 인라인으로 코드를 작성할 수 있으며 컴파일러는 이를 위한 익명 함수를 생성합니다.

펑크<인트, 인트> f = 위임인(인트 x) { 돌아가다 x * 2; }; 

람다식

이것은 C# 3.0의 특징입니다.

람다 식을 통해 폐쇄와 유사한 인라인 함수에 대한 간단한 구문을 제공합니다.모수가 있는 함수는 다른 함수가 명시적으로 지정되지 않은 경우 모수의 유형을 추론합니다.

// [arguments] => [method바디]  // 매개변수 포함 n => n == 2 (a, b) => a + b (a, b) => { a++; 돌아가다 a + b; }  // 명시적으로 입력된 매개 변수 사용 (인트 a, 인트 b) => a + b  // 매개변수 없음 () => 돌아가다 0  // 대리인에게 람다 할당 펑크<인트, 인트, 인트> f = (a, b) => a + b; 

다중문 람다에는 교정기로 둘러싸인 몸체가 있고 그 안에는 표준 방법처럼 코드를 적을 수 있습니다.

(a, b) => { a++; 돌아가다 a + b; } 

람다 식을 익명의 대리인과 유사하지만 보다 심미적인 구문을 사용하여 메서드 호출에서 직접 인수로 전달할 수 있습니다.

변태의 목록. = 문자열 목록.어디에(n => n.길이 > 2); 

람다 표현식은 기본적으로 컴파일러에서 생성된 방법으로, 위임자를 통해 전달됩니다.이러한 메서드는 컴파일러 전용으로만 예약되어 있으며 다른 컨텍스트에서는 사용할 수 없습니다.

확장방법

이것은 C# 3.0의 특징입니다.

확장 방법은 정의 밖의 기존 클래스에 새로운 방법을 추가하는 환상을 제공하는 통사적 설탕의 한 형태입니다.확장 방법은 인스턴스(instance) 방법인 것처럼 호출(calling) 가능한 정적 방법입니다; 호출의 수신자는 키워드(keyword)로 장식된 메소드의 첫 번째 파라미터에 바인딩됩니다.this:

일반의 정적인 학급 문자열 확장명 {     일반의 정적인 끈을 왼쪽(이것. 끈을 s, 인트 n)     {         돌아가다 s.서브스트링(0, n);     } }  끈을 s = "foo"; s.왼쪽(3); // StringExtensions와 동일합니다.왼쪽(s, 3); 

로컬함수

이것은 C# 7.0의 기능입니다.

로컬 함수는 다른 메서드, 생성자 또는 속성의 getter 및 setter 본문에서 정의할 수 있습니다.이러한 함수는 부모 메서드 로컬 변수를 포함하여 엔클로저 범위의 모든 변수에 액세스할 수 있습니다.이들은 선언 전후에 호출되든 간에 전체 방법의 범위에 포함됩니다.액세스 수식어(공용, 개인, 보호)는 로컬 기능과 함께 사용할 수 없습니다.또한 기능 과부하를 지원하지 않습니다.서명이 겹치지 않더라도 이름이 같은 방식으로 두 개의 로컬 기능이 있을 수 없다는 뜻입니다.[14]컴파일 후 로컬 함수는 개인 정적 메서드로 변환되지만 정의되면 정적으로 표시할 수 없습니다.[15]

아래 코드 예제에서 Sum 메서드는 Main 메서드 내부의 로컬 함수입니다.따라서 모체 방식 내에서만 사용할 수 있습니다. 주:

정적인 공허한 주된(끈을[] 아그스) {     인트 (인트 x, 인트 y)     {         돌아가다 x + y;     }      콘솔.쓰기 선((10, 20));     콘솔.키 읽기(); } 

여러가지 종류의

폐쇄블록

C#은 통해 폐쇄 블록을 구현합니다.usingstatement는 객체가 구현되는 결과를 가져오는 표현을 받아들입니다.IDisposable, 컴파일러는 객체의 범위가 확장될 때 객체의 처분을 보장하는 코드를 생성합니다.using-문이 종료됩니다.using진술은 통사적 설탕입니다.이것은 코드를 동등한 것보다 더 잘 읽을 수 있게 만듭니다.try ... finally막다른 골목

일반의 공허한 () {     사용. (변태의  = 파일.열다.("Foo.txt"))     {         // 일을 좀 보다         던지다 신규 예외.();         // 바는 여전히 제대로 처리될 것입니다.     } } 

스레드 동기화

C#은 유익한 통사당의 또 다른 예인 진술을 제공합니다.제공된 객체에 대한 접근을 상호 배제함으로써 코드 블록을 중요한 섹션으로 표시함으로써 작동합니다.예를 들면.using문장, 그것은 컴파일러가 a를 생성함으로써 작동합니다.try ... finally그 자리에 막다

사적인 정적인 스트림라이터 _writer;  일반의 공허한 동시 메서드() {     잠그다 (_writer)     {         _writer.쓰기 선("1호선.");         _writer.쓰기 선("2호선으로 이어집니다.");     } } 

특성

속성은 컴파일된 어셈블리에서 메타데이터로 저장되는 데이터의 엔티티입니다.속성을 속성 및 메서드와 같이 유형 및 구성원에 추가할 수 있습니다.속성은 전처리기 지시사항을 더 잘 유지하기 위해 사용할 수 있습니다.

[컴파일 생성] 일반의 학급 $익명의유형$120 {     [컴파일 생성]     일반의 끈을 이름. { 얻다; 세트; } } 

.NET Framework는 사용할 수 있는 미리 정의된 특성과 함께 제공됩니다.그들 중 일부는 런타임에 중요한 역할을 하는 반면 일부는 코드와 같은 구문 장식을 위한 것입니다.CompilerGenerated. 컴파일러에서 생성된 요소임을 표시할 뿐입니다.프로그래머 정의 속성도 만들 수 있습니다.

속성은 기본적으로 다음에서 상속되는 클래스입니다.System.Attribute학급.일반적으로 속성 클래스는 이름에 "속성"으로 끝납니다.이것은 사용할 때 필요하지 않습니다.

일반의 학급 식용 속성 : 기여하다 {     일반의 식용 속성() : 기초()     {      }      일반의 식용 속성(부글부글 독성이 없음)     {         이것..아이즈 포이즌스 = !독성이 없음;     }      일반의 부글부글 아이즈 포이즌스 { 얻다; 세트; } } 

선택적 생성자 매개 변수를 사용하여 사용 중인 특성을 표시합니다.

[Edible(참)] 일반의 학급 복숭아 : 과일 {    // 구성원이 있는 경우 } 

전처리기

C#은 프로그래머들이 기호를 정의할 수 있게 해주는 C 전처리기를 기반으로 한 "전처리기 지시문"([16]실제 전처리기는 없지만)을 특징으로 합니다.등의 조건#if,#endif,그리고.#else또한 제공됩니다.

다음과 같은 지시사항#region편집자에게 코드 폴딩에 대한 힌트를 제공합니다.#region블록은 a로 종료해야 합니다.#endregion지시의

일반의 학급  {     #영역 생성자     일반의 () {}     일반의 (인트 첫번째 Param) {}     #끝영역      #지역방법     일반의 공허한 인트바(인트 첫번째 Param) {}     일반의 공허한 스트라바(끈을 첫번째 Param) {}     일반의 공허한 불바(부글부글 첫번째 Param) {}     #끝영역 } 

코드댓글

C# 이중 슬래시(//)의 나머지 줄은 주석임을 나타냅니다.

일반의 학급  {     // 논평     일반의 정적인 공허한 (인트 첫번째 Param) {}  // 댓글도 } 

여러 줄로 된 주석은 시작 슬래시/별표로 나타낼 수 있습니다(/*) 및 종료 별표/순방향 슬래시(*/).

일반의 학급  {     /* 다회선 코멘트 */     일반의 정적인 공허한 (인트 첫번째 Param) {} } 

주석이 둥지를 틀지 않습니다.다음 두 가지 의견이 있습니다.

// /* */ */ */* /*를 넣을 수 있습니다. 
/* /* /* /*를 넣을 수 있지만 */로 끝납니다. 

세 개의 슬래시로 시작하는 한 줄짜리 주석은 XML 문서에 사용됩니다.그러나 이는 Visual Studio에서 사용하는 규칙이며 언어 정의의 일부가 아닙니다.

    /// <summary>     /// 이 수업은 매우 수준급입니다.     /// </summary> 

XML 문서화 시스템

C#의 문서 시스템은 자바의 자바독과 비슷하지만 XML을 기반으로 합니다. 현재 C# 컴파일러가 지원하는 문서화 방법은 두 가지입니다.

Visual Studio에서 생성된 코드에서 흔히 볼 수 있는 것과 같은 한 줄짜리 문서 주석은 다음으로 시작하는 줄에 표시됩니다.///.

일반의 학급  {     /// <요약> 방법의 요약입니다.</summary>     /// <param name="firstParam">파라미터에 대한 설명입니다.</param>     /// <비평>방법에 대한 설명입니다.</remarks>     일반의 정적인 공허한 (인트 첫번째 Param) {} } 

버전 1.0 언어 사양에 정의된 다중 줄 문서 주석은 에 이르기까지 지원되지 않았습니다.NET 1.1 릴리즈.[17]이 코멘트는 시작 순방향 슬래시/별표/별표로 지정됩니다(/**) 및 종료 별표/순방향 슬래시(*/).[18]

일반의 학급  {     /** <요약> 방법의 요약입니다.</summary> *  <param name="firstParam">파라미터에 대한 설명입니다.</param> *  <비평>방법에 대한 설명입니다.</remarks> */     일반의 정적인 공허한 (인트 첫번째 Param) {} } 

순방향 슬래시/애스터리스크/애스터리스크를 사용할 때 화이트스페이스와 XML 문서에 대한 엄격한 기준이 있습니다./**)의 기술.

이 코드 블록:

/** * <summary> * 메서드에 대한 요약입니다.</summary>*/ 

는 이 코드 블록과는 다른 XML 주석을 생성합니다.[18]

/** * <summary> 메서드에 대한 요약입니다.</summary>*/ 

문서 주석과 그 XML 마크업에 대한 구문은 ECMA C# 표준의 비규범적 부속서에 정의되어 있습니다.동일한 표준은 또한 그러한 주석의 처리 규칙과 CLI(Common Language Infrastructure) 식별자를 관련 문서 요소에 매핑하기 위한 정확한 규칙이 있는 평이한 XML 문서로의 변환을 정의합니다.이를 통해 모든 C# 통합 개발 환경(IDE) 또는 기타 개발 도구가 코드의 어떤 기호에 대한 문서를 특정한 잘 정의된 방식으로 찾을 수 있습니다.

비동기 대기 구문

C# 5.0 및 의 기능입니다.NET Framework 4.0.

현재.NET Framework 4에는 작업을 통해 병렬 및 다중 스레드 응용 프로그램을 보다 쉽게 작성할 수 있는 작업 라이브러리가 있습니다.

C# 5.0은 비동기화를 위한 네이티브 언어를 지원합니다.

작업 라이브러리를 직접 활용하는 코드는 다음과 같습니다.

일반의 정적인 학급 일부 비동기 코드 {     일반의 정적인 작업<X 문서> 콘텐츠 비동기 가져오기()     {         변태의 http클라이언트 = 신규 Http 클라이언트();         돌아가다 http클라이언트.GetStringAsync(https://www.contoso.com/).계속하다.와 함께((작업) => {             끈을 응답BodyAsText = 작업.결과;             돌아가다 X 문서.파싱(응답BodyAsText);         });     } }  변태의 t = 일부 비동기 코드.콘텐츠 비동기 가져오기().계속하다.와 함께((작업) => {     변태의 xml 문서 = 작업.결과; });  t.시작(); 

다음은 비동기 대기 구문에 쓰인 것과 동일한 논리입니다.

일반의 정적인 학급 일부 비동기 코드 {     일반의 정적인 비동기의 작업<X 문서> 콘텐츠 비동기 가져오기()     {         변태의 http클라이언트 = 신규 Http 클라이언트();         끈을 응답BodyAsText = 기다리다 http클라이언트.GetStringAsync(https://www.contoso.com/);         돌아가다 X 문서.파싱(응답BodyAsText);     } }  변태의 xml 문서 = 기다리다 일부 비동기 코드.콘텐츠 비동기 가져오기();  // 대기 상태에서 대기 상태로 작업이 시작됩니다. 

방언

스펙#

스펙#은 마이크로소프트의 표준 구현과 병행하여 개발된 C#의 방언입니다.C#을 C# 언어로 확장하며, 향후 C# 언어로 확장될 가능성이 있습니다.에서 소개된 코드 계약 API에 대한 구문도 추가합니다.NET Framework 4.0. Spec#은 마이크로소프트 리서치에서 개발 중입니다.

이 샘플은 코드에 계약을 추가할 때 사용되는 두 가지 기본 구조를 보여 줍니다.

정적인 공허한 주된(끈을![] 아그스)     요망하는 아그스.길이 > 0 {     각개별로 (끈을 아그 인에 아그스)     {      } } 
  • !참조 유형을 null할 수 없도록 만드는 데 사용됩니다. 예를 들어 값을 null로 설정할 수 없습니다.값 유형을 null로 설정할 수 있는 null 가능 유형과는 대조적입니다.
  • requires코드에서 따라야 하는 조건을 나타냅니다.이 경우 args의 길이는 0 이하로 허용되지 않습니다.

무효형이 아닌 유형

Spec#은 non-null로 설정된 nullable 유형의 변수가 null이 되지 않도록 단순히 확인하는 non-nullable 유형으로 C#을 확장합니다.만약 null이면 예외가 던져집니다.

   끈을! 인풋 

사용 중:

일반의 시험(끈을! 인풋) {     ... } 

전제조건

Method를 실행하기 전에 사전조건을 확인합니다.

일반의 시험(인트 i)     요망하는 i > 0; {     이것..i = i; } 

포스트컨디션

사후 조건은 방법이 실행되었을 때 정확하게 확인되는 조건입니다.

일반의 공허한 증분()     확실한 i > 0; {     i++; } 

확인된 예외 사항

Spec#은 Java와 같은 확인된 예외를 추가합니다.

일반의 공허한 어떻게 좀 해봐.()     던지다 일부 예외; // 일부 예외: 예외를 확인했습니다. {     ... } 

하위 수준 함수가 새 예외 유형을 추가하면 일부 중첩된 하위 수준에서 이 메서드를 사용하는 방법의 전체 체인도 계약을 변경해야 하기 때문에 선택된 예외는 문제가 됩니다.이는 개방/폐쇄 원칙에 위배됩니다.[19]

참고 항목

참고문헌

  1. ^ "C# Coding Conventions". Microsoft Learn. sec. Naming conventions. Archived from the original on January 16, 2023.
  2. ^ a b Wagner, Bill. "C# Keywords". docs.microsoft.com. Retrieved August 26, 2022.
  3. ^ Schildt, Herbert (December 30, 2008), C# 3.0: The Complete Reference, ISBN 9780071588416
  4. ^ Deitel, Harvey M.; Deitel, Paul J. (November 21, 2005), C# for programmers, ISBN 9780132465915
  5. ^ Wagner, Bill. "C# Keywords". docs.microsoft.com. Retrieved August 26, 2022.
  6. ^ Pointer types (C# Programming Guide)
  7. ^ a b 아처, 2부, 4장:타입 시스템
  8. ^ "Generics (C# Programming Guide)". Microsoft. Retrieved August 7, 2011.
  9. ^ "An Introduction to C# Generics". Microsoft.
  10. ^ "Differences Between C++ Templates and C# Generics". Microsoft.
  11. ^ "An Introduction to C# Generics". Microsoft. January 2005. Retrieved June 18, 2009.
  12. ^ IMT-2000 3GPP-Microsoft MSDN Type Parameter에 대한 제약조건
  13. ^ "yield". C# Language Reference. Microsoft. Retrieved April 26, 2009.
  14. ^ ".NET Framework - What's New in C# 7.0". msdn.microsoft.com. Retrieved April 8, 2017.
  15. ^ "Thoughts on C# 7 Local Functions". Anton Sizikov. April 15, 2016. Retrieved April 8, 2017.
  16. ^ "C# Preprocessor Directives". C# Language Reference. Microsoft. Retrieved June 18, 2009.
  17. ^ Horton, Anson (September 11, 2006). "C# XML documentation comments FAQ". Retrieved December 11, 2007.
  18. ^ a b "Delimiters for Documentation Tags". C# Programmer's Reference. Microsoft. Archived from the original on December 20, 2008. Retrieved June 18, 2009.
  19. ^ Martin, Robert C. (August 11, 2008). "7 Error Handling, Use Unchecked Exceptions". Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall International. ISBN 978-0132350884.
  1. Archer, Tom (2001). Inside C#. Microsoft Press. ISBN 0-7356-1288-9.
  2. Bart de Smet on Spec# Archived October 29, 2010, at the Wayback Machine

외부 링크