程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> Visual C# .NET入門

Visual C# .NET入門

編輯:關於C#

簡介

Visual C# .NET是Visual Studio系列中的最新成員。這種新語言基於C/C++,但它深化了更容易地使用面向組件編程的發展方向。C/C++ 程序員應該非常熟悉它的語法。

下面的示例應用程序示范了如何構建一個簡單的實現 QuickSort 算法的 C# 項目。它包括了C# 程序的基本組成部分:讀/寫控制台和文件、創建函數和使用基本數組。

這些入門指南並不打算涵蓋該編程語言的所有方面。它們只是您探索這種語言的一個起點。我們鼓勵您按照本教程的說明執行,因為它包括了 QuickSort 應用程序的各個不同部分。您還可以獲得完整的源代碼和項目文件。

建議的要求

編譯此示例應用程序需要 Visual Studio.NET(測試版 2 或更高版本)。關於 C/C++ 的知識是有幫助的但不是必需的。

步驟 1. 開始項目

Visual Studio 中的開發工作以解決方案的形式進行組織,每個解決方案包含一個或多個項目。在本教程中,我們創建的解決方案包含一個 C# 項目。

創建一個新項目 1. 在 Visual Studio .NET 環境中,從菜單中選擇 File | New | Project。

2. 在左側選擇 Visual C#Projects,然後在右側選擇 Console Application。

3. 指定項目的名稱,然後輸入創建項目的位置。Visual Studio 會自動創建項目目錄。

4. 單擊 OK,那麼現在就正式開始了! Visual C# 解決方案

Visual Studio.NET 已經創建了含有一個簡單 Visual C# 項目的解決方案。該項目包含兩個文件:assemblyinfo.cs 和 class1.cs。

接下來的幾步驟將討論這些不同的文件以及如何編譯該項目。

步驟 2. Hello, World!

很遺憾,但我們仍然無法抵御這種誘惑……我們還是不得不完成一個基於 C# 的經典"Hello, World!"應用程序,這個應用程序最初是用 C 語言編寫的。

修改源代碼 1. 在 Solution Explorer 中雙擊文件"class1.cs"。可以通過"View"菜單來顯示 Solution Explorer。 2. 更改預生成的模板 (class1.cs),如下面以斜體突出顯示的 代碼所示。

using System;
namespace quicksort
{
  ///
  /// Summary description for Class1.
  ///
  class Class1
  {
    static void Main(string[] args)
    {
      //
      // TODO: Add code to start application here
      //
      Console.WriteLine ("Hello, C#.NET World!");
    }
  }
}

3. 注意,當您鍵入代碼時,Visual Studio 將為您提示類和函數的名稱(因為 .NET 框架發布了這種類型信息)。

編譯應用程序 1. 既然您已經完成了修改,就可以通過在 Build 菜單中簡單地選擇 Build 來編譯 Visual C# 項目。

2. 來自 C# 編譯器的錯誤和消息會在 Output 窗口中顯示。如果沒有錯誤,則可以通過單擊 Debug 菜單下的 Start without Debugging 來運行 Hello World 應用程序。

程序輸出

在 Visual C# 中運行 Hello World 示例應用程序時,輸出結果的屏幕截圖如下:

理解更改

System.Console 類的 WriteLine() 函數打印傳遞給它的字符串,其後緊跟一行新的字符。此函數可以接受許多其他數據類型(包括整型和浮點型)的參數。

在程序加載完成後,控制就傳遞給 Main() 函數。這就是我們在該過程中插入對 WriteLine() 調用的原因。

步驟 3. 程序結構

既然我們已經構建了一個簡單的 Hello World 應用程序,那麼就讓我們停下來分析一下 Visual C# 應用程序的基本組成部分。

源代碼注釋

字符 // 將行的剩余部分標記為一個注釋,這樣 C# 編譯器就會忽略它。另外,/* 和 */ 之間的代碼也會被當作注釋。

