C # ve .NET arasındaki fark nedir?


204

C # ve .NET arasındaki farkın ne olduğunu öğrenebilir miyim? C # düşündüğümde, hemen bir .NET dili olduğunu söyleyebilirim, ancak iş gönderilerini aradığımda, adayların C # ve .NET deneyimine sahip olmalarını gerektirir. Birisi bana bir açıklama yapabilir mi?


41
Gereksinim ilanlarını açıklayabilirim ... Bunlar, .NET dışı geliştiriciler tarafından yazılmıştır. Ayrımı anlamak zorunda olmayan İK ya da yönetim insanları.
David

2
Kesinlikle haklısın, ikisi arasında bilmeliyim. Ben C # şimdi oldukça bir süredir kullanıyorum ve C # kodlarken her zaman .Net kütüphane sınıfını kullanın ama ikisi arasında ayrım yapmak için asla zaman ayırın. Ama şimdi biliyorum, teşekkürler ..
Bopha

Yanıtlar:


128

Andrew'un söylediklerine ek olarak, şunu belirtmeye değer:

  • .NET sadece bir kütüphane değil , aynı zamanda uygulamaları yürütmek için bir çalışma zamanı .
  • C # bilgisi bazı .NET bilgisi gerektirir (çünkü C # nesne modeli .NET nesne modeline karşılık gelir ve sadece .NET kütüphanelerini kullanarak C # 'da ilginç bir şey yapabilirsiniz). .NET uygulamaları yazmak için diğer dilleri kullanabileceğiniz için bunun tersi doğru olmayabilir.

Bir dil , bir çalışma zamanı ve bir kitaplık arasındaki ayrım , .NET / C # 'da, örneğin dil spesifikasyonunun bazı temel kitaplık işlevlerini de içerdiği C ++' dan daha katıdır. C # belirtimi çevre hakkında çok az şey söyler (temel olarak, bunun gibi bazı türleri içermesi gerekir int, ancak hepsi bu kadar veya azdır).


197

C # bir programlama dilidir. NET, hem .NET Framework'ü (uygulama çerçevesi kitaplığı) hem de .NET derlemelerinin çalıştığı çalışma zamanı olan Ortak Dil Çalışma Zamanı'nı kapsayan eğilimli bir terimdir.

Microsoft'un C # uygulaması .NET Framework ile büyük ölçüde bütünleşmiştir, bu nedenle iki kavramın karıştırılması anlaşılabilir. Ancak bunların çok farklı iki şey olduğunu anlamak önemlidir.

İşte C # ile yazılmış bir sınıf:

class Example { }

Açıkça bir .NET framework derlemesi, türü ve yöntemi kullanan C # ile yazılmış bir sınıf:

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

Daha önce de belirttiğim gibi, Microsoft'un C # uygulamasını .NET çerçevesini kullanmadan kullanmak çok zordur. ExampleYukarıdaki ilk uygulamam .NET çerçevesini bile kullanıyor (dolaylı olarak evet, ancak yine de kullanıyor) çünkü Exampledevralındığı için System.Object.

Ayrıca, Microsoft C # uygulaması ifadesini kullanmamın nedeni , C # ' ın başka uygulamaları da olmasıdır .


3
@Tejs - Aslında VB.NET .NET'tir. VB değil.
Eric Mickelsen

+1 Andrew Hare. @Tejs: Hem C # hem de VB, .NET'e yoğun bir şekilde entegre edilmiştir, .NET değildir. .NET bir çerçevedir. Örneğin, Delphi'de .NET yapabilirsiniz. C # .NET ise, o zaman açıkça yapılamayan ve hatta anlaşılamayan Delphi .NET'te C # kodlayabilirsiniz.
Marcouiller

Benzer şekilde, .NET veya Mono olmadan C # yazan kimseyi bilmememe rağmen, C # programlamak için .NET'e sahip olmanız için hiçbir neden yoktur.
David Thornley

.NET CLR tamamen türlerle ilgilidir. Birden fazla dili desteklemek için, CTS - Türlerin nasıl tanımlanması gerektiğini tanımlayan ortak tip sistemi ve bunları miras, nesne ömrü vb. bunu ihlal edebilir ama içine girmeyeceğim). . Türü oluşturmak için hangi dili kullandığınızdan bağımsız olarak, .NET CLR tarafından yürütüldüğünde davranış aynı olacaktır. Bu nedenle, CTS aracılığıyla bağlantı olmasına rağmen dil ve .NET ayrı olarak gelişebilir. VS2012 örneğin C # 6 derleyicisini desteklemez ancak .NET 4.6 ile çalışır
Frank Q.

55

C # bir programlama dilidir, .NET dilin üzerine inşa edildiği çerçevedir.


50

C #, çoğunlukla .NET çerçevesi üzerine inşa edilmiş güçlü bir Nesne Tabanlı programlama dilidir.

C # uçak ve .NET pist;)


16

C # bir dildir, .NET bir uygulama çerçevesidir. .NET kütüphaneleri CLR'de çalışabilir ve bu nedenle CLR'de çalışabilen herhangi bir dil .NET kütüphanelerini de kullanabilir.

Java'ya aşina iseniz, bu benzerdir ... Java, JVM'nin üzerine inşa edilmiş bir dildir ... önceden hazırlanmış Java kitaplıklarından herhangi biri JVM'nin üzerine inşa edilmiş başka bir dil tarafından kullanılabilir.


ne anlama geliyor CLR?
Kasun Siyambalapitiya

2
Ortak Dil Süresi
Yahya-Imam Munir

