ความแตกต่างระหว่าง C # และ. NET คืออะไร?


204

ฉันขอทราบความแตกต่างระหว่าง C # และ. NET ได้อย่างไร เมื่อฉันคิดว่า C # ทันทีฉันจะบอกว่ามันเป็น. NET ภาษา แต่เมื่อฉันค้นหาโพสต์งานพวกเขาต้องการผู้สมัครที่จะมีประสบการณ์ C # และ. NET ใครช่วยอธิบายได้บ้าง


41
ฉันสามารถอธิบายการโพสต์ข้อกำหนด ... พวกเขาเขียนโดยนักพัฒนาที่ไม่ใช่ผู้ดูแลระบบ ฝ่ายทรัพยากรบุคคลหรือผู้บริหารที่ไม่จำเป็นต้องเข้าใจความแตกต่าง
เดวิด

2
คุณพูดถูกต้องฉันควรรู้ระหว่างสองคน ฉันใช้ C # มานานแล้วและใช้ไลบรารี่. Net ในการเขียน C # แต่ไม่ต้องใช้เวลาเพื่อแยกความแตกต่างระหว่างสองอย่างนี้ แต่ตอนนี้ฉันรู้แล้วขอบคุณ ..
Bopha

คำตอบ:


128

นอกจากสิ่งที่แอนดรูว์พูดแล้วมันก็คุ้มค่าที่จะสังเกตว่า:

  • .NET ไม่ได้เป็นเพียงไลบรารีแต่ยังเป็นรันไทม์สำหรับการเรียกใช้แอปพลิเคชัน
  • ความรู้ของ C # หมายถึงความรู้บางอย่างของ. NET (เนื่องจากโมเดลวัตถุ C # สอดคล้องกับโมเดลวัตถุ. NET และคุณสามารถทำสิ่งที่น่าสนใจใน C # เพียงแค่ใช้. NET ไลบรารี) ตรงกันข้ามไม่จำเป็นต้องเป็นจริงเพราะคุณสามารถใช้ภาษาอื่นเพื่อเขียนแอปพลิเคชั่น. NET

ความแตกต่างระหว่างภาษา , รันไทม์ , และไลบรารี่นั้นเข้มงวดมากขึ้นใน. NET / C # มากกว่าตัวอย่างใน C ++ โดยที่ข้อกำหนดภาษานั้นยังรวมถึงฟังก์ชั่นไลบรารีพื้นฐานบางอย่าง ข้อกำหนด C # บอกเพียงเล็กน้อยเกี่ยวกับสภาพแวดล้อม (โดยพื้นฐานแล้วว่าควรมีบางประเภทเช่นintแต่มีทั้งหมดไม่มากก็น้อย)


197

C # เป็นภาษาการเขียนโปรแกรม. NET เป็นคำแบบครอบคลุมที่มีแนวโน้มที่จะครอบคลุมทั้ง. NET Framework (ไลบรารีแอปพลิเคชันเฟรมเวิร์ก) และรันไทม์ภาษาทั่วไปซึ่งเป็นรันไทม์ซึ่ง. NET ประกอบแอสเซมบลี

การติดตั้ง C # ของ Microsoft นั้นผสานรวมกับ. NET Framework อย่างหนักดังนั้นจึงเป็นที่เข้าใจได้ว่าแนวคิดทั้งสองจะสับสน อย่างไรก็ตามสิ่งสำคัญคือต้องเข้าใจว่าพวกเขาเป็นสองสิ่งที่แตกต่างกันมาก

นี่คือคลาสที่เขียนใน C #:

class Example { }

นี่คือคลาสที่เขียนใน C # ที่ใช้แอสเซมบลี. NET Framework ประเภทและวิธีการอย่างชัดเจน:

class Example
{
    static void Main()
    {
        // Here we call into the .NET framework to 
        // write to the output console
        System.Console.Write("hello, world");
    }
}

อย่างที่ฉันได้กล่าวไปแล้วมันเป็นเรื่องยากมากที่จะใช้งาน C # ของ Microsoft โดยไม่ต้องใช้. NET Framework เช่นกัน ครั้งแรกของฉันExampleการดำเนินการดังกล่าวข้างต้นแม้จะใช้กรอบ NET (โดยปริยายใช่ แต่มันไม่ใช้มันกระนั้น) เพราะสืบทอดจากExampleSystem.Object

