.NET開發到底是什麼?

題主大學計算機系粗略地學了各種java c++等語言,然而找工作時有很多公司要求.net開發基礎。後來題主去網上搜了一下發現是微軟的一個什麼開發框架平台(?),搜了很多但還是不能理解.net是幹啥的,能不能淺顯易懂地說一下.net是什麼?它跟c++ java一類的語言有什麼異同?


.NET是個平台,理論上,各種語言都可以編譯成它的IL,在上面運行。.NET開發,就是把它當作目標平台的開發。(除非你在極少數的公司,那是真正做.NET開發的。做的是開發.NET這個平台本身。)

然而實際上,.NET上還分了階級。C#是全能的親兒子,ASP/VB/F#是能力較弱的親兒子,其他語言那是乾兒子或者過繼的。所以,實際中,你可以認為就是在搞C#了。

所以說,.NET上所有語言都是平等的,但有些語言比另一些更平等一些。


這麼說明你java也沒搞懂,因為.net的書一開始都是按java的概念遷移對比的,jvm對應clr,java se runtime對應 .net framework, jdk對應 .net framework sdk,java對應C#,JPype對應IronPython,scala對應F#(不準),就是想表達jvm上可以有很多種語言,clr上也可以有很多語言。在java平台上可以開發web,服務,界面程序,安卓,C#也可以開發web,服務,界面exe程序,手機app。spring裡面東西好像比較多,.net有移植的http://spring.net,但是更應該對應aspnet mvc + unity啥的。java體系跨平台,C#體系一開始用mono現在由微軟主導的 .net core 跨平台。java現在用JetBrains開發了吧,C#一直是VS為主。

題主你java學了些啥?


你就把它看成C#


.NET是個平台,就像Java虛擬機一樣的一個平台,可以運行你所寫的程序。

http://ASP.NET也是一個平台。

.NET平台包括了運行時的環境和開發環境。

目前.NET支持的語言有:
C#、http://VB.NET、JavaScript、HTML、XML、XAML、F#,VC++.NET等。


可以稱之為microsoft java


我的理解是基於.net平台的開發,包括uwp,WinForm,asp.net等等等等,可用的開發語言很多,c#,c++,vb.net,f#,uwp還能用JS,XAML算技術還是語言


一樓已經明確回答很清楚了:補一句 c# = c++++ 微軟搞c# 「#」是四個? 不懂 谷歌下 以下是對比和區別 百度一大堆。精一通十,舉一反三。百年不變的底層,千變萬化的框架僅此而已,語言只是不斷的在「人性化」而已。

一、c#與c++的區別

相比c++,c#做了很多簡化,使的編寫代碼更加容易,重要的變化由如下方面:

1、拋棄了指針的使用。在c#中沒法使用指針了,在對象成員的調用也只有一種方式,就是通過 . 來引用。

2、完全面向對象。在c#中,不再有全局的函數了。所有的代碼都必須在類中。連基本的基本類型都有方法,如:

http://common.cnblogs.com/images/copycode.gif

class Myapp
{
private static void Main(string[] args)
{
int a = 10;
string value = a.ToString();
int b = int.Parse(value);
}
}

http://common.cnblogs.com/images/copycode.gif

3、沒有了頭文件的概念,類的定義和實現都在類中。

4、引入了命名空間的概念,用於劃分源代碼,類似java的包的概念。

5、類的繼承上廢除了多繼承的概念,一個類智能有一個父類,而在c++中可以有多個父類。

6、引入了類似java中的介面概念。

7、引入了屬性的概念,簡化了對成員變數的操作。

#與java基本語法的對比

1、程序框架

同java一樣,c#要求所有的代碼都要在類中,不再同c++一樣,既可以定義類,也可以定義全局的方法。

java程序的入口代碼必須是某個類中的如下的方法 :

public static void main(String[] args);

而在c#中,入口方法是

static void Main(string[] args)

注意:c#中Main的第一個字母M是大寫,且Main方法的參數可以不定義。方法的修飾符也可以不加public。

2、包和命名空間

在java中,通過包來組織java源文件。在c#中,通過命名空間來組織c#源文件。 它們的含義和作用是類似的。

區別是,java強制要求java源文件的存放補錄必須與包路徑嚴格一致。

在java中,通過import引入包,而在c#中通過using引入命名空間。

