한국   대만   중국   일본 
C 샤프 - 위키百科, 우리 모두의 百科事典 本文으로 移動

C 샤프

위키百科, 우리 모두의 百科事典.

C#
패러다임 프로그래밍 패러다임 : 構造的 프로그래밍 , 命令形 프로그래밍 , 客體 志向 프로그래밍 , 事件 基盤 프로그래밍 , 非同期 메서드 呼出 , 函數兄 프로그래밍 , 제네릭 프로그래밍 , 反映 , 病行 컴퓨팅
設計者 마이크로소프트
開發者 마이크로소프트
發表日 2000年
最近 버전 12.0 [1]   위키데이터에서 편집하기
最近 버전 出市日 2023年 11月 14日 (6個月 前) ( 2023年 11月 14日 )
플랫폼 共通 言語 基盤 (CLI)
라이선스 CLR: MIT 라이선스
모노 컴파일러: GPLv3 & MIT 라이선스
라이브러리: LGPLv2
파일 擴張字 .cs
웹사이트 docs .microsoft .com /en-us /dotnet /csharp /,%20https: //docs .microsoft .com /de-de /dotnet /csharp /,%20https: //docs .microsoft .com /ja-jp /dotnet /csharp /,%20https: //docs .microsoft .com /fr-fr /dotnet /csharp /,%20https: //docs .microsoft .com /it-it /dotnet /csharp /
主要 具現體
비주얼 C 샤프 , 닷넷 프레임워크 , 모노 , 던GNU
, 스페이스 샤프 , 폴리抛닉 C 샤프 , 엔터헤드 C#
影響을 받은 言語
C++ , 에펠 , 자바 , 모델-3 , 오브젝트 파스칼 , ML , VB , 아이콘 , 하스켈 , 러스트 , J# , , F#
影響을 준 言語
體펠 , D , J# , 해키 , 자바 , 코틀린 , 몽키 X , 네메레 , 옥시즌 , 러스트 , 스위프트 , 발라

C# ( 韓國語 : 時 샤프 또는 C 샵)는 마이크로소프트 에서 開發한 客體 志向 프로그래밍 言語 로, 닷넷 프레임워크 의 한 部分으로 만들어졌으며 나중에 ECMA (ECMA-334)와 ISO (ISO/IEC/23270)의 標準으로 자리잡았다. C++ 자바 의 文法과 비슷한 文法을 가지고 있다.

예제 [ 編輯 ]

헬로 월드 프로그램 (Hello, world!) [ 編輯 ]

~C# 8.0 [ 編輯 ]

using
 System
;
 //System이라는 모듈을 使用한다. 該當 모듈은 Console에 關한것들을 담고있다


namespace
 HelloWorld

{
 //namespace를 定義한다. 자바로 치면 패키지나 프로젝트라고 생각하면 된다

	class
 Program

	{
 //클래스를 始作한다. 자바의 클래스와 같다고 생각하면 된다.

		private
 static
 void
 Main
()

		{
 //private이라는 構文으로 클래스 內部에서만 可能하게 만든다. static void Main()이라는 構文으로 메인 메소드를 만든다. 이것은 Java 와 다르고 C 와 C++처럼 (string[] args) 가 붙지 않으며 普通 빈칸이다.

			Console
.
WriteLine
(
"Hello, World!"
);
 //콘솔에 하얀色 글씨로 Hello World 라고 出力한다.

                    Console
.
ReadLine
();
 //그냥 WriteLine 이라고 쓰면 바로 프로그램이 終了된다. ReadLine으로 아무키나 눌러야 終了되도록 한다.

		}
 //메인메소드의 끝. 메소드의 끝이라고 할 수 있다.

	}
 //클래스의 끝. 클래스밑에 다른 클래스를 만들수 없다

}
 //네임스페이스의 끝. 폴더의 끝이라고 생각하면 된다

C# 9.0~ [ 編輯 ]

System
.
Console
.
WriteLine
(
"Hello, World!"
);

//System 口文으로 System 을 使用한다는 正義와 同時에 namespace 없이 作動시킨다

//Console 口文으로 콘솔을 出力한다