นอกจากนี้เหตุผลที่ผมใช้คำพูดที่ว่าการดำเนินการของ Microsoft C #เป็นเพราะมีการใช้งานอื่น ๆ ของ C # ใช้ได้


3
@Tejs - จริง ๆ แล้ว VB.NET คือ. NET VB ไม่ใช่
Eric Mickelsen

+1 Andrew Hare @Tejs: ทั้ง C # และ VB นั้นรวมเข้ากับ. NET อย่างมากไม่ใช่ NET .NET เป็นกรอบงาน ตามตัวอย่างคุณสามารถทำ. NET ใน Delphi ถ้า C # คือ. NET คุณจะสามารถใช้รหัส C # ใน Delphi .NET ซึ่งเห็นได้ชัดว่าไม่สามารถทำได้และไม่สามารถเชื่อได้
Marcouiller จะ

ในทำนองเดียวกันไม่มีเหตุผลที่คุณต้องมี. NET ในการเขียนโปรแกรมใน C # ถึงแม้ว่าฉันไม่รู้จักใครที่เขียน C # โดยไม่ต้องใช้. NET หรือ Mono
David Thornley

.NET CLR คือทั้งหมดที่เกี่ยวกับประเภท เพื่อรองรับหลายภาษาพวกเขามาพร้อมกับ CTS - ระบบประเภททั่วไปซึ่งกำหนดวิธีที่จะต้องกำหนดประเภทและกฎที่ควบคุมพวกเขาเช่นการสืบทอดมรดกอายุการใช้งานของวัตถุเป็นต้น C ++ / CLI, C #, VB เป็นภาษาทั้งหมดที่สอดคล้องกับประเภทเหล่านี้ อาจเป็นการละเมิดในสิ่งนี้ แต่ฉันจะไม่เข้าไป) . ไม่ว่าคุณใช้ภาษาใดในการสร้างประเภทพฤติกรรมจะเหมือนกันเมื่อดำเนินการโดย. NET CLR ดังนั้นภาษาและ. NET สามารถพัฒนาแยกกันได้แม้ว่าจะมีการเชื่อมต่อผ่าน CTS VS2012 เช่นไม่รองรับคอมไพเลอร์ C # 6 แต่ทำงานกับ. NET 4.6
Frank Q.


49

C # เป็นภาษาโปรแกรมเชิงวัตถุที่แข็งแกร่งซึ่งส่วนใหญ่สร้างขึ้นบน. NET Framework

C # คือเครื่องบินและ. NET เป็นรันเวย์;)


15

C # เป็นภาษา. NET เป็นเฟรมเวิร์กแอปพลิเคชัน ไลบรารี NET สามารถเรียกใช้บน CLR และทำให้ภาษาใด ๆ ที่สามารถเรียกใช้บน CLR สามารถใช้ไลบรารี. NET

หากคุณคุ้นเคยกับ Java สิ่งนี้คล้ายกัน ... Java เป็นภาษาที่สร้างขึ้นบน JVM ... แม้ว่าไลบรารี Java ใด ๆ ที่ประกอบไว้ล่วงหน้าสามารถใช้โดยภาษาอื่นที่สร้างอยู่ด้านบนของ JVM


ความหมายคือCLRอะไร
Kasun Siyambalapitiya

2
รันไทม์ภาษาทั่วไป
Yahya-Imam Munir

1
@KasunSiyambalapitiya CLR ใช้ในการแปลงเป็นโค้ดเป็นรหัสเนทีฟฉันหมายความว่าคุณเขียนโค้ด c # การแปลงจะเป็นเช่นนี้ C # => CLR => รหัสเนทีฟ จากนั้นมันจะรันแพลตฟอร์มทั้งหมดเช่น linux หรือ windows
logeshpalani98

10

เมื่อคนพูดถึง ".net framework" พวกเขามักจะรวมสองพื้นที่หลัก - รันไทม์ไลบรารีและเครื่องเสมือนที่ใช้งานรหัส. net