1
@KasunSiyambalapitiya CLR yerel koda kod dönüştürmek için kullanılan Bir kod yazmak demek c # dönüşüm bu gibi olacak C # => CLR => Yerel kod. Sonra linux veya windows gibi tüm platformları çalıştıracaktır
logeshpalani98

10

İnsanlar ".net çerçevesi" hakkında konuştuğunda, iki ana alanı birleştirme eğilimindedirler - çalışma zamanı kitaplığı ve .net kodunu çalıştıran sanal makine.

C # Visual Studio'da bir sınıf kitaplığı oluşturduğunuzda, DLL, öngörülen bir biçimi izler - çok kabaca, hangi sınıflara dahil edildiğini ve hangi işlevleri, vb. Açıklayan meta verileri içeren ve nerede açıklayan bölüm var. ikili nesnede bu nesneler vardır. Bu yaygın .net biçimi, kitaplıkların .net dilleri (C #, VB.Net, F # ve diğerleri) arasında kolayca paylaşılmasını sağlayan şeydir. .Net "çalışma zamanı kitaplığının" çoğu artık C # ile yazılmış olsa da (inanıyorum), kaçının yönetilmeyen dillerde yazılmış olabileceğini, ancak .net dilleri tarafından tüketilebilecek şekilde bu öngörülen biçimde düzenlenmiş olabileceğini hayal edebilirsiniz. .

Oluşturduğunuz kütüphanenin gerçek "eti", .net'in derleme diline benzeyen CIL'den ("Ortak Ara Dil") oluşur - yine bu dil, tüm .net dillerinin ortak çıktısıdır .net kütüphanelerini herhangi bir .net diliyle tüketilebilir hale getirir.

Microsoft SDK'larda serbestçe bulunan (ve zaten bilgisayarınızda olabilir) "ildasm.exe" aracını kullanarak, C # kodunun meta verilere ve IL'ye nasıl dönüştürüldüğünü görebilirsiniz. Örnek olarak bu cevabın altına bir örnek ekledim.

Yürütme .net kodunu çalıştırdığınızda, genel olarak olan .net sanal makinesi IL'yi okuyor ve işliyor. Bu, .net'in diğer tarafıdır ve yine, bunun kolayca yönetilemeyen bir dilde yazılabileceğini hayal edebilirsiniz - "sadece" VM talimatlarını okumalı ve çalıştırmalı (ve ayrıca ihtiyaç duyulan çöp toplayıcıyla entegre edilmelidir) .net kodu olmamalıdır).

Ne anlattım (tekrar, kabaca) Visual Studio'da bir yürütülebilir dosya oluşturduğunuzda ne olur (daha fazla bilgi için, "CLR üzerinden C # üzerinden Jeffrey Richter" kitabını tavsiye ederim - çok detaylı ve mükemmel yazılmış).

Ancak, bir .net ortamında yürütülmeyecek C # yazabileceğiniz zamanlar vardır - örneğin, Bridge.NET daha sonra tarayıcıda çalıştırılan "C # kodunu" JavaScript'e derler (üreten ekip, .net çalışma zamanı kitaplığının JavaScript'te yazılmış sürümlerini yazma çabası ve böylece .net kitaplığının gücü ve esnekliği oluşturulan JavaScript tarafından kullanılabilir). Bu, C # ve .net arasındaki ayrımın mükemmel bir örneğidir - farklı "hedefler" için C # yazmak mümkündür; .net çalışma zamanı ortamını (yürütülebilir bir dosya oluşturduğunuzda) veya tarayıcı ortamını (Bridge.NET'i kullandığınızda) hedefleyebilirsiniz.

(Çok) basit bir örnek sınıf:

using System;

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

Sonuçta elde edilen meta veriler ve IL (ildasm.exe aracılığıyla alınır):

// 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'te yalnızca C # bulamazsınız. Visual Basic, örneğin bulabilirsiniz. Bir iş .NET bilgisi gerektiriyorsa, muhtemelen .NET çerçevesi tarafından sağlanan tüm dilleri bilen bir programcıya ihtiyaç duyar.


1
kesinlikle haklısın ve kafa kafaya teşekkürler. Her ne kadar bu soruda sadece C # söz etsem de, o iş
ilanında VB'den

5

C # bir programlama dilidir.

.Net, Windows üzerinde uygulama oluşturmak için kullanılan bir çerçevedir.

Net çerçevesi C # ile sınırlı değildir. Farklı diller .Net çerçevesini hedefleyebilir ve bu çerçeveyi kullanarak uygulamalar oluşturabilir. Örnekler F # veya VB.Net'dir


4

C#ayrı bir çalışma zamanı kitaplığına sahip değildir. Çalışma .NETzamanı kitaplığı olarak kullanır .


Microsoft'un c # uygulamasını kastediyorsunuz.
Nishant George Agrwal

Evet. Başka uygulamalar hakkında hiçbir fikrim yok.
Jude

Andrew Hare cevabında belirtildiği gibi, Mono c #
Vort3x

3

Burada size C # Dil ve .NET Framework Platform Mimarisi nedir açıklayan bir bağlantı sağladı . C # 'ın genel amaçlı, nesne yönelimli bir programlama dili olduğunu ve .NET Framework üzerinde çalıştığını unutmayın.

.NET Framework, Framework Sınıf Kitaplığı (FCL) adında büyük bir sınıf kitaplığı içerir ve kullanıcı arabirimi, veri erişimi, veritabanı bağlantısı, şifreleme, web uygulaması geliştirme, sayısal algoritmalar ve ağ iletişimi sağlar.

.NET Framework, öncelikle Microsoft Windows üzerinde çalışan Microsoft tarafından geliştirilmiştir.

Microsoft Docs'tan C # Dili ve .NET Framework'e Giriş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.