// This line is ignored by the compiler.
/* This block of text is also
ignored by the Visual C# compiler. */
Using 指令

.NET 框架為開發人員提供了許多有用的類。例如,Console 類處理對控制台窗口的輸入和輸出。這些類是按照層次樹的形式組織的。Console 類的完全限定名實際上是 System.Console。其他的類包括 System.IO.FileStream 和 System.Collections.Queue。

using 指令允許您在不使用完全限定名的情況下引用命名空間中的類。以斜體突出顯示的 代碼應用了 using 指令。

using System;
class Class1
{
  static void Main(string[] args)
  {
    System.Console.WriteLine ("Hello, C#.NET World!");
    Console.WriteLine ("Hello, C#.NET World!");
  }
}
類聲明

與 C++ 或 Visual Basic 不同,Visual C# 中的所有函數都必須封裝在一個類中。class 語句聲明一個新的 C# 類。就 Hello World 應用程序來說,Class1 類包含一個函數,即 Main() 函數。如果用一個 namespace 塊將類的定義括起來,就可以把類組織為諸如 MsdnAA.QuickSortApp 這樣的層次。

在本入門指南中,我們並不打算深入地介紹類,但是我們將為您簡要概述為什麼類是我們的示例應用程序的一部分。

Main() 函數

在應用程序加載到內存之後,Main() 函數就會接收控制,因此,應該將應用程序啟動代碼放在此函數中。傳遞給程序的命令行參數存儲在 args 字符串數組中。

步驟 4. 控制台輸入

現在,我們將繼續編寫 QuickSort 應用程序。我們需要做的第一件事就是提示用戶提供輸入和輸出文件。

修改源代碼

更改 C# 源文件 (class1.cs),如下面以斜體突出顯示的代碼所示。其他的差異(如類名)可忽略不計。

// Import namespaces
using System;
// Declare namespace
namespace MsdnAA
{
  // Declare application class
  class QuickSortApp
  {
    // Application initialization
    static void Main (string[] szArgs)
    {
      // Describe program function
      Console.WriteLine ("QuickSort C#.NET Sample Application\n");
      // Prompt user for filenames
      Console.Write ("Source: ");
      string szSrcFile = Console.ReadLine ();
      Console.Write ("Output: ");
      string szDestFile = Console.ReadLine ();
    }
  }
}
從控制台進行讀取

Console 類的 ReadLine() 方法提示用戶輸入,並返回輸入的字符串。它會自動地為字符串處理內存分配,由於使用了 .NET 垃圾回收器,您不需要做任何釋放內存的工作。

程序輸出

從菜單中選擇 Debug | Start Without Debugging 來運行程序。這是到此為止來自 QuickSort 應用程序的輸出的屏幕截圖。

步驟 5. 使用數組

在對從輸入讀取的行進行排序之前,程序需要將其存儲到一個數組中。我們將簡要討論可實現對象數組的 .NET 基類的用法。

修改源代碼

更改 C# 源文件 (class1.cs),如下面以斜體突出顯示的代碼所示。其他的差異(如類名)可忽略不計。

// Import namespaces
using System;
using System.Collections;
// Declare namespace
namespace MsdnAA
{
  // Declare application class
  class QuickSortApp
  {
    // Application initialization
    static void Main (string[] szArgs)
    {
      // Describe program function
      Console.WriteLine ("QuickSort C#.NET Sample Application\n");
      // Prompt user for filenames
      Console.Write ("Source: ");
      string szSrcFile = Console.ReadLine ();
      Console.Write ("Output: ");
      string szDestFile = Console.ReadLine ();
      // TODO: Read contents of source file
      ArrayList szContents = new ArrayList ();
    }
  }
}

使用 ArrayList 類

我們將導入 System.Collections 命名空間,這樣我們就可以直接引用 ArrayList。此類實現大小可動態調整的對象數組。要插入新的元素,可以簡單地將對象傳遞到 ArrayList 類的 Add() 方法。新的數組元素將引用原始的對象,而垃圾回收器將處理它的釋放。