เมื่อคุณสร้างไลบรารีคลาสใน Visual Studio ใน C # DLL จะเป็นไปตามรูปแบบที่กำหนด - โดยประมาณมีส่วนที่มีข้อมูลเมตาที่อธิบายว่ามีคลาสใดบ้างที่รวมอยู่ในนั้นและฟังก์ชั่นที่พวกเขามีเป็นต้น ในวัตถุเหล่านั้นมีอยู่จริง รูปแบบ. net ทั่วไปนี้เป็นสิ่งที่อนุญาตให้ใช้ไลบรารีร่วมกันระหว่างภาษา. net (C #, VB.Net, F # และอื่น ๆ ) ได้อย่างง่ายดาย แม้ว่า. net "runtime library" ส่วนใหญ่เขียนด้วยภาษา C # ในตอนนี้ (ฉันเชื่อว่า) คุณสามารถจินตนาการได้ว่ามีกี่คนที่สามารถเขียนเป็นภาษาที่ไม่มีการจัดการ แต่จัดเรียงในรูปแบบที่กำหนดนี้เพื่อให้สามารถใช้ภาษา. net ได้ .

"เนื้อ" ที่แท้จริงของไลบรารีที่คุณสร้างประกอบด้วย CIL ("Common Intermediate Language") ซึ่งเป็นเหมือนภาษาแอสเซมบลีของ. net - อีกครั้งภาษานี้เป็นเอาต์พุตทั่วไปของภาษา. net ทั้งหมดซึ่งเป็นสิ่งที่ ทำให้. net สิ้นเปลืองด้วยภาษาใด ๆ . net

การใช้เครื่องมือ "ildasm.exe" ซึ่งมีให้ใช้งานฟรีใน Microsoft SDK (และอาจมีอยู่ในคอมพิวเตอร์ของคุณแล้ว) คุณสามารถดูว่าการแปลงรหัส C # เป็นข้อมูลเมตาและ IL ได้อย่างไร ฉันได้รวมตัวอย่างไว้ที่ด้านล่างของคำตอบนี้เป็นตัวอย่าง

เมื่อคุณเรียกใช้รหัส. net สิ่งที่เกิดขึ้นโดยทั่วไปคือเครื่องเสมือน. net กำลังอ่าน IL และทำการประมวลผล นี่คืออีกด้านหนึ่งของ. net และคุณสามารถจินตนาการได้ว่าสิ่งนี้สามารถเขียนได้อย่างง่ายดายในภาษาที่ไม่มีการจัดการ - มัน "เพียง" จำเป็นต้องอ่านคำสั่ง VM และเรียกใช้พวกเขา (และรวมเข้ากับตัวรวบรวมขยะซึ่งยังต้องการ ไม่ใช่รหัส. net)

สิ่งที่ฉันอธิบายคือ (อีกครั้งคร่าว ๆ ) เกิดอะไรขึ้นเมื่อคุณสร้างไฟล์ปฏิบัติการใน Visual Studio (สำหรับข้อมูลเพิ่มเติมฉันขอแนะนำหนังสือ "CLR ผ่าน C # โดย Jeffrey Richter" - มีรายละเอียดมากและเขียนอย่างยอดเยี่ยม)

อย่างไรก็ตามมีบางครั้งที่คุณอาจเขียน C # ที่จะไม่ถูกดำเนินการภายในสภาพแวดล้อม. net - ตัวอย่างเช่นBridge.NET "รวบรวม" รหัส C # ลงใน JavaScript ซึ่งจะทำงานในเบราว์เซอร์ (ทีมที่ผลิตมันได้ไป ความพยายามในการเขียนเวอร์ชันของไลบรารีรันไทม์. net ที่เขียนด้วย JavaScript ดังนั้นความสามารถและความยืดหยุ่นของไลบรารี. net จะมีให้สำหรับ JavaScript ที่สร้างขึ้น) นี่เป็นตัวอย่างที่สมบูรณ์แบบของการแยกระหว่าง C # และ. net - เป็นไปได้ที่จะเขียน C # สำหรับ "เป้าหมาย" ที่แตกต่างกัน คุณอาจกำหนดเป้าหมายสภาพแวดล้อมรันไทม์. net (เมื่อคุณสร้างไฟล์ปฏิบัติการ) หรือคุณอาจกำหนดเป้าหมายสภาพแวดล้อมเบราว์เซอร์ (เมื่อคุณใช้ Bridge.NET)

คลาสตัวอย่างอย่างง่าย (มาก):

using System;

namespace Example
{
    public class Class1
    {
        public void SayHello()
        {
            Console.WriteLine("Hello");
        }
    }
}

ข้อมูลเมตาที่ได้และ IL (ดึงผ่าน ildasm.exe):

