日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 语言的高级应用

發布時間:2023/12/29 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 语言的高级应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 語言的高級應用


1、屬性

例1:屬性概念的引入(問題)

public class Animal {public int Age;public double Weight;public bool Sex;public Animal(int age, double weight, bool sex){Age = age;Weight = weight;Sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0}, Weight:{1}, Sex:{2}", Age, Weight, Sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0}, Weight:{1}, Sex:{2}", al.Age, al.Weight, al.Sex);al.Age = -1;al.Weight = -0.5;Console.WriteLine(al);} }

例2:問題的解決(Java語言解決該問題的方案)

public class Animal {private int _age;private double _weight;private readonly bool _sex;public int GetAge(){return _age;}public void SetAge(int value){_age = (value > 0) ? value : 0;}public double GetWeight(){return _weight;}public void SetWeight(double value){_weight = (value > 0) ? value : 0;}public bool GetSex(){return _sex;}public Animal(int age, double weight, bool sex){_age = (age > 0) ? age : 0;_weight = (weight > 0) ? weight : 0;_sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0}, Weight:{1}, Sex:{2}", _age, _weight, _sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0},Weight:{1},Sex:{2}", al.GetAge(), al.GetWeight(), al.GetSex());al.SetAge(-1);al.SetWeight(-0.5);Console.WriteLine(al);} }

例3:屬性的提出

public class Animal {private int _age;private double _weight;private readonly bool _sex;public int Age{get { return _age; }set { _age = (value > 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value > 0) ? value : 0; }}public bool Sex{get { return _sex; }}public Animal(int age, double weight, bool sex){_age = (age > 0) ? age : 0;_weight = (weight > 0) ? weight : 0;_sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0}, Weight:{1}, Sex:{2}", Age, Weight, Sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0}, Weight:{1}, Sex:{2}", al.Age, al.Weight, al.Sex);al.Age = -1;al.Weight = -0.5;Console.WriteLine(al);} }

說明:C#在聲明data時就可以定義set、get方法。

  • get:定義讀取操作。
  • set:定義賦值操作,value表示傳入的參數值。

例4:屬性的簡化

public class Animal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value > 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value > 0) ? value : 0; }}public bool Sex { get; private set; }public Animal(int age, double weight, bool sex){_age = (age > 0) ? age : 0;_weight = (weight > 0) ? weight : 0;Sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0},Weight:{1},Sex:{2}", Age, Weight, Sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0}, Weight:{1}, Sex:{2}", al.Age, al.Weight, al.Sex);al.Age = -1;al.Weight = -0.5;Console.WriteLine(al);} }

說明:屬性可以看作是對私有數據部分增加的一層隔離。


2、索引器

2.1 定義

是集合類中的一種特殊屬性,可使得集合類中的元素像數組元素一樣訪問。

2.2 語法結構

public 元素類型 this[int index] {get { ... }set { ... } }public 元素類型 this[string name] {get { ... }set { ... } }

例5:利用索引器實現對集合類StudentSet中元素Student的訪問。

public class Student {private string _name;public string Name{get { return _name; }set{_name = string.IsNullOrEmpty(value)? "NULL": value;}}public long ID { get; set; }public Student(long id, string name){ID = id;_name = name;}public override string ToString(){return string.Format("ID:{0},Name:{1}", ID, Name);} } public class StudentSet {private readonly int _maxCount = 500;private readonly Student[] _stus;public int Count{get; private set;}public StudentSet(){Count = 0;_stus = new Student[_maxCount];}public void Add(Student stu){if (stu == null)throw new ArgumentNullException();if (Count == _maxCount)throw new IndexOutOfRangeException();_stus[Count] = stu;Count++;}public Student this[int index]{get{if (index < 0 || index > Count - 1)throw new IndexOutOfRangeException();return _stus[index];}set{if (index < 0 || index > Count - 1)throw new IndexOutOfRangeException();if (value == null)throw new ArgumentNullException();_stus[index] = value;}} } class Program {static void Main(string[] args){StudentSet stuSet = new StudentSet();stuSet.Add(new Student(10086, "張三"));stuSet.Add(new Student(95988, "李四"));stuSet[1].Name = string.Empty;Console.WriteLine(stuSet.Count); Console.WriteLine(stuSet[0]); Console.WriteLine(stuSet[1]); Console.WriteLine(stuSet[2]);//未處理的異常: System.IndexOutOfRangeException: 索引超出了數組界限。} }

3、接口

3.1 概念