string szElement = "insert-me";
ArrayList szArray = new ArrayList ();
szArray.Add (szElement);

要檢索現有的元素,請將所需元素的索引傳遞給 Item() 方法。另外,作為一種簡寫形式,還可以使用方括號 operator [],它實際上映射到 Item() 方法。

Console.WriteLine (szArray[2]);
Console.WriteLine (szArray.Item (2));

ArrayList 類中還有許多其他方法,但是插入和檢索都是我們需要在此示例中使用的。請查閱 MSDN 庫以獲得完整的參考指南。

步驟 6. 文件輸入/輸出

現在,讓我們來實現讀取輸入文件和寫入輸出文件。我們將每一行讀取到一個字符串數組中,然後輸出該字符串數組。在下一步中,我們將使用 QuickSort 算法來對該數組進行排序。

修改源代碼

更改 C# 源文件 (class1.cs),如下面以斜體突出顯示的代碼所示。其他的差異(如類名)可忽略不計。

// Import namespaces
using System;
using System.Collections;
using System.IO;
// Declare namespace
namespace MsdnAA
{
  // Declare application class
  class QuickSortApp
  {
    // Application initialization
    static void Main (string[] szArgs)
    {
      ... ... ...
      // Read contents of source file
      string szSrcLine;
      ArrayList szContents = new ArrayList ();
      FileStream fsInput = new FileStream (szSrcFile, FileMode.Open,
        FileAccess.Read);
      StreamReader srInput = new StreamReader (fsInput);
      while ((szSrcLine = srInput.ReadLine ()) != null)
      {
        // Append to array
        szContents.Add (szSrcLine);
      }
      srInput.Close ();
      fsInput.Close ();
      // TODO: Pass to QuickSort function
      // Write sorted lines
      FileStream fsOutput = new FileStream (szDestFile,
        FileMode.Create, FileAccess.Write);
      StreamWriter srOutput = new StreamWriter (fsOutput);
      for (int nIndex = 0; nIndex < szContents.Count; nIndex++)
      {
        // Write line to output file
        srOutput.WriteLine (szContents[nIndex]);
      }
      srOutput.Close ();
      fsOutput.Close ();
      // Report program success
      Console.WriteLine ("\nThe sorted lines have been written.\n\n");
    }
  }
}

從源文件進行讀取

使用 FileStream 類打開源文件,然後加入 StreamReader 類,這樣我們就可以使用它的 ReadLine() 方法了。現在,我們調用 ReadLine() 方法,直到它返回 null,這表示到達文件結尾。在循環過程中,我們將讀取的行存儲到字符串數組中,然後關閉這兩個對象。

寫入輸出文件

假設已經用 QuickSort 對字符串數組進行了排序,接下來要做的事情就是輸出數組的內容。按照同樣的方式,我們將 StreamWriter 對象附加到 FileStream 對象上。這使得我們可以使用 WriteLine() 方法,該方法能夠很方便地模仿 Console 類的行為。一旦遍歷了數組,我們便可以象前面一樣關閉這兩個對象。

步驟 7. 創建函數

最後一步就是創建一個函數來在字符串數組中運行 QuickSort。我們將此函數放到應用程序類 QuickSortApp 之中。

修改源代碼

更改 C# 源文件 (class1.cs),如下面以斜體突出顯示的 代碼所示。其他的差異(如類名)可忽略不計。

