ASP.NET基础知识:类和结构的区别是什么?

类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

示例:
根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。
如: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();
        }
    }
}

结果:
X: 1, Y: 2, Z: 3
X: 4, Y: 5, Z: 6
X: 7, Y: 8, Z: 9
X: 7, Y: 8, Z: 9

 

时间: 2024-09-19 09:24:51

ASP.NET基础知识:类和结构的区别是什么?的相关文章

ASP入门知识:简单介绍ASP的基础知识

ASP文件可包含文本.HTML标签和脚本.ASP文件中的脚本可在服务器上执行. 在学习之前,应具备的知识: 在继续学习之前,您需要对以下知识有基本的了解: HTML / XHTML 诸如JavaScript或者VBScript的脚本语言 如果希望学习上面的项目,请在我们的首页访问这些教程. ASP是什么? ASP指Active Server Pages(动态服务器页面) ASP是运行于ISS之中的程序 IIS指Internet Information Services(因特网信息服务) IIS是

Java基础知识—类的深层结构

在Java中,可以在同一个类中定义两个或多个共享相同名称的方法,只要它们的参数声明不同就可以.当出现这种情况时,这些方法就被称为重载(overloaded),并且这一过程被称为方法重载(method overloading).方法重载也是Java支持多态性的方式之一. 当调用重载方法时,Java所使用参数的类型和/或数量决定了实际调用是哪个版本的方法.因此,重载方法在参数的类型和/或数量方法必须有所区别.虽然重载方法可以返回不同的类型,但是单靠返回类型不足以区分方法的多个版本.当Java遇到对重

php基础知识:类与对象(1)_php技巧

类的定义:   以关键字 class 开头,后面跟着类名,可以是任何非 PHP 保留字的名字.后面跟着一对花括号,里面包含有类成员和方法的定义. 伪变量$this可以在当一个方法在对象内部调用时使用.$this 是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用.//??静态调用的内部到底是怎样的?看个例子:class A{   function foo()   {       if (isset($this)) {          

ASP.net基础知识之常见错误分析_实用技巧

1:command调用存储过程的时候,如果输出是dataset,selectcommand的command对象的connection先要指出,否则catch一辈子也是空的..  2:存储过程的varchar字段如果是x.x的这种格式,容易出现细微的傻错误,注意不要漏了[].  3:如果ascx文件的默认服务器控件的事件不重写的话在control控件里面没有自动回送!切记.  4:Page.RegisterOnSubmitStatement在ascx文件中小心使用...  5:viewstate在

php基础知识:类与对象(5) static_php技巧

Declaring class members or methods as static makes them accessible without needing an instantiation of the class. A member declared as static can not be accessed with an instantiated class object (though a static method can).  声明静态的类变量和方法可以不需要实例化类对象的

php基础知识:类与对象(3) 构造函数和析构函数_php技巧

构造函数 PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作.  注意:  如果子类中定义了构造函数则不会暗中调用其父类的构造函数.要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct().(??和其他语言明显不同??) 例10.8.使用新标准的构造函数 class BaseClass {   function __construct() {       prin

php基础知识:类与对象(4) 范围解析操作符(::)_php技巧

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员.方法和常量,还可以用于访问被覆盖类中的成员和方法.  当在类的外部访问这些静态成员.方法和常量时,必须使用类的名字. 把 Paamayim Nekudotayim 在希伯莱文就是双冒号的意思.  在类的外部使用 :: 操作符 class MyClass {    const CONST_VALUE = 'A constant value'; } echo MyClass::CONS

php基础知识:类与对象(2) 自动加载对象_php技巧

自动加载对象:    很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表.     在 PHP 5 中,不再需要这样了.可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用.通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类.  本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClas

ASP.NET预备知识学习笔记_实用技巧

.NET FrameWork框架 是一套应用程序开发框架,主要目的提供一个开发模型. 主要的两个组件:     公共语言运行时(Common Language Runtime)(CLR): 提供内存管理.线程管理和远程处理等核心服务,并且还强制实施严格的安全类型,提高代码的安全性和可靠想. .NET  Framework类库: 与CLR紧密集成,可以使用它开发多种应用程序和服务.主要包括控制台应用程序.Windows窗体应用程序.WindowsPresentationFoundation(WPF