国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

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

2019-11-17 02:47:24
字體:
來源:轉載
供稿:網友

與類相關基本概念----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()    {    }}

操作符重載

重載操作符的成員函數是公有靜態(tài)的。需要注意的是在進行變量轉換的成員函數的定義過程中,有兩個額外的關鍵字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>

適用于以下環(huán)境,

  • 如果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")    {    }}

上一篇:MSChart使用

下一篇:c# App.Config詳解

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 麻城市| 嘉荫县| 昌江| 衡东县| 襄垣县| 璧山县| 渑池县| 陆丰市| 越西县| 神农架林区| 筠连县| 南宫市| 瑞金市| 灵台县| 定安县| 临颍县| 永丰县| 佳木斯市| 名山县| 镶黄旗| 兰西县| 胶南市| 墨江| 郴州市| 库车县| 夏邑县| 漳浦县| 阿坝县| 壤塘县| 贵港市| 同心县| 陵川县| 湛江市| 常宁市| 长兴县| 新绛县| 新泰市| 巴塘县| 浦城县| 建平县| 冷水江市|