//WriteLine으로 하얀色 글을 콘솔에 붙인다.

  • Microsoft에서 必要 프로그램을 無料로 提供하고 있다. [2] 具體的인 프로그램 設置와 學習은 위키 하우(How to Create a Program in C Sharp) [3] 에 記述되어 있다. 10分假量 所要된다.
  • C++ 를 能熟하게 다루는 境遇, C#의 全般的인 使用方法을 學習하는데 이틀假量 所要된다.
  • Visual Basic.NET 이나 자바 를 能熟하게 다룰 수 있는 境遇, C#의 文法 및 키워드를 理解하는데 하루假量 所要된다.

言語 特徵 [ 編輯 ]

C#은 마이크로소프트 닷넷 프로그램이 動作하는 닷넷 플랫폼을 가장 直接的으로 反映하고, 또한 닷넷 플랫폼에 强하게 依存하는 프로그래밍 言語이다. C#은 그 文法的인 特性이 자바와 相當히 類似하며 C#을 통하여 다룰 수 있는 닷넷 플랫폼의 技術들조차도 자바를 念頭에 둔 것이 많아서 자바와 가장 많이 比較되고 있다. 하지만 C#은 자바와 달리 不安全 코드(unsafe code) [4] 와 같은 技術을 통하여 플랫폼 間 相互 운용성에 相當히 많은 努力을 기울이고 있다. C#의 基本 資料型 은 닷넷의 客體 모델을 따르고 있고, 런타임 次元에서 쓰레기 收集 (garbage collection)이 되며 또한 클래스, 인터페이스, 委任, 例外와 같이 客體 志向 言語로서 가져야 할 모든 要素들이 包含되어 있다.

歷史 [ 編輯 ]

닷넷 프레임워크를 開發하던 時節 클래스 라이브러리 는 SMC(Simple Managed C)라 불리는 管理 코드(managed code)를 使用했었다. [5] 1999年 1月, 亞네르스 河一스베르 가 이끄는 팀이 새로운 言語인 Cool(C-like Object Oriented Language)을 開發했다. 마이크로소프트는 言語의 最終 이름을 Cool로 維持할지도 考慮해봤지만 商標 問題로 인해 이뤄지지 않았다. 2000年 7月 PDC에서 닷넷 프로젝트가 發表될 때 즈음 Cool의 이름은 C#으로 定해졌고 클래스 라이브러리와 ASP.NET 런타임은 C#으로 옮겨갔다.

C#은 ISO 小委員會 JTC 1/SC 22에 ISO/IEC 23270:2003으로 提出되었으나 撤回 後 ISO/IEC 23270:2006으로 登錄되었다.

이름 [ 編輯 ]

C#이라는 이름은 音標를 연주할 때 半音 올리는 것을 標示하는 올림標 에서 따왔다. C++ 에서 "++"가 變數의 값을 1 증가시키는 것을 의미하는 것과 비슷하다. 마찬가지로 올림標는 네 個의 "+" 記號와 비슷하므로 C++를 한番 더 증가시켰다는 뜻도 지닌다.