兩者都可以通過全路徑來引用類(這樣就不需要import和using了)。

3、基本數據類型

兩者大部分基本類型的名稱都一樣,如 int ,char等。枚舉定義的關鍵字都是 enum。數組定義和使用語法也是類似。

典型的區別是:

1)布爾型在java中是 boolean,而在c#中是bool。

2)字元串類型名在java中 是 String ,而在c#中是 string (第一個字母s是小寫)。

最關鍵的是在java中進行字元串內容的比較要用 equlas方法,而在c#中直接可以用 == 比較。

4、語句

兩者的 if 語句,switch語句,for,while, do ...while,break, continue 使用方式都一致。

有個區別是,在java中,可以用for循環遍歷集合。而在c#中需要用單獨的關鍵字 foreach來遍歷,但使用方法一樣。

三、c#與java面向對象語法的對比

java和 c# 都是通過 class關鍵字來定義類,也都不需要頭文件。類的實現代碼用 { }擴起。

1、類的成員

c#中引入了一個屬性的概念。

我們知道在java中,為了提高安全性,我們定義成員變數一搬建議定義private的,這樣為了其它類能訪問該變數,再定義相應的get 和 set 方法,代碼如:

http://common.cnblogs.com/images/copycode.gif

class A{
private int num;
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}

class B{
public void test(){
A a = new A();
a.setNum(10);
int num = a.getNum();
}
}

http://common.cnblogs.com/images/copycode.gif

而在c#中,為了簡化操作,引入了一個屬性的概念,舉例如下

http://common.cnblogs.com/images/copycode.gif

class A
{
public int num { get; set; }
}

class B
{
public void test()
{
A a = new A();
a.num = 10;
int re = a.num;
}
}

http://common.cnblogs.com/images/copycode.gif

在類A中,定義了一個屬性 num,在類B中,直接通過屬性名可以訪問,簡化了java中的語法。
在A中定義num時,可以只有get或set標記,表示只讀或只寫的。

上面的方式存在一個問題,如果在get或set操作時需要通過一定的計算來返回值,既可以採用如下的代碼方式。調用方法不變。

http://common.cnblogs.com/images/copycode.gif

class A
{
private int _num;
public int num
{
get { return _num; }
set { _num = value*2; }
}
}

http://common.cnblogs.com/images/copycode.gif

與上面相比,先定義了一個普通的變數_num(這裡是private的,不讓外部直接訪問)。
然後定義了一個屬性num,並且有相應的代碼,其中set代碼中的 value是隱式參數,是在給屬性設置值時傳入的參數。

這和java代碼的使用方式類似了,只是省去了需要定義 setXXX類似的方法。 另外調用時簡化了,直接通過屬性名就可以。

2、訪問修飾符

在java中,有 public, protected,private 和 預設四種級別的修飾符,在定義類和成員時不加修飾符,默認是預設的。

在c#中,預設修飾符需要顯示的用internal關鍵字標識,並且如果定義時不加修飾符,默認不是internal 而是 private的。並且在c#中,可以 protected internal組合使用,其含義是訪問僅限於該類或當前程序集(同一命名空間)的派生類。單獨的protected範圍比protected internal大,允許的派生類不限於當前程序集,加上了internal將派生類限制在當前程序集。

3、類的繼承語法

兩者都支持類的繼承,在c++中支持多個父類,在c#中進行了簡化,同java一樣,一個類只允許有一個父類。

在java中通過extends關鍵字繼承類,在c#中採用的是c++的語法,用 :後跟父類表示。兩者對父類構造函數的處理機制也不一樣。下面舉例說明。

下面代碼是java的例子:

http://common.cnblogs.com/images/copycode.gif

class A{
private int num;
public A(int num){
this.num = num;
}
}

class B extends A{
public B(int num) {
super(num);
//其它代碼,super語句必須放在第一行。
}
}

http://common.cnblogs.com/images/copycode.gif

可以看出,在java中使用extends關鍵字來繼承父類,用 super方法來調用父類的構造函數。

下面是c#的代碼

http://common.cnblogs.com/images/copycode.gif

class A{
private int num;
public A(int num){
this.num = num;
}
}

class B : A{
public B(int num):base(num) {

}
}

http://common.cnblogs.com/images/copycode.gif

可以看出,在c#中是通過 : 標識符來繼承父類,而且是通過base關鍵字來調用父類構造函數。

4、介面

在java中,引入了介面類型,一個類可以實現一個或多個介面.

在c#中,參考java引入了介面的機制,注意在c++中沒有介面的機制。

但兩者在實現介面的語法上有些區別,在java中通過implements關鍵字來標識,而在c#中,使用同繼承一樣。

下面是java的語法例子

http://common.cnblogs.com/images/copycode.gif

interface hello1{}
interface hello2{}

class A implements hello1,hello2{
private int num;
public A(int num){
this.num = num;
}
}

class B extends A implements hello1,hello2{
public B(int num) {
super(num);
//其它代碼,super語句必須放在第一行。
}
}

http://common.cnblogs.com/images/copycode.gif

在java中,當一個類同時需要繼承父類和實現介面時,extends語句要放在 implements語句前。

下面是c#的語法例子

http://common.cnblogs.com/images/copycode.gif

interface hello1 { }
interface hello2 { }
class A:hello1,hello2{
private int num;
public A(int num){
this.num = num;
}
}

class B : A,hello1,hello2{
public B(int num):base(num) {

}
}

http://common.cnblogs.com/images/copycode.gif

在 c#中,當一個類同時需要繼承父類和實現介面時,因為都是跟在 : 後面,需要將父類名放在前面,介面名在後面,如上面例子。

5、重載、重寫(多態)

所謂重載,就是一個類可以有多個方法,方法名一樣,但參數信息不一樣。這個java和 c#都支持。

所謂重寫,是面向對象編程中多態特性的體現。就是子類可以定義和父類一樣的方法,具體執行時是執行父類方法還是子類方法,動態根據實例綁定。java和c#都有這個特性,區別是使用語法上有些不同。

java的例子:

http://common.cnblogs.com/images/copycode.gif

package com;

public class Demo {
public static void main(String[] args) {
A a = new A();
a.show(); //輸出的是 i am A

B b = new B();
b.show(); //輸出的是 i am B

A c = new B();
c.show(); //輸出的是 i am B. 多態體現,動態決定調用父類或子類方法。因為c實際是指向B的實例
}
}

class A {
public void show() {
System.out.println("i am A");
}
}

class B extends A {
public void show() {
System.out.println("i am B");
}
}

http://common.cnblogs.com/images/copycode.gif

可以看出,子類B通過定義相同的方法,重載了父類A的方法。實際執行時,根據變數指向的具體實例決定調用是父類或子類的方法。

c#的例子,c#在多態上的語法參考了c++的特點,需要通過virtual和override關鍵字來標識。

http://common.cnblogs.com/images/copycode.gif

class Myapp
{
private static void Main(string[] args)
{
A a = new A();
a.show(); //輸出的是 i am A

B b = new B();
b.show(); //輸出的是 i am B

A c = new B();
c.show(); //輸出的是 i am B. 多態體現,動態決定調用父類或子類方法。因為c實際是指向B的實例
}
}

class A {
virtual public void show() {
System.Console.WriteLine("i am A");
}
}

class B : A {
override public void show() {
System.Console.WriteLine("i am B");
}
}

http://common.cnblogs.com/images/copycode.gif

可以看出,在c#中,要想實現繼承的多態性,需要在父類方法中用virtual關鍵字標識,然後在子類的方法中用override關鍵字進行標識。

需要說明的是,對於父類定義的virtual或非vritual方法,子類可以不重載,但也可以定義同樣的方法(沒有用override關鍵字),這是允許的,這時子類的該方法將隱藏父類的方法,這個不是動態的特性。

6、抽象類和抽象方法

有時在父類中定義一個序方法,但該方法在基類中不需要有具體的實現,需要在子類中實現。這個特性java和c#都支持。

只是語法上有細微差別。這裡舉例說明下。

java的例子:

http://common.cnblogs.com/images/copycode.gif

package com;

public class Demo {
public static void main(String[] args) {
B b = new B();
b.show(); //輸出的是 i am B

A c = new B();
c.show(); //輸出的是 i am B. 多態體現,動態決定調用父類或子類方法。因為c實際是指向B的實例
}
}

abstract class A {
public abstract void show();
}

class B extends A {
public void show() {
System.out.println("i am B");
}
}

http://common.cnblogs.com/images/copycode.gif

