Apa perbedaan antara C # dan .NET?

204

Bolehkah saya tahu apa perbedaan antara C # dan .NET? Ketika saya memikirkan C #, segera saya akan mengatakan itu adalah bahasa .NET, tetapi ketika saya mencari posting pekerjaan, mereka membutuhkan kandidat untuk memiliki pengalaman C # dan .NET. Bisakah seseorang memberi saya penjelasan?

Bopha
sumber
41
Saya dapat menjelaskan persyaratan posting ... Itu ditulis oleh pengembang non-.NET. Entah SDM atau manajemen yang tidak PERLU untuk memahami perbedaan.
David
2
Anda benar sekali, saya harus tahu di antara keduanya. Saya telah menggunakan C # untuk beberapa waktu sekarang dan selalu menggunakan kelas .Net library saat pengkodean C # tetapi tidak pernah mengambil waktu untuk membedakan keduanya. Tapi sekarang saya tahu, terima kasih ..
Bopha

Jawaban:

128

Selain apa yang dikatakan Andrew, perlu dicatat bahwa:

  • .NET bukan hanya perpustakaan , tetapi juga runtime untuk menjalankan aplikasi.
  • Pengetahuan tentang C # mengimplikasikan beberapa pengetahuan tentang .NET (karena model objek C # sesuai dengan model objek .NET dan Anda dapat melakukan sesuatu yang menarik dalam C # hanya dengan menggunakan perpustakaan .NET). Sebaliknya tidak selalu benar karena Anda dapat menggunakan bahasa lain untuk menulis aplikasi .NET.

Perbedaan antara bahasa , runtime , dan pustaka lebih ketat dalam .NET / C # daripada misalnya dalam C ++, di mana spesifikasi bahasa juga mencakup beberapa fungsi pustaka dasar. Spesifikasi C # hanya mengatakan sedikit tentang lingkungan (pada dasarnya, itu harus mengandung beberapa jenis seperti int, tapi itu kurang lebih semuanya).

Tomas Petricek
sumber
197

C # adalah bahasa pemrograman.

Implementasi C # dari Microsoft sangat terintegrasi dengan .NET Framework sehingga dapat dipahami bahwa kedua konsep ini akan membingungkan. Namun penting untuk dipahami bahwa mereka adalah dua hal yang sangat berbeda.

Ini adalah kelas yang ditulis dalam C #:

class Example { }

Berikut adalah kelas yang ditulis dalam C # yang secara eksplisit menggunakan perakitan, tipe, dan metode .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");
    }
}

Seperti yang saya sebutkan sebelumnya, sangat sulit untuk menggunakan implementasi C # dari Microsoft tanpa menggunakan .NET framework juga. ExampleImplementasi pertama saya di atas bahkan menggunakan kerangka NET. (Secara implisit, ya, tapi tetap menggunakannya) karena Examplemewarisi dari System.Object.

Juga, alasan saya menggunakan frasa implementasi Microsoft dari C # adalah karena ada implementasi lain dari C # yang tersedia .

Andrew Hare
sumber
3
@ Tech - Sebenarnya, VB.NET adalah .NET. VB tidak.
Eric Mickelsen
+1 Andrew Hare. @ Tech: C # dan VB sangat terintegrasi ke. NET, bukan. NET. .NET adalah suatu kerangka kerja. Sebagai contoh, Anda dapat melakukan .NET di Delphi. Jika C # adalah .NET, maka Anda akan dapat kode C # dalam Delphi .NET, yang jelas tidak bisa dilakukan dan bahkan tidak dapat dipahami.
Will Marcouiller
Demikian pula, tidak ada alasan Anda harus memiliki .NET untuk memprogram dalam C #, meskipun saya tidak tahu siapa pun yang menulis C # tanpa .NET atau Mono.
David Thornley
.NET CLR adalah tentang tipe. Untuk mendukung beberapa bahasa, mereka datang dengan CTS - Sistem tipe umum yang mendefinisikan bagaimana jenis harus didefinisikan dan aturan yang mengatur mereka misalnya warisan, objek seumur hidup dll. C ++ / CLI, C #, VB adalah semua bahasa yang sesuai dengan jenis ini (Anda bisa melanggar ini tetapi saya tidak akan masuk ke dalamnya). Terlepas dari bahasa apa yang Anda gunakan untuk membangun tipe, perilaku akan sama ketika dieksekusi oleh .NET CLR. Oleh karena itu, bahasa dan .NET dapat berkembang secara terpisah meskipun ada koneksi melalui CTS. VS2012 misalnya tidak mendukung kompiler C # 6 tetapi bekerja dengan .NET 4.6
Frank Q.
55

C # adalah bahasa pemrograman, .NET adalah kerangka kerja bahasa yang dibangun.

Heisenberg
sumber
50

C # adalah bahasa pemrograman Berorientasi Objek yang kuat yang sebagian besar dibangun pada kerangka .NET.

C # adalah pesawat terbang dan .NET adalah landasan;)

Fareevar
sumber
16

C # adalah bahasa, .NET adalah kerangka kerja aplikasi. Pustaka .NET dapat berjalan di CLR dan dengan demikian bahasa apa pun yang dapat dijalankan di CLR juga dapat menggunakan pustaka .NET.

Jika Anda terbiasa dengan Java, ini mirip ... Java adalah bahasa yang dibangun di atas JVM ... meskipun salah satu perpustakaan Java yang sudah dirakit dapat digunakan oleh bahasa lain yang dibangun di atas JVM.

Polaris878
sumber
apa yang dimaksud dengan CLR?
Kasun Siyambalapitiya
2
Common Language Runtime
Yahya-Imam Munir
1
@KasunSiyambalapitiya CLR digunakan untuk mengkonversi ke kode ke kode asli saya maksud Anda menulis kode c # konversi akan seperti ini C # => CLR => kode asli. Kemudian ia akan menjalankan semua platform seperti linux atau windows
logeshpalani98
10

