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

與類相關基本概念----Beginning Visual C#,

編輯:C#入門知識

與類相關基本概念----Beginning Visual C#,


更多相關文章,見本人的個人主頁:zhongxiewei.com

 

類定義

定義類的修飾符:

  • internal (default訪問修飾符),當前項目中的代碼對其有訪問權限
  • public(訪問修飾符),公開其可訪問性
  • abstract,說明該類是抽象類,不能實例化,只能被繼承,可以擁有抽象成員
  • sealed,不能被繼承

關於類的修飾符需要注意的是:

  • 沒有private和protected修飾符
  • public類不能夠繼承自internal類,如 public class MyClass : MyBase {} // MyBase is a internal class,不過internal可以繼承自public類
  • 繼承抽象類時,除非當前類也是抽象的,就必須對所有抽象成員初始化
  • 繼承時,不允許多重繼承
  • 類定義中,父類和接口同時存在是,父類必須位於冒號後面的第一個位置,如:public class MyClass : MyBase, IMyInterface {}

接口定義

定義接口的修飾符:

  • internal (default訪問修飾符),當前項目中的代碼對其有訪問權限
  • public(訪問修飾符),公開其可訪問性

需要注意的是:

  • 沒有sealed,abstract修飾符
  • 允許接口的多重繼承
  • 當接口被類繼承時,接口中的所有函數都必須實現

System.Object

當類沒有繼承對象時,默認繼承System.Object,那麼就有必要看看該類中到底有什麼。

MethodDescription Object() 構造函數 ~Object() 析構函數 virtual bool Equals(object) this和other對象進行比較 static bool Equals(object,object) 比較輸入的兩個對象,內部調用上一個函數,true all null static bool ReferenceEquals(object,object) 比較輸入的兩個對象是不是同一個對象的引用 virtual string ToString() 默認返回類類型的名字 object MemberwiseClone() 構建新的object實例,並對成員變量進行copy,引用類型的成員變量仍然引用同一個變量 System.Type GetType() 返回對象的類型 virtual int GetHashCode() 返回對象的hash值

使用GetType的一個示例:

if (myObj.GetType() == typeof(MyComplexClass))
{
    // myObj is an instance of the class MyComplexClass
}

類成員定義

修飾關鍵字:

  • public,任何代碼都能夠訪問
  • private,類內部的代碼才能夠訪問
  • internal,項目內部的代碼才能夠訪問
  • protected,繼承的子類中的代碼能夠訪問
  • static,屬於類的成員,而不單屬於某個對象

只針對成員變量的修飾符:

  • readonly,只讀變量,在聲明或構造函數中進行初始化

只針對成員函數的修飾符:

  • virtual,能夠被重載的函數
  • abstract, 必須被重載的函數,只能在abstract類中存在
  • override,重載基類中的函數
  • extern,函數的定義在其他的地方
  • sealed,函數無法被進一步重載

屬性定義

private int myInt;

public int MyIntProp
{
    get
    {
        return myInt;
    }
    set
    {
        if (value >= 0 && value <= 10)
            myInt = value;
        else
            throw(...);
    }
}

隱藏基類中的函數

很容易想到的實現方式如下:

public class MyBaseClass
{
    public void DoSomething()
    { // base implementation
    }
}

public class MyDerivedClass : MyBaseClass
{
    public void DoSomething()
    { // Derived class implementation, hides base implementation
    }
}

但是上面的代碼在編譯的過程中會出現警告,說MyDerivedClass中的DoSomething函數隱藏了基類中的DoSomething函數,請使用new關鍵字,即public new void DoSomething() {}

Collection

可以使用現有的System.Collections.ArrayList實現。這裡要講的是自己定義Collections。可以采用如下的方式來實現,如:

public class Animals : CollectionBase
{
    // Add功能
    public void Add(Animal newAnimal)
    {
        List.Add(newAnimal);
    }

    // Remove功能
    public void Remove(Animal oldAnimal)
    {
        List.Remove(oldAnimal);
    }

    // 實現MyAnimal[0]的訪問方式
    public Animal this[int animalIndex]
    {
        get
        {
            return (Animal)List[animalIndex];
        }
        set
        {
            List[animalIndex] = value;
        }
    }

    public Animals()
    {
    }
}

操作符重載

重載操作符的成員函數是公有靜態的。需要注意的是在進行變量轉換的成員函數的定義過程中,有兩個額外的關鍵字explicitimplicit

// 二元操作符+
public class Class1
{
    public int val;
    // 二元操作符
    public static Class1 operator +(Class1 op1, Class1 op2)
    {
        Class1 returnVal = new Class1();
        returnVal.val = op1.val + op2.val;
        return returnVal;
    }

    // 一元操作符,-
    public static Class1 operator -(Class1 op1)
    {
        Class1 returnVal = new Class1();
        returnVal.val = -op1.val;
        return returnVal;
    }
}