// Import namespaces
using System;
using System.Collections;
using System.IO;
// Declare namespace
namespace MsdnAA
{
  // Declare application class
  class QuickSortApp
  {
    // Application initialization
    static void Main (string[] szArgs)
    {
      ... ... ...
      // Pass to QuickSort function
      QuickSort (szContents, 0, szContents.Count - 1);
      ... ... ...
    }
    // QuickSort implementation
    static void QuickSort (ArrayList szArray, int nLower, int nUpper)
    {
      // Check for non-base case
      if (nLower < nUpper)
      {
        // Split and sort partitions
        int nSplit = Partition (szArray, nLower, nUpper);
        QuickSort (szArray, nLower, nSplit - 1);
        QuickSort (szArray, nSplit + 1, nUpper);
      }
    }
    // QuickSort partition implementation
    static int Partition (ArrayList szArray, int nLower, int nUpper)
    {
      // Pivot with first element
      int nLeft = nLower + 1;
      string szPivot = (string) szArray[nLower];
      int nRight = nUpper;
      // Partition array elements
      string szSwap;
      while (nLeft <= nRight)
      {
        // Find item out of place
        while (nLeft <= nRight)
        {
          if (((string) szArray[nLeft]).CompareTo (szPivot) > 0)
            break;
          nLeft = nLeft + 1;
        }
        while (nLeft <= nRight)
        {
          if (((string) szArray[nRight]).CompareTo (szPivot) <= 0)
            break;
          nRight = nRight - 1;
        }
        // Swap values if necessary
        if (nLeft < nRight)
        {
          szSwap = (string) szArray[nLeft];
          szArray[nLeft] = szArray[nRight];
          szArray[nRight] = szSwap;
          nLeft = nLeft + 1;
          nRight = nRight - 1;
        }
      }
      // Move pivot element
      szSwap = (string) szArray[nLower];
      szArray[nLower] = szArray[nRight];
      szArray[nRight] = szSwap;
      return nRight;
    }
  }
}

QuickSort() 函數

這個函數需要三個參數:對數組的引用、下界和上界。它調用 Partition() 函數將數組分成兩部分,其中一部分包含 Pivot 值之前的所有字符串,另一部分包含 Pivot 值之後的所有字符串。然後,它調用自身來對每個部分進行排序。

上面修改中的注釋應該說明了每個代碼塊的作用。唯一的新概念就是 CompareTo() 方法的使用,該方法是 String 類的成員,並且應該是自說明的。

運行 QuickSort 應用程序

這一步完成 QuickSort C# 示例應用程序。現在,可以構建項目並運行應用程序。需要提供一個示例文本文件,以供其進行排序。將該文件放在與 EXE 文件相同的目錄中。

程序輸出

下面是已完成的 QuickSort C# .NET 示例應用程序的輸出。可以查看示例輸入文件 'example.txt' 和輸出文件 'output.txt'。

步驟 8. 使用調試器

調試器是診斷程序問題的一個必不可少的工具。我們覺得有必要在本入門指南中對其進行介紹。這最後一步將向您展示如何走查程序和使用諸如 QuickWatch 這樣的功能。

設置斷點

當程序在調試器中運行時,斷點會暫停程序的執行,從而使開發人員能夠控制調試器。要設置斷點,請右鍵單擊您想要程序暫停的行,然後單擊 InsertBreakpoint,如下所示。

注:帶有斷點的行以紅色突出顯示。通過再次右鍵單擊該行並選擇 Remove Breakpoint 可以刪除斷點。

單步調試程序

既然設置了斷點(最好是在前面所示的行中),就讓我們在調試器中運行程序。在 Debug 菜單中,選擇 Start 而不是同前面一樣選擇 Start Without Debugging。這樣就在調試器中啟動了程序,並因而激活了斷點。

一旦程序遇到斷點,調試器便會接收程序的控制。這時會有一個箭頭指向當前執行的行。

要單步調試一行代碼,可以選擇 Debug | Step Over 並觀察光標是否移到下一行。Debug | Step Into 命令允許您單步執行將要調用的函數。進行兩次 Step Over 之後的屏幕如下所示。

如果想要程序在遇到下一個斷點、遇到異常或退出之前繼續執行,請從菜單中選擇 Debug | Continue。

檢查變量值

當您可以控制調試器時,可將鼠標指針移到變量上以獲得它的基本值。

