C#類和結(jié)構(gòu)簡單介紹
C#語言還是比較常見的東西,這里我們主要介紹C#類和結(jié)構(gòu),包括介紹C#類和結(jié)構(gòu)示例等方面。
C#類和結(jié)構(gòu)的區(qū)別
類:
◆類是引用類型在堆上分配,類的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對象分配的內(nèi)存
◆類有構(gòu)造和析構(gòu)函數(shù)
◆類可以繼承和被繼承
結(jié)構(gòu):
◆結(jié)構(gòu)是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)的賦值將分配產(chǎn)生一個(gè)新的對象。
◆結(jié)構(gòu)沒有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)沒有析構(gòu)函數(shù)。
◆結(jié)構(gòu)不可以繼承自另一個(gè)結(jié)構(gòu)或被繼承,但和類一樣可以繼承自接口。
C#類和結(jié)構(gòu)示例:
根據(jù)以上比較,我們可以得出一些輕量級的對象***使用結(jié)構(gòu),但數(shù)據(jù)量大或有復(fù)雜處理邏輯對象***使用類。如:Geoemtry(GIS 里的一個(gè)概論,在 OGC 標(biāo)準(zhǔn)里有定義) ***使用類,而 Geometry 中點(diǎn)的成員***使用結(jié)構(gòu)。
- 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;
- }
- }
- //結(jié)構(gòu)也可以從接口繼承
- struct Point: IPoint
- {
- private double x, y, z;
- //結(jié)構(gòu)也可以增加構(gòu)造函數(shù)
- 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; }
- }
- }
- //在此簡化了點(diǎn)狀Geometry的設(shè)計(jì),實(shí)際產(chǎn)品中還包含Project(坐標(biāo)變換)等復(fù)雜操作
- class PointGeometry
- {
- private Point value;
- public PointGeometry(double X, double Y, double Z)
- {
- value = new Point(X, Y, Z);
- }
- public PointGeometry(Point value)
- {
- //結(jié)構(gòu)的賦值將分配新的內(nèi)存
- 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;
- //由于結(jié)構(gòu)是值類型,tmpPG1 和 tmpPG2 的坐標(biāo)并不一樣
- Console.WriteLine(tmpPG1);
- Console.WriteLine(tmpPG2);
- //由于類是引用類型,對tmpPG1坐標(biāo)修改后影響到了tmpPG3
- PointGeometry tmpPG3 = tmpPG1;
- tmpPG1.X = 7;
- tmpPG1.Y = 8;
- tmpPG1.Z = 9;
- Console.WriteLine(tmpPG1);
- Console.WriteLine(tmpPG3);
- Console.ReadLine();
- }
- }
- }
【編輯推薦】