一、
     结构:值类型,存储在堆栈中,位于计算机的内存逻辑区域中
     类   :引用类型,存储在堆中,位于计算机内存的不同逻辑位置
 
二、
     较小的数据使用结构;
     将一个结构值传递到方法时,传递的是整个数据结构;
     传递一个类,实际上是将引用传递到对象,即只有内存地址;
     对结构修改,改变的是结构的副本,这是值类型工作方式的定义:传递值的副本;
     传递一个引用到类本身意味着在类中修改值,实际上改变的是原始对象;
 
三、代码栗子
  1.新建 PointClass.cs
 namespace StructAndClass
{
internal class PointClass
{
public PointClass(int x, int y)
{
X = x;
Y = y;
} public int X { get; set; } public int Y { get; set; }
}
}

  2.新建 PointStruct.cs

 namespace StructAndClass
{
internal struct PointStruct
{
public int X { get; set; } public int Y { get; set; } public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
}

  3.Program.cs

 using System;

 namespace StructAndClass
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("PointStruct =====");
var pStruct = new PointStruct(, );
Console.WriteLine("初始值:x={0},y={1}", pStruct.X, pStruct.Y);
ModifyPointStruct(pStruct);
Console.WriteLine("调用 ModifyPointStruct() 后的值:x={0},y={1}", pStruct.X, pStruct.Y);
Console.WriteLine(); Console.WriteLine("PointClass =====");
var pClass = new PointClass(, );
Console.WriteLine("初始值:x={0},y={1}", pClass.X, pClass.Y);
ModifyPointClass(pClass);
Console.WriteLine("调用 ModifyPointClass() 后的值:x={0},y={1}", pClass.X, pClass.Y);
Console.Read();
} private static void ModifyPointStruct(PointStruct point)
{
Console.WriteLine("调用方法:ModifyPointStruct");
point.X = ;
point.Y = ;
Console.WriteLine("修改成的值:x={0}, y={1}", point.X, point.Y);
} private static void ModifyPointClass(PointClass point)
{
Console.WriteLine("调用方法:ModifyPointClass");
point.X = ;
point.Y = ;
Console.WriteLine("修改成的值:x={0}, y={1}", point.X, point.Y);
}
}
}

  4.结果:

【解析】

  ModifyPointStruct(PointStruct point) 调用时修改的只是结构副本,所以原来的结构并没有发生变化;  
  ModifyPointClass(PointClass point) 调用时所修改的对象是原对象,因为参数传递过来的是一个引用地址,这地址指向原对象

四、总结

  结构是值类型并在堆栈中传递,每次使用方法进行修改的都只是结构副本;

      至于类,传递的是内存地址的引用,修改的就是初始值

C#:浅析结构与类的区别的更多相关文章

  1. .NET中结构和类的区别

    最近在学习Swift语言,看到了枚举这一章,Swift可以支持在枚举中定义方法...于是想到了回顾一下.NET中枚举.结构.类之间区别. 枚举在.NET较为简单,这里就不作比较,只谈谈结构和类. 1. ...

  2. C#中结构与类的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...

  3. C#基础知识 结构与类的区别

    网上看到struct与class之间的区别,都写的很多,当然说的是对的,也很详细.不过我个人不喜欢照本宣科,还是要有自己的理解和认识,方便记忆. (前提:对于值类型与引用类型有一定的认识) 结构最重要 ...

  4. C++中结构和类的区别

    首先从从语言角度来看,c语言是一种结构化的语言,便于按照模块化的方式来组织程序,易于程序员的调试和维护,而对于c++来说,我么可以认为它是标准c的超集.实际上所有的c程序也是c++程序.但两者之间还是 ...

  5. .net(C#)中结构和类的区别

    static void Main(string[] args) { //类型 //结构:值类型 //类:引用类型 //声明的语法:class struct //在类中,构造函数里,既可以给字段赋值,也 ...

  6. C# 结构与类的区别

    一.定义方式 定义结构: struct PointStruct //默认的访问权限是 public { public int X { get; set; } public int Y { get; s ...

  7. C# 结构与类

    结构是一种可以包含数据成员和方法成员的值类型数据结构.为结构分配数据时不需要从托管堆中分配内存,结构类型的变量直接包含了该结构的数据.结构中可以包含构造函数,常量,字段方法,属性,运算符,事件和嵌套类 ...

  8. C#中结构体和类的区别

    结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的 C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的 ...

  9. C#中的结构体与类的区别

    经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字str ...

随机推荐

  1. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  2. RxJS + Redux + React = Amazing!(译二)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...

  3. WPF 微信 MVVM 【续】发送部分QQ表情

    今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程. 一.支持Binding的RichTex ...

  4. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  5. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

  6. AJAX 大全

    本章内容: 简介 伪 AJAX 原生 AJAX XmlHttpRequest 的属性.方法.跨浏览器支持 jQuery AJAX 常用方法 跨域 AJAX JsonP CORS 简单请求.复制请求.请 ...

  7. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

  8. Postman - 功能强大的 API 接口请求调试和管理工具

    Postman 是一款功能强大的的 Chrome 应用,可以便捷的调试接口.前端开发人员在开发或者调试 Web 程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的 Fi ...

  9. Kotlin与Android SDK 集成(KAD 05)

    作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...

  10. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...