ฉันขอทราบความแตกต่างระหว่าง C # และ. NET ได้อย่างไร เมื่อฉันคิดว่า C # ทันทีฉันจะบอกว่ามันเป็น. NET ภาษา แต่เมื่อฉันค้นหาโพสต์งานพวกเขาต้องการผู้สมัครที่จะมีประสบการณ์ C # และ. NET ใครช่วยอธิบายได้บ้าง
ฉันขอทราบความแตกต่างระหว่าง C # และ. NET ได้อย่างไร เมื่อฉันคิดว่า C # ทันทีฉันจะบอกว่ามันเป็น. NET ภาษา แต่เมื่อฉันค้นหาโพสต์งานพวกเขาต้องการผู้สมัครที่จะมีประสบการณ์ C # และ. NET ใครช่วยอธิบายได้บ้าง
คำตอบ:
นอกจากสิ่งที่แอนดรูว์พูดแล้วมันก็คุ้มค่าที่จะสังเกตว่า:
ความแตกต่างระหว่างภาษา , รันไทม์ , และไลบรารี่นั้นเข้มงวดมากขึ้นใน. NET / C # มากกว่าตัวอย่างใน C ++ โดยที่ข้อกำหนดภาษานั้นยังรวมถึงฟังก์ชั่นไลบรารีพื้นฐานบางอย่าง ข้อกำหนด C # บอกเพียงเล็กน้อยเกี่ยวกับสภาพแวดล้อม (โดยพื้นฐานแล้วว่าควรมีบางประเภทเช่นint
แต่มีทั้งหมดไม่มากก็น้อย)
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 (โดยปริยายใช่ แต่มันไม่ใช้มันกระนั้น) เพราะสืบทอดจากExample
System.Object
นอกจากนี้เหตุผลที่ผมใช้คำพูดที่ว่าการดำเนินการของ Microsoft C #เป็นเพราะมีการใช้งานอื่น ๆ ของ C # ใช้ได้
C # เป็นภาษาการเขียนโปรแกรม. NET เป็นเฟรมเวิร์กที่ภาษาสร้างขึ้น
C # เป็นภาษาโปรแกรมเชิงวัตถุที่แข็งแกร่งซึ่งส่วนใหญ่สร้างขึ้นบน. NET Framework
C # คือเครื่องบินและ. NET เป็นรันเวย์;)
C # เป็นภาษา. NET เป็นเฟรมเวิร์กแอปพลิเคชัน ไลบรารี NET สามารถเรียกใช้บน CLR และทำให้ภาษาใด ๆ ที่สามารถเรียกใช้บน CLR สามารถใช้ไลบรารี. NET
หากคุณคุ้นเคยกับ Java สิ่งนี้คล้ายกัน ... Java เป็นภาษาที่สร้างขึ้นบน JVM ... แม้ว่าไลบรารี Java ใด ๆ ที่ประกอบไว้ล่วงหน้าสามารถใช้โดยภาษาอื่นที่สร้างอยู่ด้านบนของ JVM
CLR
อะไร
เมื่อคนพูดถึง ".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
// =============================================================
ใน. NET คุณจะไม่พบเฉพาะ C # คุณสามารถค้นหา Visual Basic ได้ หากงานต้องการความรู้. NET อาจจำเป็นต้องมีโปรแกรมเมอร์ที่รู้ภาษาทั้งหมดที่จัดเตรียมโดย. NET Framework
C # เป็นภาษาโปรแกรม
.Net เป็นเฟรมเวิร์กที่ใช้สำหรับสร้างแอพพลิเคชั่นบน Windows
.Net framework ไม่ จำกัด เฉพาะ C # ภาษาที่แตกต่างกันสามารถกำหนดเป้าหมาย. Net framework และสร้างแอปพลิเคชั่นโดยใช้ Framework นั้น ตัวอย่างคือ F # หรือ VB.Net
C#
ไม่มีไลบรารีรันไทม์ที่แยกต่างหาก มันใช้.NET
เป็นห้องสมุดรันไทม์
ที่นี่ฉันให้ลิงก์ที่อธิบายถึงภาษา C #และสถาปัตยกรรมแพลตฟอร์ม. NET Frameworkแก่คุณ จำไว้ว่า C # เป็นภาษาโปรแกรมเชิงวัตถุและทำงานบน. NET Framework
.NET Framework รวมไลบรารีคลาสขนาดใหญ่ชื่อว่า Framework Class Library (FCL) และจัดเตรียมส่วนติดต่อผู้ใช้การเข้าถึงข้อมูลการเชื่อมต่อฐานข้อมูลการเข้ารหัสการพัฒนาโปรแกรมประยุกต์บนเว็บอัลกอริธึมเชิงตัวเลขและการสื่อสารเครือข่าย
.NET Framework พัฒนาโดย Microsoft ซึ่งทำงานบน Microsoft Windows เป็นหลัก
รู้เบื้องต้นเกี่ยวกับภาษา C # และ. NET Framework จาก Microsoft Docs