Ketika orang berbicara tentang ".net framework" mereka cenderung menggabungkan dua area utama - perpustakaan runtime dan mesin virtual yang benar-benar menjalankan kode .net.

Ketika Anda membuat perpustakaan kelas di Visual Studio di C #, DLL mengikuti format yang ditentukan - sangat kasar, ada bagian yang berisi data meta yang menjelaskan kelas apa yang termasuk di dalamnya dan fungsi apa yang mereka miliki, dll. Dan yang menjelaskan di mana dalam biner objek-objek itu ada. Format .net umum ini adalah apa yang memungkinkan perpustakaan untuk dibagikan antara bahasa .net (C #, VB.Net, F # dan lainnya) dengan mudah. Meskipun banyak .net "runtime library" ditulis dalam C # sekarang (saya percaya), Anda dapat membayangkan berapa banyak dari mereka yang bisa ditulis dalam bahasa yang tidak dikelola tetapi diatur dalam format yang ditentukan ini sehingga mereka dapat dikonsumsi oleh .net language .

"Daging" sebenarnya dari perpustakaan yang Anda buat terdiri dari CIL ("Common Intermediate Language") yang sedikit mirip dengan bahasa assembly dari .net - sekali lagi, bahasa ini adalah output umum dari semua bahasa .net, yang adalah apa membuat perpustakaan .net dapat dikonsumsi oleh bahasa .net apa pun.

Dengan menggunakan alat "ildasm.exe", yang tersedia secara bebas di Microsoft SDK (dan mungkin sudah ada di komputer Anda), Anda dapat melihat bagaimana kode C # dikonversi menjadi data meta dan IL. Saya telah memasukkan contoh di bagian bawah jawaban ini sebagai contoh.

Ketika Anda menjalankan kode .net, yang biasa terjadi adalah mesin virtual .net membaca IL itu dan memprosesnya. Ini adalah sisi lain dari .net dan, sekali lagi, Anda mungkin dapat membayangkan bahwa ini dapat dengan mudah ditulis dalam bahasa yang tidak dikelola - itu "hanya" perlu membaca instruksi VM dan menjalankannya (dan berintegrasi dengan pengumpul sampah, yang juga perlu bukan .net code).

Apa yang saya jelaskan adalah (sekali lagi, kira-kira) apa yang terjadi ketika Anda membangun sebuah executable di Visual Studio (untuk informasi lebih lanjut, saya sangat merekomendasikan buku "CLR via C # oleh Jeffrey Richter" - sangat rinci dan ditulis dengan sangat baik).

Namun, ada saat-saat Anda mungkin menulis C # yang tidak akan dieksekusi dalam lingkungan .net - misalnya, Bridge.NET "mengkompilasi" kode C # ke dalam JavaScript yang kemudian dijalankan di browser (tim yang memproduksinya telah pergi ke upaya penulisan versi pustaka runtime .net yang ditulis dalam JavaScript sehingga kekuatan dan fleksibilitas pustaka .net tersedia untuk JavaScript yang dihasilkan). Ini adalah contoh sempurna pemisahan antara C # dan .net - dimungkinkan untuk menulis C # untuk "target" yang berbeda; Anda dapat menargetkan lingkungan .net runtime (saat Anda membangun yang dapat dieksekusi) atau Anda dapat menargetkan lingkungan browser (saat Anda menggunakan Bridge.NET).

Kelas contoh (sangat) sederhana:

using System;

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

Meta data dan IL yang dihasilkan (diambil melalui 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

// =============================================================
Dan Roberts
sumber
8

Di .NET Anda tidak menemukan hanya C #. Anda dapat menemukan Visual Basic misalnya. Jika suatu pekerjaan membutuhkan pengetahuan .NET, mungkin itu membutuhkan seorang programmer yang mengetahui seluruh rangkaian bahasa yang disediakan oleh .NET framework.

Maurizio Reginelli
sumber
1
Anda memang benar dan terima kasih atas bantuannya. Meskipun saya hanya menyebutkan C # dalam pertanyaan ini, tetapi dalam jabatan itu, ia menyebutkan VB juga ..
Bopha
5

C # adalah bahasa pemrograman.

.Net adalah kerangka kerja yang digunakan untuk membangun aplikasi di Windows.

Kerangka kerja Net tidak terbatas pada C #. Bahasa yang berbeda dapat menargetkan .Net framework dan membangun aplikasi menggunakan framework itu. Contohnya adalah F # atau VB.Net

Sonevol
sumber
4

C#tidak memiliki pustaka runtime yang terpisah. Ini digunakan .NETsebagai pustaka runtime.

Jude
sumber
Maksud Anda implementasi Microsoft dari c #.
Nishant George Agrwal
Iya. Saya tidak tahu implementasi lainnya.
Yudas
Seperti yang disebutkan oleh Andrew Hare dalam jawabannya, Mono c #
Vort3x
3

Di sini saya memberikan Anda tautan di mana menjelaskan apa itu Bahasa C # dan Arsitektur Platform NET Framework . Ingat bahwa C # adalah tujuan umum, bahasa pemrograman berorientasi objek, dan berjalan pada .NET Framework.

NET Framework. Termasuk perpustakaan kelas besar bernama Framework Class Library (FCL) dan menyediakan antarmuka pengguna, akses data, konektivitas database, kriptografi, pengembangan aplikasi web, algoritma numerik, dan komunikasi jaringan.

.NET Framework dikembangkan oleh Microsoft yang berjalan terutama di Microsoft Windows.

Pengantar Bahasa C # dan Framework .NET dari Microsoft Docs

S. Mayol
sumber