is操作符和as操作符

is操作符:檢測一個未知的變量能夠轉化成為已知的類型的變量。如果可以則返回true,否則返回false。但是它並不能判斷兩個類型是否相同。

它的語法結構為:<operand> is <type>

該表達式的可能的結果如下:

  • 如果type是class類型,那麼當<operand>也是那個類型,或是那個類的子類,或是可以轉換成那個類型時,返回的結果為true
  • 如果type是interface類型,那麼當operand是那個類型,或是那個類型的實現的時候,返回結果為true
  • 如果type是value type,如int,那麼當operand是那個類型,或是可以隱式轉換成那個類型的時候,返回結果為true

as操作符,將變量轉換成特殊的引用類型。<operand> as <type>

適用於以下環境,

  • 如果operand的類型與type相同。
  • 如果operand能夠隱式轉換成type類型
  • 如果operand能夠無損的強制得轉換成type類型。

如果不能夠轉換,則返回的結果為null。

BaseClass obj1 = new BaseClass();
DerivedClass obj2 = obj1 as DerivedClass; // return null 不會拋出異常,如果使用 ... = (DerivedClass)obj1; 則會拋出異常

// 如果以下面的方式進行轉換則是可以的
DerivedClass derivedClass = new DerivedClass();
BaseClass baseClass = derivedClass;
DerivedClass newDerivedClass = baseClass as DerivedClass; // not null

深度拷貝

直接采用System.Object對象內的MemberwiseClone()當遇到類含有引用變量的時候,就不能夠實現深層的拷貝,如:

public class Content
{
    public int Val;
}

public class Cloner
{
    public Content MyContent = new Content();
    public Cloner(int newVal)
    {
        MyContent.Val = newVal;
    }

    public object GetCopy()
    {
        return MemberwiseClone();
    }
}

// 具體調用
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
mySource.MyContent.Val = 2; // 這將導致myTarget.MyTarget.Val也相應的改變成了2

要實現深度的拷貝,可以實現ICloneable接口。

public class Cloner : ICloneable
{
    public Content MyContent = new Content();
    public Cloner(int newVal)
    {
        MyContent.Val = newVal;
    }
    public object Clone()
    {
        Cloner clonedCloner = new Cloner(MyContent.Val);
        return clonedCloner;
        // 或是
        // Cloner clonedCloner = new Cloner();
        // clonedCloner.MyContent = MyContent.Clone();
        // return clonedCloner;
    }
}

自定義異常

自定義的過程中,只要繼承Expection類並進行實現即可。如:

public class AgeBelowZeroException : Exception
{
    public AgeBelowZeroException() :
        base("The age must >= 0")
    {
    }
}

C語言基本概念問題

浮點分為兩類:單精度型和雙精度型,
其類型說明符為float 單精度說明符,double 雙精度說明符。在Turbo C中單精度型占4個字節(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。雙精度型占8 個字節(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
實型變量說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
    double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。
 

VisualC# 與Visual C功可以一樣?

有些不同,但是要使懂得VC++的人學C#就很好上手了。他包含了vc++的一些語法風格,有新增加了新的內容。擴展了開發平台,兼容很多語言在裡面。
C#(讀做 "C sharp",中文譯音“夏普”)是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言,並定於在微軟職業開發者論壇(PDC)上登台亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網絡框架的主角.

在本文中,我將考察創建一種新計算機語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用程序的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及Windows 2000的一個"d預覽版本",還有MSDN上迅速增多的文檔集子的形式獲得(還沒有最終定型).

微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說structs),它還增加了自己新的特點(比方說源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和采用的語言.而微軟當前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:"這是對Java的反擊."

C#更象Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因為Java近來很成功而使用Java的公司都報告說它們在生產效率上比C++獲得了提高.

Java所帶來的巨大影響和大家對它的廣泛接受已經由工作於這種語言和平台之上的程序員數量明顯的說明了(估計世界范圍內共有兩百五十萬程序員使用Java).由這種語言寫成的應用程序的數量是令人驚訝的並已經滲透了每一個級別的計算,包括無線計算和移動電話(比如日本發明的Java電話).C#能夠在用戶領域獲得這樣的禮遇嗎?我們必須等待並觀望,就象已經由SSI公司的CEO和主席Kalpathi S. Suresh指出來的那樣,"我發現所有這些都是漸進的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術;它們在更大的意義上來說只是大公司制造的市場噱頭.我們必須給他們時間安頓下來看看這些是不是真的對IT工業有什麼影響."

C#從Java繼承而來的特點

類:在C#中類的申明與Java很相似.這是合理的因為經驗告訴我們Java模型工作得很好.Java的關鍵字import已經被替換成using,它起到了同樣的作用.一個類開始執行的起點是靜態方法Main().下面的Hello World程序展示了基本的形式:

using System;

class Hello
{

static void Main()
{

Console.WriteLine("Hello, worl......余下全文>>
 

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