// Metadata version: v4.0.30319
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly Example
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                            63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.

  // --- The following custom attribute is added automatically, do not uncomment -------
  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) 

  .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 0A 54 65 73 74 49 4C 44 41 53 4D 00 00 )    // ...TestILDASM..
  .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 0A 54 65 73 74 49 4C 44 41 53 4D 00 00 )    // ...TestILDASM..
  .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20   // ...Copyright .. 
                                                                                                  20 32 30 31 36 00 00 )                            //  2016..
  .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 39 33 32 61 32 30 65 2D 61 37 36 64   // ..$1932a20e-a76d
                                                                                                  2D 34 36 33 35 2D 62 36 38 66 2D 36 63 35 66 36   // -4635-b68f-6c5f6
                                                                                                  32 36 36 31 36 37 62 00 00 )                      // 266167b..
  .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 )             // ...1.0.0.0..
  .custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1C 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B   // ....NETFramework
                                                                                                        2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 2E 32 01   // ,Version=v4.5.2.
                                                                                                        00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73   // .T..FrameworkDis
                                                                                                        70 6C 61 79 4E 61 6D 65 14 2E 4E 45 54 20 46 72   // playName..NET Fr
                                                                                                        61 6D 65 77 6F 72 6B 20 34 2E 35 2E 32 )          // amework 4.5.2
  .hash algorithm 0x00008004
  .ver 1:0:0:0
}
.module Example.dll
// MVID: {80A91E4C-0994-4773-9B73-2C4977BB1F17}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x05DB0000

// =============== CLASS MEMBERS DECLARATION ===================

.class public auto ansi beforefieldinit Example.Class1
       extends [mscorlib]System.Object
{
  .method public hidebysig instance void 
          SayHello() cil managed
  {
    // Code size       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Class1::SayHello

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // Code size       8 (0x8)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  nop
    IL_0007:  ret
  } // end of method Class1::.ctor

} // end of class Example.Class1

// =============================================================

8

ใน. NET คุณจะไม่พบเฉพาะ C # คุณสามารถค้นหา Visual Basic ได้ หากงานต้องการความรู้. NET อาจจำเป็นต้องมีโปรแกรมเมอร์ที่รู้ภาษาทั้งหมดที่จัดเตรียมโดย. NET Framework


1
คุณพูดถูกและขอบคุณสำหรับ headup ถึงแม้ว่าผมจะพูดถึงเฉพาะ C # ในคำถามนี้ แต่ในโพสต์งานที่โดยเฉพาะอย่างยิ่งกล่าว VB ได้เป็นอย่างดี ..
Bopha

5

C # เป็นภาษาโปรแกรม

.Net เป็นเฟรมเวิร์กที่ใช้สำหรับสร้างแอพพลิเคชั่นบน Windows

.Net framework ไม่ จำกัด เฉพาะ C # ภาษาที่แตกต่างกันสามารถกำหนดเป้าหมาย. Net framework และสร้างแอปพลิเคชั่นโดยใช้ Framework นั้น ตัวอย่างคือ F # หรือ VB.Net


4

C#ไม่มีไลบรารีรันไทม์ที่แยกต่างหาก มันใช้.NETเป็นห้องสมุดรันไทม์


คุณหมายถึงการติดตั้ง c # ของ Microsoft
Nishant George Agrwal

ใช่. ฉันไม่มีความคิดเกี่ยวกับการใช้งานอื่น ๆ
Jude

ดังที่ Andrew Hare พูดถึงในคำตอบของเขา Mono c #
Vort3x

3

ที่นี่ฉันให้ลิงก์ที่อธิบายถึงภาษา C #และสถาปัตยกรรมแพลตฟอร์ม. NET Frameworkแก่คุณ จำไว้ว่า C # เป็นภาษาโปรแกรมเชิงวัตถุและทำงานบน. NET Framework

.NET Framework รวมไลบรารีคลาสขนาดใหญ่ชื่อว่า Framework Class Library (FCL) และจัดเตรียมส่วนติดต่อผู้ใช้การเข้าถึงข้อมูลการเชื่อมต่อฐานข้อมูลการเข้ารหัสการพัฒนาโปรแกรมประยุกต์บนเว็บอัลกอริธึมเชิงตัวเลขและการสื่อสารเครือข่าย

.NET Framework พัฒนาโดย Microsoft ซึ่งทำงานบน Microsoft Windows เป็นหลัก

รู้เบื้องต้นเกี่ยวกับภาษา C # และ. NET Framework จาก Microsoft Docs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.