基本 글꼴이나 브라우저의 技術的인 限界와 더불어 키보드에는 올림標 記號( U+266F )가 包含되지 않기에 文書에서는 代替 記號로 해시 記號 ( U+0023 # )를 使用하며, ECMA-334 C# 言語 仕樣 [6] 에서도 確認할 수 있다. 그러나 廣告나 패키지 包裝 等 可能한 境遇, 마이크로소프트에서는 意圖한 대로 올림標를 使用한다.

버전 [ 編輯 ]

버전 言語 仕樣 날짜 닷넷 프레임워크 비주얼 스튜디오
ECMA ISO/IEC 마이크로소프트
C# 1.0 2002年 12月 2003年 4月 2002年 1月 2002年 1月 .NET Framework 1.0 비주얼 스튜디오 .NET 2002
C# 1.2 2003年 10月 2003年 4月 .NET Framework 1.1 비주얼 스튜디오 .NET 2002
C# 2.0 2006年 6月 2006年 9月 2005年 9月 2005年 11月 .NET Framework 2.0 비주얼 스튜디오 2005
C# 3.0 없음 [note 1] 2007年 8月 2007年 11月

.NET Framework 2.0 (LINQ/쿼리 擴張 除外) [7]
.NET Framework 3.0 (LINQ/쿼리 擴張 除外) [7]
.NET Framework 3.5

비주얼 스튜디오 2008

비주얼 스튜디오 2010

C# 4.0 2010年 4月 2010年 4月 .NET Framework 4.0 비주얼 스튜디오 2010
C# 5.0 2017年 12月 2018年 12月 2013年 6月 2012年 8月 .NET Framework 4.5 비주얼 스튜디오 2012

비주얼 스튜디오 2013

C# 6.0 없음 [note 1] 없음 2015年 7月 .NET Framework 4.6 비주얼 스튜디오 2015
C# 7.0 2017年 5月 .NET Framework 4.7 비주얼 스튜디오 2017

文法 [ 編輯 ]

C#의 基本 文法은 C, C++, 자바 等 C 스타일 言語와 類似하다.

  • 세미콜론 이 宣言文의 끝을 나타낸다.
  • 中括弧 로 宣言文을 묶는다. 普通 宣言文은 메소드(函數)로, 메소드는 클래스로, 클래스는 네임스페이스 로 묶인다.
  • 變數에 等號 를 使用해서 값을 代入하고, 두 個의 等號("==")를 使用해 比較한다.
  • 大括弧 配列 의 宣言 및 인덱스 接近 모두에 使用된다.

잘 알려진 C# 컴파일러와 開發 道具들 [ 編輯 ]

  • Microsoft Visual C# : Microsoft가 C#에 對하여 내리는 모든 標準 正義를 가장 正確하고 安定的으로 反映하는 컴파일러이다. 最近에는 C# 3.0에 包含될 LINQ 擴張과 같은 部分에 對한 技術的인 레퍼런스를 미리 테스트해볼 수 있는 道具로도 자주 쓰인다. [8]
  • Microsoft Rotor 프로젝트: Microsoft .NET Framework가 發表된 後 數 個月 以後에 같이 發表되는 오픈 소스 프로젝트로 Microsoft 닷넷 플랫폼에 對한 代替 具現을 提供한다.
  • Mono : 마이크로소프트 닷넷 플랫폼에 對한 具現이 始作될 무렵에 始作되었으며, 現在는 第3字 닷넷 플랫폼 中에서 가장 安定的이고 成熟되었다고 評價되는 프로젝트이다. 마이크로소프트 닷넷 플랫폼이 윈도우와 少數의 유닉스 플랫폼을 對象으로 하고 있는 것과는 달리 모노 플랫폼의 境遇 윈도우보다는 리눅스, 유닉스, 맥 OS X, 솔라리스와 같이 윈도우 外의 運營 體制와 플랫폼을 對象으로 한다. 初期에는 지未安 이 호스팅했으나 現在는 노벨 에서 호스팅하고 있다. 모노 플랫폼을 基盤으로 GTK#, 모질라 임베딩, IKVM(Java 바이트 코드를 모노 플랫폼 위에서 에뮬레이션하여 實行하는 VM), COCOA#, Nemerle 言語, MonoDevelop IDE 等의 技術을 支援한다. 또한 마이크로소프트 닷넷 플랫폼과 서로 互換이 可能하다. 現在는 리눅스 配布版들 사이에서 公式的으로 採擇되고 있을 程度로 리눅스 環境에서는 大衆的인 닷넷 플랫폼 具現이 되었다.
  • DotGNU Project: 모노와 비슷한 時期에 開發을 始作하였지만 아직 安定的인 버전이 出市되지 못하였다. 特有의 Portable .NET 엔진을 使用하고 있다.

C++과 C#의 差異點 [ 編輯 ]

C++ 言語와 比較할 때 C#은 다음과 같은 點에서 單純化되거나 擴張되었다.

  • C#에는 轉役 變數 및 轉役 函數가 存在하지 않으며, 클래스 안에 宣言되어야 한다.
  • C#의 bool 은 오직 true false 의 論理값만을 가질 수 있으며,상수 또는 정수형 變數에서 暗示的으로 變換이 不可能하다. 直接 大入을 위해서는 變換 命令을 利用해야 한다. 反面 C++의 bool 은 精髓값을 代入할 수 있다. 또한 C#에서는 if while 門 等의 比較門에서 利用하는 값도 bool 形態로 制限되는 反面, C++에서는 上水 또는 變數를 利用하여 '0이 아닌 값' 또는 '0'의 與否로 比較할 수 있다.
  • C#에서는 static 키워드를 오직 한 番만 初期化를 遂行한다는 意味로 利用할 수 없다.
  • 基本的으로 C#에서 포인터는 unsafe 블록 또는 unsafe 形式 에서 使用하도록 定義되어 있으며, unsafe 키워드를 使用하려면 컴파일러에게 /unsafe 또는 --unsafe 스위치를 指定하도록 明示해야 한다. unsafe 블록의 使用 例는 다음과 같다.
unsafe

{

    int
 *
pA
;

}

  • 닷넷 플랫폼에서 포인터를 다루는 基本 單位는 System.IntPtr 이다.

( System.UIntPtr 은 특수한 目的으로 쓰이므로 說明에서 除外한다.)

  • C#은 unsafe 블록 안에서 使用이 可能한 직접的인 포인터

( IntPtr.ToPointer 메서드로 void* 形式을 가져올 수 있음)도 支援한다.

  • 메모리 管理者에 依해 管理되는 데이터는 住所값이 자주 變更되므로, 잘못된 住所를 接近하는 等의 誤謬를 防止하기 爲해 포인터는 參照 形式 의 인스턴스를 가리킬 수 없는 것이 基本 原則이며, 參照 形式 의 필드를 멤버로 가지고 있는 構造體 亦是 完全한 값 形式 으로 判定하지 않고 參照 形式 으로 處理하기 때문에, 이 境遇의 構造體 의 인스턴스에 對해서도 포인터로 그 住所를 가리킬 수 없다.
  • C#의 포인터는 C++의 포인터와 比較하였을 때 文法的으로 다른 意味를 가진다.

C++에서 포인터는 특정한 形式의 인스턴스 또는 住所값을 가리키기 위한 目的으로 割當되는 住所값을 記憶하기 위한 變數로 取扱되지만 C#의 포인터는 System.IntPtr 이라는 하나의 完成된 形式에 對한 擴張 辭讓일 뿐이다. 그래서 C++의 포인터와 같은 쓰임새를 C#으로 移植할 수 없는 境遇가 相當히 많다.

  • void* 포인터가 가리키는 값을 얻어낼 수 없고 void* 포인터에 對한 算術 演算도 遂行할 수 없다.
  • 算術 演算은 컴파일러의 옵션 指定에 따라서 /checked+ 로 指定된 境遇

모든 코드 範圍에서 嚴格한 算術 演算 檢査를 할 수 있으며 /checked- 로 指定된 境遇 모든 코드 範圍에서 算術 演算 檢査를 하지 않도록 할 수 있다. 컴파일러 옵션과는 關係없이 unchecked 블록 안에서는 檢事되지 않으며, 反對로 checked 블록 안에서는 檢事가 이루어진다.

int
 a
 =
 0
;

unchecked

{

    a
 =
 int
.
MaxValue
 +
 20
;

}

checked

{

    a
 =
 int
.
MaxValue
 *
 2
;

}

  • fixed 블록 을 利用하여 에 데이터를 固定할 수 있다.
using
 System
;


namespace
 FooBar

{

    class
 Program

    {

        private
 int
 Test
 =
 123
;


        static
 void
 Main
(
string
[]
 args
)

        {

            unsafe

            {

                Program
 p
 =
 new
 Program
();


                fixed
 (
int
*
 ptrX
 =
 &
p
.
Test
)

                {

                    Console
.
Out
.
Write
(
Convert
.
ToString
(
*
ptrX
));

                    *
ptrX
 =
 21
;

                    Console
.
Out
.
WriteLine
(
Convert
.
ToString
(
*
ptrX
));

                }

            }

        }

    }

}

  • C#은 C++과는 달리 直接的인 메모리 解除 命令이 없으며, C++에서 포인터를 다룰 때 發生하기 쉬운 가비지나 매달린 포인터와 같은 複雜한 問題를 C#에서는 가비지 컬렉터의 能力으로 自動으로 處理한다. 하지만 가비지 컬렉터가 蒐集을 하기 以前에 個別的으로 處理해야 할 必要가 있는 小車 作業의 具現을 위하여 IDisposable 인터페이스를 特定 클래스에서 具現하게 된다. IDisposable 인터페이스를 具現하는 클래스는 C#의 using 構文을 利用하여 自動으로 IDisposable.Dispose 메서드를 呼出할 수도 있다.
  • C#은 C++과는 달리 父母 클래스를 하나만 使用할 수 있다. 卽 多衆 相續은 不可能하며 具現해야 하는 인터페이스는 多數個를 指定할 수 있다. 이 點은 多衆 父母 클래스로부터의 相續에서만 누릴 수 있는 利點을 잃게되는 短點을 가지지만 複雜性을 最少化하고 보다 明瞭한 相續 關係의 意味를 만들 수 있다는 點에서는 큰 도움이 된다.
  • C#은 C++보다 兄 安全性 에 對하여 더 寬大하다. 이 말은 兄 安定性 을 保障할 수 없다는 것도 同時에 뜻한다. System.Object 클래스가 모든 클래스의 先祖 클래스이기 때문에 이러한 寬大함이 可能하게 되었다. (但, unsafe 블록 內에서 使用되는 포인터 形式의 境遇는 例外로 한다.)
  • 配列 포인터 를 定義하는 文法이 다르다. 配列 文法은 자바와 類似하다. 하지만 포인터의 境遇 C#은 int*, void*, byte* , ...와 같이 하나의 完成된 形式으로서 理解할 수 있지만 C++은 메모리 住所값을 貯藏하도록 되어있는 形態이다. 포인터를 使用하고자 하는 目的은 같지만 C++에서처럼 어떤 곳에서나 住所를 參照할 수 있는 것은 아니므로 正確한 理解가 必要하다. (다만, 特殊한 GCHandle 形式을 活用하여 Pinned Object를 生成하는 境遇에는 이러한 接近이 可能할 수 있으나 特性에 맞지도 않으며 深刻한 性能 低下를 일으키므로 좋은 方法이라고 할 수 없을것이다.)
// C#

int
[]
 a
 =
 new
 int
[
5
];

int
*
 pA
,
 pB
;

// C++

int
 a
[
5
];

int
 *
pA
,
 *
pB
;

  • 데이터 멤버를 다루는 構文에 依해 메서드가 呼出되는 屬性 機能이 있다. 이것을 正確한 이름으로는 프로퍼티라고 하며 getter 메서드와 setter 메서드로 區分된다. C#에서는 getter와 setter를 한꺼번에 使用할 수 있도록 아래와 같이 固定된 文法을 使用한다. 비주얼 베이직 닷넷 의 境遇에도 이와 비슷하나 프로퍼티에서도 多數의 媒介 變數를 받는 것을 許容한다. 그리고 특별한 事項이 없는 大多數의 다른 言語들에서 프로퍼티는 get_foo() 메서드와 set_foo() 메서드로 區分되어 表現되곤 한다.
public
 string
 Name

{

    get

    {

        return
 m_name
;

    }

    set

    {

        m_name
 =
 "Name :: "
+
value
;

    }

}


public
 void
 MethodOne
(
string
 name
)

{

    this
.
Name
 =
 "DotNet"
;

}

  • C++에서 特定 컴파일러 製作社마다 조금씩 다른 方式으로 具現되었던 런타임 形式 情報

C#에서 리플렉션 으로 擴張하여 使用하는 것이 可能하다. 리플렉션 자바 言語의 리플렉션 과 같은 槪念이다.

  • C#은 C/C++과 달리 前處理機 의 使用이 制限的이다.

卽, C/C++에서 使用되던 #include #pragma 와 같은 指示子를 C#에서는 使用할 수 없으며, C/C++에서 매크로 常數나 매크로 函數 等을 위해 使用되던 #define 이 C#에서는 매우 制限的인 用途로 使用된다. 또한 C/C++에는 없던 #region , #endregion 指示者가 새로 追加되었다. 例를 들면 다음과 같다.

#define CsDebug

#region 아래는 FooClass 宣言입니다.

public
 class
 FooClass

{

    private
 int
 integer
;

    #if CsDebug

    private
 string
 debugmsg
;

    #endif

    public
 string
 DebugMsg

    {

        get

        {

            #if CsDebug

            return
 this
.
debugmsg
;

            #else

            return
 null
;

            #endif

        }

        set

        {

            #if CsDebug

            this
.
debugmsg
 =
 value
.
Clone
()
 as
 string
;

            #endif

        }

    }

}

#endregion

卽, 모든 인스턴스 메서드 는 반드시 特定 클래스 의 멤버로 所屬되어야 한다.

  • C#에서는 데이터 隱匿과 保安性 向上을 爲해 프렌드 函數 를 支援하지 않는다.

代身 C# 3.0부터 이와 비슷한 擴張 메서드 를 支援하고 있다. 擴張 메서드 政敵 클래스 의 멤버로 있어야 하며 이 때에도 對象 클래스의 private 멤버에는 接近 할 수 없다.

public
 class
 Foo

{

    [MarshalAs(UnmanagedType.U4)]

    private
 uint
 dwValue
;

    [MarshalAs(UnmanagedType.LPWstr)]

    private
 string
 lpcwValue
;


    public
 uint
 DWValue

    {

        get
 {
 return
 this
.
dwValue
;
 }

        set
 {
 this
.
dwValue
 =
 value
;
 }

    }

    public
 string
 LPCWValue

    {

        get
 {
 return
 this
.
lpcwValue
;
 }

        set
 {
 this
.
lpcwValue
 =
 value
.
Clone
()
 as
 string
;
 }

    }

}

public
 static
 class
 Bar

{

    public
 static
 string
 FooString
(
this
 Foo
 foo
)

    {

        return
 string
.
Format
(
"定數 값은 {0}, 文字列 값은 {1}입니다."
,
 foo
.
DWValue
,
 foo
.
LPCWValue
);

    }

}

  • C# 3.0부터는 任意의 資料型인 var타입을 支援한다. var의 實際 形式은 컴파일時 決定된다.

(이 部分은 C++11 에서 auto 키워드로 支援한다. )

  • C# 3.0부터는 旣存의 SQL構文을 活用한 LINQ 式을 支援한다.

아래 예제는 整數形으로 이루어진 配列에서 100을 超過하는 값만을 抽出하는 코드이다.

public
 List
<
int
>
 linqtest
(
List
<
int
>
 list
)

{

    var
 result
 =
 from
 k
 in
 list
 where
 k
 >
 100
 select
 k
;

    return
 result
;

}

public
 static
 void
 Print
(
int
 a
,
 int
 b
,
 Func
<
int
>
 func
)

{

    Console
.
WriteLine
(
"{0} 더하기 {1}은 {2}입니다."
,
 a
,
 b
,
 func
(
a
,
 b
));

}

public
 static
 void
 Main
()

{

    Print
(
a
,
 b
,
 f
 =>
 {
Console
.
WriteLine
(
"func가 呼出되었습니다."
);
 return
 a
+
b
;});

}

같이 보기 [ 編輯 ]

各州 [ 編輯 ]

內容主 [ 編輯 ]

  1. C# 3.0, 4.0은 ECMA나 ISO/IEC 仕樣이 存在하지 않는다.

參照週 [ 編輯 ]

  1. “Announcing C# 12” . 2023年 11月 18日에 確認함 .  
  2. https://www.visualstudio.com/ko/vs/community/ 비주얼 스튜디오 커뮤니티 사이트
  3. http://www.wikihow.com/Create-a-Program-in-C-Sharp
  4. “Unsafe Code Tutorial (C#)” . 2005年 9月 13日에 原本 文書 에서 保存된 文書 . 2005年 11月 4日에 確認함 .  
  5. Zander, Jason (2008年 11月 24日). “Couple of Historical Facts” . 2009年 2月 23日에 確認함 .  
  6. 《C# Language Specification》 (PDF) 4板. Ecma International . June 2006. 2012年 12月 2日에 原本 文書 (PDF) 에서 保存된 文書 . 2012年 1月 26日에 確認함 .  
  7. “Using C# 3.0 from .NET 2.0” . Danielmoth.com. 2007年 5月 13日. 2012年 9月 29日에 原本 文書 에서 保存된 文書 . 2012年 10月 4日에 確認함 .  
  8. 애初에 C# 開發者가 마이크로소프트 二期에 當然히 컴파일러가 가장 正確할수밖에 없다.
  9. MSDN Magazine [ 깨진 링크 ( 過去 內容 찾기 )]