C#基礎知識討論
C#基礎知識之密封類可以有虛函數嗎?
可以,基類中的虛函數將隱式的轉化為非虛函數,但密封類本身不能再增加新的虛函數
示例:
- class BaseClass {
- public virtual void F(){
- Console.WriteLine("BaseClass.F");
- }
- sealed class DeriveClass : BaseClass {
- //基類中的虛函數F被隱式的轉化為非虛函數
- //密封類中不能再聲明新的虛函數G
- public virtual void G(){
- Console.WriteLine("DeriveClass.G");
- }
- }
C#基礎知識之如果基類中的虛屬性只有一個屬性訪問器,那么繼承類重寫該屬性后可以有幾個屬性訪問器?如果基類中有 get 和 set 兩個呢?
如果基類中的虛屬性只有一個屬性訪問器,那么繼承類重寫該屬性后也應只有一個。如果基類中有 get 和 set 兩個屬性訪問器,那么繼承類中可以只有一個也可以同時有兩個屬性訪問器。
C#基礎知識之abstract 可以和 virtual 一起使用嗎?可以和 override 一起使用嗎?
abstract 修飾符不可以和 static、virtual 和 override 修飾符一起使用
C#基礎知識之接口可以包含哪些成員?
接口可以包含屬性、方法、索引指示器和事件,但不能包含常量、域、操作符、構造函數和析構函數,而且也不能包含任何靜態成員
C#基礎知識之類和結構的區別?
類:類是引用類型在堆上分配,類的實例進行賦值只是復制了引用,都指向同一段實際對象分配的內存,類有構造和析構函數,類可以繼承和被繼承
結構:結構是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結構的賦值將分配產生一個新的對象。結構沒有構造函數,但可以添加。結構沒有析構函數,結構不可以繼承自另一個結構或被繼承,但和類一樣可以繼承自接口
示例:
根據以上比較,我們可以得出一些輕量級的對象***使用結構,但數據量大或有復雜處理邏輯對象***使用類。如:Geoemtry(GIS 里的一個概論,在 OGC 標準里有定義) ***使用類,而 Geometry 中點的成員***使用結構
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace Example16 {
- interface IPoint {
- double X {
- get;set;
- }
- double Y {
- get;set;
- } double Z {
- get;set;
- }
- //結構也可以從接口繼承struct Point: IPoint {
- private double x, y, z;
- //結構也可以增加構造函數
- public Point(double X, double Y, double Z){
- this.x = X;this.y = Y;this.z = Z;
- }
- public double X { get { return x;
- }
- set { x = value;
- }
- }
- public double Y {
- get { return x;
- }
- set { x = value;
- }
- }
- public double Z {
- get { return x;
- }
- set { x = value;
- }
- }
- //在此簡化了點狀Geometry的設計,實際產品中還包含Project(坐標變換)
等復雜操作class PointGeometry {- private Point value;
- public PointGeometry(double X, double Y, double Z){
- value = new Point(X, Y, Z);
- }
- public PointGeometry(Point value){
- //結構的賦值將分配新的內存this.value = value;
- }
- public double X { get { return value.X;
- }
- set {
- this.value.X = value;
- }
- }
- public double Y { get { return value.Y;
- }
- set { this.value.Y = value;
- }
- }
- public double Z { get { return value.Z;
- } set { this.value.Z = value;
- }
- }
- public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth){
- return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
- }
- public override string ToString(){
- return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);
- }
- class Program {
- static void Main(string[] args){
- Point tmpPoint = new Point(1, 2, 3);
- PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
- PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
- tmpPG2.X = 4;tmpPG2.Y = 5;tmpPG2.Z = 6;
- //由于結構是值類型,tmpPG1 和 tmpPG2 的坐標并不一樣Console.WriteLine(tmpPG1);
- Console.WriteLine(tmpPG2);
- //由于類是引用類型,對tmpPG1坐標修改后影響到了tmpPG3 PointGeometry tmpPG3 = tmpPG1;
- tmpPG1.X = 7;
- tmpPG1.Y = 8;
- tmpPG1.Z = 9;
- Console.WriteLine(tmpPG1);
- Console.WriteLine(tmpPG3);
- Console.ReadLine();
- }
【編輯推薦】