您也可以右鍵單擊變量,然後從上下文菜單中選擇 QuickWatch。QuickWatch 將為您提供關於某些變量(如 ArrayList 對象)的更多詳細信息。

其他調試器工具

Visual Studio 調試器具有許多其他工具(例如 Call Stack 查看器)的功能,可以使用此調試器來查看到此為止調用的函數。還可以獲得內存轉儲和關於進程中線程的信息。我們鼓勵您使用這些功能強大的調試工具。

小結

本入門指南旨在幫助您用 Visual Studio 構建一個簡單的 C# 項目。它無法進行全面的介紹。我們鼓勵您查詢關於 C# 和 .NET 的其他資源,以便更多地學習這些技術。在完成本教程之後,您至少有了一個可用的項目,在您研究 Visual C# 時,可以從修改此這些代碼開始。

為了方便起見,我們提供了完整的源程序和項目文件。您可以通過本文檔頂部的目錄來訪問它們。

其他資源

我們強烈推薦下面這些關於 C# 和 .NET 平台的書籍。它們是開發人員嘗試學習這些新技術的有益資源。

• Archer, Tom.Inside C#.Redmond:Microsoft Press, 2001. • Deitel, Harvey.C#:How to Program.Upper Saddle River, NJ:Prentice Hall, 2001. • Gunnerson, Eric.A Programmer's Introduction to C#.New York:Apress, 2000. • Platt, David.Introducing Microsoft .NET.Redmond:Microsoft Press, 2001.

補遺:QuickSort C# .NET 的源代碼

下面是 QuickSort C# .NET 示例應用程序的完整源代碼。您可以復制、使用和分發這些代碼(無版權費)。注意,這些源代碼以"原樣"提供並且不作任何保證。

//
//  QuickSort C# .NET Sample Application
//  Copyright 2001-2002 Microsoft Corporation. All rights reserved.
//
//  MSDN ACADEMIC ALLIANCE [http://www.msdn.microsoft.com/academic]
//  This sample is part of a vast collection of resources we developed for
//  faculty members in K-12 and higher education. Visit the MSDN AA web site for more!
//  The source code is provided "as is" without warranty.
//
// Import namespaces
using System;
using System.Collections;
using System.IO;
// Declare namespace
namespace MsdnAA
{
    // Declare application class
    class QuickSortApp
    {
        // Application initialization
        static void Main (string[] szArgs)
        {
            // Print startup banner
            Console.WriteLine ("\nQuickSort C#.NET Sample Application");
            Console.WriteLine ("Copyright (c)2001-2002 Microsoft Corporation. All rights reserved.\n");
            Console.WriteLine ("MSDN ACADEMIC ALLIANCE [http://www.msdnaa.net/]\n");
            // Describe program function
            Console.WriteLine ("This example demonstrates the QuickSort algorithm by reading an input file,");
            Console.WriteLine ("sorting its contents, and writing them to a new file.\n");
            // Prompt user for filenames
            Console.Write ("Source: ");
            string szSrcFile = Console.ReadLine ();
            Console.Write ("Output: ");
            string szDestFile = Console.ReadLine ();
            // Read contents of source file
            string szSrcLine;
            ArrayList szContents = new ArrayList ();
            FileStream fsInput = new FileStream (szSrcFile, FileMode.Open, FileAccess.Read);
            StreamReader srInput = new StreamReader (fsInput);
            while ((szSrcLine = srInput.ReadLine ()) != null)
            {
                // Append to array
                szContents.Add (szSrcLine);
            }
            srInput.Close ();
            fsInput.Close ();
            // Pass to QuickSort function
            QuickSort (szContents, 0, szContents.Count - 1);
            // Write sorted lines
            FileStream fsOutput = new FileStream (szDestFile, FileMode.Create, FileAccess.Write);
            StreamWriter srOutput = new StreamWriter (fsOutput);
            for (int nIndex = 0; nIndex < szContents.Count; nIndex++)
            {
                // Write line to output file
                srOutput.WriteLine (szContents[nIndex]);
            }
            srOutput.Close ();
            fsOutput.Close ();
            // Report program success
            Console.WriteLine ("\nThe sorted lines have been written to the output file.\n\n");
        }
        // QuickSort implementation
        private static void QuickSort (ArrayList szArray, int nLower, int nUpper)
        {
            // Check for non-base case
            if (nLower < nUpper)
            {
                // Split and sort partitions
                int nSplit = Partition (szArray, nLower, nUpper);
                QuickSort (szArray, nLower, nSplit - 1);
                QuickSort (szArray, nSplit + 1, nUpper);
            }
        }
        // QuickSort partition implementation
        private static int Partition (ArrayList szArray, int nLower, int nUpper)
        {
            // Pivot with first element
            int nLeft = nLower + 1;
            string szPivot = (string) szArray[nLower];
            int nRight = nUpper;
            // Partition array elements
            string szSwap;
            while (nLeft <= nRight)
            {
                // Find item out of place
                while (nLeft <= nRight && ((string) szArray[nLeft]).CompareTo (szPivot) <= 0)
                    nLeft = nLeft + 1;
                while (nLeft <= nRight && ((string) szArray[nRight]).CompareTo (szPivot) > 0)
                    nRight = nRight - 1;
                // Swap values if necessary
                if (nLeft < nRight)
                {
                    szSwap = (string) szArray[nLeft];
                    szArray[nLeft] = szArray[nRight];
                    szArray[nRight] = szSwap;
                    nLeft = nLeft + 1;
                    nRight = nRight - 1;
                }
            }
            // Move pivot element
            szSwap = (string) szArray[nLower];
            szArray[nLower] = szArray[nRight];
            szArray[nRight] = szSwap;
            return nRight;
        }
    }
}