在java中,是通過abstract關鍵字標識抽象類和抽象方法的,具體有如下細節:
1)一個類有抽象方法,其所在的類必須定義為抽象類。

2)子類繼承抽象父類,要麼實現父類的抽象方法,要麼繼續把自己定義為抽象類。

3)抽象方法沒有方法體。抽象類不能實例化。

下面是c#中的例子

http://common.cnblogs.com/images/copycode.gif

class Myapp
{
private static void Main(string[] args)
{
B b = new B();
b.show(); //輸出的是 i am B

A c = new B();
c.show(); //輸出的是 i am B. 多態體現,動態決定調用父類或子類方法。因為c實際是指向B的實例
}
}

abstract class A {
abstract public void show();
}

class B : A {
override public void show() {
System.Console.WriteLine("i am B");
}
}

http://common.cnblogs.com/images/copycode.gif

除了子類方法定義需要加override關鍵字,其它語法要求與java一樣。另外對抽象類和抽象方法的要求也與java中的要求一致。

四、c#與java其它對比

1、常量和只讀欄位

在java中,可以通過final來定義只讀變數,可以使成員變數,可以是方法的內的局部變數,也可以是形參。並且定義和初始化可以一起,也可以分開。

如果是定義的的final成員變數,則需要在構造函數中初始化。 如果是方法內的局部變數,可以在定義後賦值。

在c#中,可以用 const關鍵字定義常量,要求必須在定義時理解賦值。

在c#中,還可以用 readonly來定義類的成員(注意不能定義局部變數),可以在定義時賦值,也可以定義時不賦值,而在構造函數中賦值。

2、異常處理

java和 c#有類似的異常處理機制和語法,都有 try, catch, finally, throw 這幾個使用關鍵字。 區別是:

1)java中的異常分為檢查時異常和運行期異常兩種,而c#中只有一種(運行期異常)。

2)在java中 ,catch語句必須帶異常類型參數。

而在c#中,可以不帶,表示是預設的,表示對所有異常處理,但如果定義了多個異常,不帶參數的必須放在最後。

3、參數傳遞

在java中,參數傳遞只有值傳遞一種方式。對於基本數據類型,如 int等,在方法內無法修改方法的值。

而在c#中,保留了c/c++的特性,通過 ref 和 outer 關鍵字,可以讓形參和實參指向同樣的值,這樣在方法內修改形參的值,方法外的實參值也跟著變化。

不過,為了提高程序的可讀性,建議少用這種特性。

4、內部類

在java中,支持內部類,包括匿名內部類。但在c#中,支持內部類,但不支持匿名內部類。

如下面的匿名內部類在java中是允許的,但在c#中是不行的。

http://common.cnblogs.com/images/copycode.gif

package com;

public class Demo {
public static void main(String[] args) {
A a = new A() {
public void show() {
;
}
};
a.show();
}
}

abstract class A {
public abstract void show();
}

http://common.cnblogs.com/images/copycode.gif

5、分部類

在c#中,編寫代碼時可以將一個類的定義分到多個cs文件中,後續由編譯器自動合併。這個在java中不支持。

這個特性感覺很不好,強烈建議正常情況下不要使用。


是一個可以開發全平台應用的萬能平台。

可以搞定桌面

可以搞定web

可以搞定安卓

可以搞定蘋果

可以搞定windows

可以搞定linux

……


我編程入門就是學的.net開發,當初只是覺得Visual Basic 6.0太老了,不想學,於是乎找了Visual Basic .net 的書,也不理解Visual Basic 6.0和Visual Basic .net有什麼區別的情況下就入門了,當時連面向對象編程是什麼都不知道,那個已經是微軟發布 .net framework 2.0 的時候的事了,現在已經在使用C#了。

其實 .net 就像 java ,就是編譯成中間語言,然後運行時再用解釋器解釋成機器代碼,當初因為 java 的先行,和這種運行時解釋的這種模式的低效率(比起C++而言,而當初計算機性能不比現在),.net 並不被看好,當然現在 .net 已經很不錯了,運行效率的提高也很多。

.net framework 的初衷是可以跨平台(其實我認為通用性最強的應該是C++和C,換個編譯器,對代碼稍作修改,就可以發布到不同平台),他使用一套標準,可以讓精通不同語言的的程序員在一起合作開發一套軟體,因為不同語言開發的類庫在這一套標準下能互相引用。

再來說說C#,當初,微軟以自己的方式在Visual Studio里集成了java(Visual J++),結果Sun公司認為Visual J++ 違反了Java開發平台的中立性,對微軟提出了訴訟。微軟便因此放棄了Visual J++ ,2000年微軟發布了C#,其實C#在很多方面模仿了java。當然,現在說到 .net,大部分都是使用C#了。至於Visual Basic .net 其前身是Visual Basic,Visual Basic前身是Basic語言,不同的是Visual Basic .net 除了語法之外,其實是一門全新的編程語言,他完全面向對象並且符合 .net framework標準,其實這門語言市場佔有率一直不高,他的廢留曾經還引起爭論,後來微軟承諾Visual Basic .net與.net framework家族的其他語言共同發展,但事實上重視程度不夠。

F#從2002年開始研發,2005年發布了第一個版本,F#在Visual Studio 2010中首次出現。F#是函數型程序設計語言,不過因為現在資料比較少,並且編程思維要轉變很困難,我對他了解不多。

Asp .net 的前身是Asp,但這並不是對Asp進行簡單升級,因為微軟把其完全融入了 .net framework 並可以用 .net framework 中支持的語言進行開發,說簡單寫就是可以用C#,Visual Basic .net 就像jsp,php一樣開發動態網頁。

當然現在 .net平台不是不夠好,特別是前幾年,不知道為什麼很多企業能不用微軟的技術就不用,特別是為什麼一個中小型企業用的內部OA系統的伺服器要使用Linux和Oracle資料庫系統,難道維護成本不低嗎,為什麼大材小用?我不是很理解,可能千家萬戶用Windows,用微軟的技術逼格不夠高吧?一個學生黨,僅僅是猜測哈。所以重點,重點就是 .net是微軟的。

其實 .net開發這個說法很籠統,因為 .net這個平台包括了很多技術,看看現在的Visual Studio完全安裝有多大就知道了。我就主要說說我對這個平台各個語言的理解。如有不妥多多包涵哈╮(~▽~)╭


.net是個框架,實際上每個人的windows裡面都有.net框架,它被用來作為中間層,就像java虛擬機,java為什麼能跨平台,因為它中間有個虛擬機,把你寫的代碼編譯成為位元組碼,這個位元組碼與操作系統無關,不同的操作系統只要安裝了相應的java虛擬機,對這段位元組碼就會有不同的解釋,會被分別翻譯成能在自己的系統上運行的機器碼(010101),也就是說,這段位元組碼你拿到linux和windows上有不同的解釋,這樣就實現了跨平台,微軟為了讓c#跨平台,也在windows上部署了一個.net框架,這個框架相當於java虛擬機,起到中間層的作用,能夠幫助c#實現跨平台


.NET總的來說是一套完整的技術體系,包含語言(C#,VB,F#等一切實現公共語言介面規範的語言),運行時,各種基礎框架類庫。在此平台基礎上,可以開發桌面應用(WPF),通用Windows應用(UWP),Web應用(ASP.NET/Core),跨平台移動應用(Xamarin.Forms),Linux平台應用(.NET Core)等任何常見的應用程序。相對應的是整個Java技術體系。


當年有一本很好的書,叫做《.NET大局觀》,不過貌似挺老的了


我就是做.NET開發的,我簡歷上是這樣寫的。我主要工作是用C#在VS上開發Web啊WinFrom啊或者服務啊應用啊什麼的。但是我現在也不知道.NET開發到底是什麼。


看你這話題里又有c#asp net的


我覺得.net名字起得不好,直接叫C#平台更容易理解。

因為除了C#其他語言都挺難用.net的,都需要額外知道某些技術的知識才能和.net整合,比如說COM技術。


你說的.net開發對應的是java開發

我覺得.net開發應該對應jvm開發


Java是啥你搞懂沒?


推薦閱讀:

專科,學軟體開發怎麼找工作?
有哪些為開源軟體做出了極大貢獻,結局卻不太好的程序員呢?
如何評價2017浙江省ACM省賽?
軟體工程本科生 方向很迷茫 一個嵌入式 一個軟體技術裡面寫的很詳細 誠懇認真的請教大牛?
知乎里的編程大神的 GitHub 地址都是什麼?

TAG:程序員 | 開源 | NET | ASPNET | C# |