  • 接口是類設計的藍圖,即只提供聲明而沒有實現。
  • 接口不可以直接實例化對象(與抽象類相同)。
  • C#允許一個類實現多個接口(注意與繼承的區別)。
  • 接口就是包含一系列不被實現的方法,而把這些方法的實現交給繼承它的類。

3.2 表示

例6:根據類圖利用Dog實現IAnimal接口

public interface IAnimal {int Age { get; set; }double Weight { get; set; }void Eat();void Sleep(); } public class Dog : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Dog Eat");}public void Sleep(){Console.WriteLine("Dog Sleep");} } class Program {static void Main(string[] args){IAnimal al = new Dog();al.Age = 1;al.Weight = 2.5;Console.WriteLine("Dog:Age={0}, Weight={1}", al.Age, al.Weight);al.Eat();al.Sleep();} }

例7:利用接口實現“飼養系統”

某飼養員(Raiser)在目前狀態下需要飼養三種動物:狗(Dog)、鳥(Bird)和魚(Fish),該三種動物只需要讓其睡覺(Sleep)和吃飯(Eat)即可。請設計該飼養系統,要求滿足軟件設計的“開閉原則”。

方案一:(在抽象類部分已經給出)

方案二:

public interface IAnimal {int Age { get; set; }double Weight { get; set; }void Eat();void Sleep(); } public class Bird : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Bird Eat.");}public void Sleep(){Console.WriteLine("Bird Sleep.");}public void Fly(){Console.WriteLine("Bird Fly.");} } public class Dog : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Dog Eat.");}public void Sleep(){Console.WriteLine("Dog Sleep.");}public void Run(){Console.WriteLine("Dog Run.");} } public class Fish : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Fish Eat.");}public void Sleep(){Console.WriteLine("Fish Sleep.");}public void Swim(){Console.WriteLine("Fish Swim.");} } public class Raiser {public void Raise(IAnimal al){al.Eat();al.Sleep();} } class Program {static void Main(string[] args){Raiser rsr = new Raiser();rsr.Raise(new Dog());rsr.Raise(new Bird());rsr.Raise(new Fish());} }

3.3 接口(interface)與抽象類(abstract class)

(1)相同點:

  • 接口與抽象類都不可以直接實例化對象。

(2)不同點:

  • 抽象類中的數據和操作必須有限制修飾符,而接口中的數據和操作不可以有限制修飾符。
  • 抽象類中可以有帶實現體的方法(非abstract方法),而接口只能有方法的聲明。
  • 抽象類在子類中通過override關鍵字覆寫抽象方法,而接口被子類直接實現。

例8:一個類可以實現多個接口,但要注意多個接口中有重名方法的處理。

方式一:

public interface IHighWayWorker {void HighWayOperation();void Build(); } public interface IRailWayWorker {void RailWayOperation();void Build(); } public class Worker : IRailWayWorker, IHighWayWorker {public void HighWayOperation(){Console.WriteLine("HighWayOperation.");}public void RailWayOperation(){Console.WriteLine("RailWayOperation");}public void Build(){Console.WriteLine("HighWay,RailWay,Build.");} } class Program {static void Main(string[] args){Worker wr = new Worker();wr.Build(); // HighWay,RailWay,Build.IHighWayWorker hwr = new Worker();hwr.Build(); // HighWay,RailWay,Build.hwr.HighWayOperation(); // HighWayOperation.IRailWayWorker rwr = new Worker();rwr.Build(); // HighWay,RailWay,Build.rwr.RailWayOperation();// RailWayOperation} }

方式二:

public interface IHighWayWorker {void HighWayOperation();void Build(); } public interface IRailWayWorker {void RailWayOperation();void Build(); } public class Worker : IHighWayWorker, IRailWayWorker {public void HighWayOperation(){Console.WriteLine("HighWayOperation.");}public void RailWayOperation(){Console.WriteLine("RailWayOperation");}void IHighWayWorker.Build(){Console.WriteLine("HighWay Build.");}void IRailWayWorker.Build(){Console.WriteLine("RailWay Build.");}// 注意:void IHighWayWorker.Build()和void IRailWayWorker.Build()// 前面不能夠加限制修飾符。 } class Program {static void Main(string[] args){Worker wr = new Worker();//wr.Build(); 該語句錯誤IHighWayWorker hwr = new Worker();hwr.Build();//HighWay Build.hwr.HighWayOperation();//HighWayOperation.IRailWayWorker rwr = new Worker();rwr.Build();//RailWay Build.rwr.RailWayOperation();//RailWayOperation} }

4、泛型

例9:存儲int數據類型的集合及操作。

public class IntSet {private readonly int _maxSize;private readonly int[] _set;public IntSet(){_maxSize = 100;_set = new int[_maxSize];//...}public void Insert(int k, int x){//...._set[k] = x;}public int Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){IntSet iSet = new IntSet();iSet.Insert(0, 123);int i = iSet.Locate(0);Console.WriteLine(i); // 123} }

例10:存儲string數據類型的集合及操作。

public class StringSet {private readonly int _maxSize;private readonly string[] _set;public StringSet(){_maxSize = 100;_set = new string[_maxSize];//...}public void Insert(int k, string x){//...._set[k] = x;}public string Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){StringSet strSet = new StringSet();strSet.Insert(0, "abc");string j = strSet.Locate(0);Console.WriteLine(j); // abc} }

例11:利用object類存儲通用數據類型的集合及操作。

public class GSet {private readonly int maxSize;private readonly object[] _set;public GSet(){maxSize = 100;_set = new object[maxSize];//...}public void Insert(int k, object x){//...._set[k] = x;}public object Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){GSet gSet1 = new GSet();gSet1.Insert(0, 123);int k1 = (int)gSet1.Locate(0);Console.WriteLine(k1); // 123GSet gSet2 = new GSet();gSet2.Insert(0, "abc");string k2 = (string)gSet2.Locate(0);Console.WriteLine(k2); // abcGSet gSet3 = new GSet();gSet3.Insert(0, 123);gSet3.Insert(1, "abc");//編譯時可以通過,運行時出現異常。int k3 = (int)gSet3.Locate(1); //這樣使用存在類型安全問題。Console.WriteLine(k3);// 未處理的異常: System.InvalidCastException: 指定的轉換無效。} }

泛型定義:即參數化類型。

在編譯時用一個具體類型代替該參數類型,可定義類型安全的類而不影響工作效率。

例12:利用泛型T存儲通用數據類型的集合及操作。

public class GSet<T> {private readonly int _maxSize;private readonly T[] _set;public GSet(){_maxSize = 100;_set = new T[_maxSize];//...}public void Insert(int k, T x){//...._set[k] = x;}public T Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){GSet<int> gSet1 = new GSet<int>();gSet1.Insert(0, 123);int k1 = gSet1.Locate(0);Console.WriteLine(k1); // 123GSet<string> gSet2 = new GSet<string>();gSet2.Insert(0, "abc");string k2 = gSet2.Locate(0);Console.WriteLine(k2); // abc} }

我們把T稱為類型參數,當然我們也可以對T進行約束。

例13:為類型參數T增加約束,比如T只能是值類型。

public class GSet<T> where T : struct {private readonly int _maxSize;private readonly T[] _set;public GSet(){_maxSize = 100;_set = new T[_maxSize];//...}public void Insert(int k, T x){//...._set[k] = x;}public T Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){GSet<int> gSet1 = new GSet<int>();gSet1.Insert(0, 123);int k1 = gSet1.Locate(0);Console.WriteLine(k1); // 123// GSet<string> gSet2 = new GSet<string>(); // 編譯錯誤// 錯誤 CS0453 類型“string”必須是不可以為 null 值的類型,// 才能用作泛型類型或方法“GSet < T >”中的參數“T” } }

有關泛型約束可以查看以下圖文:

  • 技術圖文:C#語言中的泛型 I
  • 技術圖文:C#語言中的泛型 II

5、類與類之間的關系

public class Oxygen {//... } public class Water {//... } public abstract class Animal {public int Age;public double Weight;public abstract void Eat();public abstract void Sleep();public abstract void Breed();public abstract void Metabolism(Oxygen o2, Water water); }

public class Bird : Animal {public string Feather;public void Fly(){//...}public void Egg(){//...}public override void Eat(){//...}public override void Sleep(){//...}public override void Breed(){//...}public override void Metabolism(Oxygen o2, Water water){//...} } public class Penguin : Bird {//... } public class Goose : Bird {//... } public class Duck : Bird {//... }

public class Climate {//... } public class Penguin : Bird {private Climate _climate;//... }

public interface ILanguage {void Speak(); } public class DonaldDuck : Duck, ILanguage {public void Speak(){//...}//... }

總結

以上是生活随笔為你收集整理的C# 语言的高级应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。