補遺:關於 QuickSort C# .NET

為了演示 QuickSort Visual C# .NET 示例應用程序實際是如何運行的,我們提供了編譯好的可執行文件。您可以通過編譯這些項目文件來創建自己的可執行文件。單擊 Quicksort_Visual_CSharp_.NET.exe,下載源代碼項目文件和可執行文件包。

使用應用程序

啟動 Command Prompt(從"開始"菜單運行"cmd.exe")。使用 CD 命令將目錄更改為可執行文件所在的目錄。然後運行"quicksort.exe"。

程序將提示您提供輸入和輸出文件的名稱。任何包含多行的文本文件均可使用。如果需要,可以使用記事本來創建一個此類文件。然後,該程序將對輸入文件的內容進行排序,並且將其寫入輸出文件。

示例程序輸出

下面是來自此 QuickSort C# .NET 應用程序的一個實例的輸出。此示例演示了 QuickSort 算法,方法是讀取輸入文件、對文件的內容進行排序,然後將其寫入新的文件。用戶輸入的文本以下劃線標記。

您可以查看下面的示例輸入文件 'example.txt' 和輸出文件 'output.txt'。

QuickSort C# .NET Sample Application
Copyright (c)2001-2002 Microsoft Corporation. All rights reserved.
MSDN ACADEMIC ALLIANCE [http://www.msdn.microsoft.com/academic]
This example demonstrates the QuickSort algorithm by reading an input file,
sorting its contents, and writing them to a new file.
Source: example.txt
Output: output.txt
The sorted lines have been written to the output file.

查看示例輸入文件"example.txt":

Visual C#
Windows Embedded
JavaScript
Speech API
ASP.NET
VBScript
Windows Media
Visual Basic
.NET Framework
BizTalk Server
XML Parser
Internet Explorer
Visual C#
SQL Server
Windows XP
DirectX API

查看示例輸出文件"output.txt":

.NET Framework
ASP.NET
BizTalk Server
DirectX API
Internet Explorer
JavaScript
Speech API
SQL Server
VBScript
Visual Basic
Visual C#
Visual C#
Windows Embedded
Windows Media
Windows XP
XML Parser

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved