1,大家来谈谈结构有什么好处,我知道结构是值类型,除了这之外有什么优点?因为有时我想sharp 在对java的改进,在java中都去掉了结构,为何sharp还保持。
2,为何我偶尔发现调用结构的方法有时主要new,而有时不需要?我发现这个问题,当时报错时才加new,过后没能好好理解。

解决方案 »

  1.   

    谈不上什么优点,对于小数据量,表示简单的信息,可以用struct,对于值类型,还可以给你带来一些麻烦,也算不上有点
      

  2.   

    调用c写的dll很方便,还有c#没有删除指针,也是在这方面比较方便
      

  3.   

    调用dll还没玩过,就玩xml,最近想去读取excel等...
    谢了```
      

  4.   

    当年微软模仿java的时候,它不但要模仿java,更要考虑自己的ms c++程序员。
      

  5.   

    不懂.net的struct就是不懂计算机程序的基本原理
      

  6.   

    valuetype的“优势”主要是性能上的考量以及和非托管代码的互操作。
      

  7.   

    struct可以让你能在系统堆栈中分配空间,如果都是class,那么创建一个变量的代价很大,因为在堆中分配消耗很大,还会造成碎片,严重时导致内存耗尽,但struct变量会在栈中分配释放内存,不仅速度快,而且绝对不会产生碎片,
      

  8.   

    其实struct变量是在堆栈中分配,new不new都会分配内存,而且即使new也是在堆栈中分配内存,区别只是,new可以调用struct的构造函数,这样struct的成员就可以正确初始化,如果不new,则不调用构造函数,struct成员没有初始化,所以编译会出现变量未初始化错误,其实你不用new,直接给每个成员都初始化,也是可以避免编译错误的,
      

  9.   

    这才有点说到点子上,就是由于栈必须存在,所以struct必须存在
      

  10.   

    楼主的问题,MSDN已经做了详细的解释
    1:在类和结构之间选择
    2:这种情况应该使用class作为封装,而不是struct,MSDN同样也有说明
    struct(C# 参考)
      

  11.   

    结构的设计准则参见MSDN:
    http://msdn.microsoft.com/zh-cn/library/ms229031(v=vs.100).aspx
      

  12.   

    那时也没注意,不是,如果不new则貌似不能调用其非静态方法,所以当时我想要new才能调用,但我查资料说struct的实例化不用new,我这就郁闷了,当时为什么不能调用。
      

  13.   

    那时也没注意,不是,如果不new则貌似不能调用其非静态方法,所以当时我想要new才能调用,但我查资料说struct的实例化不用new,我这就郁闷了,当时为什么不能调用。
      

  14.   

    那时也没注意,不是,如果不new则貌似不能调用其非静态方法,所以当时我想要new才能调用,但我查资料说struct的实例化不用new,我这就郁闷了,当时为什么不能调用。
      

  15.   

    那时也没注意,不是,如果不new则貌似不能调用其非静态方法,所以当时我想要new才能调用,但我查资料说struct的实例化不用new,我这就郁闷了,当时为什么不能调用。
      

  16.   

    那时也没注意,不是,如果不new则貌似不能调用其非静态方法,所以当时我想要new才能调用,但我查资料说struct的实例化不用new,我这就郁闷了,当时为什么不能调用。
      

  17.   

    那时也没注意,不是,如果不new则貌似不能调用其非静态方法,所以当时我想要new才能调用,但我查资料说struct的实例化不用new,我这就郁闷了,当时为什么不能调用。
      

  18.   

    struct给把数据指令化提供可能。比如int,如果它是class的话初始化它必须去操作内存数据,但它是struct有可能只要一个寄存器xor就成了
    另外.net里共位体的实现也必须依赖于struct
      

  19.   

    这才有点说到点子上,就是由于栈必须存在,所以struct必须存在

    错。和堆栈无关。如果你把引用类型的引用本身视作一种存储的话。
      

  20.   

    作为版主,注意回复问题的表达方式,
    8楼和9楼本该是你的回复,
    而不巧的是,5楼恰恰说中了10楼的你
    8L9L说了一半,就是我说的“性能上的考量”,lz和3L说了另一半,“互操作”。
      

  21.   

    P/Invoke必须要用基本数据类型或结构体,类是引用类型,无法在P/Invoke中传递,而对于Byte[]类型的结构体成员,都是通过Attrebute进行封装后使用的。
    Java不支持结构体,导致了P/Invoke不可能实现,于是变为了Java Native Interface,自己编写一个符合接口生命的本地方法,给Java使用,超麻烦。
      

  22.   

    个人认为,没有什么必要用 struct, 即使在 C++ 里面
      

  23.   

    我如果发表我真实的想法的话,可能又要伤到一大批人。
    如果只是缺乏知识,还好办,因为知识是可以学到。重要的是要有好的学习方法,第一是虚心,第二有良好的推理能力,第三好的动手的能力。
    我看了以上的回复,竟然有人得出,平台调用和struct 有关,没有struct 将无法进行平台调用的结论,我不会java,java 如何,我不清楚。但.net绝不是这样的。我也不想多说了,一切用代码说话。
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace getclientp
    {
        public partial class Form1 : Form
        {
            [DllImport("user32.dll")]
            public extern static int ClientToScreen(IntPtr h, point pt);
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                
            }        private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                try
                {
                    point p = new point();
                    p.x = e.X;
                    p.y = e.Y;
                    ClientToScreen(this.Handle,p);
                    string msg = string.Format("client:x={0},y={1} | screen:x={2},y={3}", e.X, e.Y, p.x, p.y);
                    MessageBox.Show(msg);
                    point p1 = p;
                    p1.x = 100;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                
            }       
        }    [StructLayout(LayoutKind.Sequential)]
        public class point
        {
           
            public int x;
            public int y;
        }
    }
      

  24.   

    请问我的point是什么类型。是值类型,还是引用类型?
      

  25.   

    class使用[StructLayout(LayoutKind.Sequential)]修饰也是可以的。
    就算这些方法都不行,C struct不就是一个内存字节序列吗?.NET可以根据元数据生成一份字节序列,仅仅是运行效率低一些而已。
    所以说struct的支持主要是因为运行效率的问题。
      

  26.   

    ?1、你说struct 是存在,其中之一是为了性能,我想问一句:为什么,或者说它是怎么做到性能上的提高?
    2、我所贴的代码,只是为了回答27楼所说没有struct 就没有平台调用,struct 只是经常用于平台调用,因为它比较简单,比较好控制它的内存布局。但绝不能说没有struct 就无法进行平台调用。至于和托管非托管有个毛关系。只要我能让非托管理解我要传的内容内存布局。我就可以进行平台调用,他们两个运行在不同的地址空间,要什么兼不兼容
      

  27.   

    你说因为堆栈所以struct必须存在,或许你想说的是,在堆栈上分配空间可以提高性能,但是初学者会以为没有struct就不能利用系统堆栈了,甚至没有堆栈就不能调用函数了。事实上没有那么夸张。你强调枝节而忽视本质,这能算作一种正确么?
      

  28.   

    对别人的言语首先不要断章取义,第二不要把你的想法强加于人。如果按照你的逻辑,你说是的性能的问题,是不是我就可以这么认为,struct 在比class性能要高,所以在大部分情况下,为了提高性能,要用struct 替代 class呢?你的言论是不是会给初学者带来困惑呢,如果他听说过装箱。
    另外你还没有回答我的问题。struct如何提高性能的?
    还有一个问题:要像struct那样提高性能,是否能采用别的方式?
      

  29.   

    随便插一句
    语言就是工具,工具是为了提高生产力
    我相信,struct提高了不少人的生产力(我就是收益者^-^)
      

  30.   


    [StructLayout(LayoutKind.Sequential)]和 struct一起用才有义义吧, 边界对齐 对class没义义哦
      

  31.   

    我用了c++cli做类方法传入c#中的结构体 你可以直接对c#中的结构体采用 cli::pin_ptr<> 这种直接定住它然后在c++cli中直接使用指针访问数组当中每一个对象比c# 自身的那个system:array<>的速度要快 c# 中的值类型对于c++cli来讲特别的好用特别是c#与c++cli混合编码
      

  32.   

    版主你要是真想了解 结构体的用处你得学习一下 c#中写unsafe struct{} 这种 建议你看看c++cli 微软在c++cli中允许进行托管和非托管代码的混合编程 你只有深入学习了这些你才能知道它这些东西真正的用处 其实微软把c# 做的很强大 只是很多人并没有用到它的强大之处
      

  33.   

    我的理解是:如果你的数据结构没有行为只有数据且数据字段比较少量比较大的时候,可以考虑用struct.
    这么做的优势是节省内存.
    但是如果字段比较多(大对象)的话,还是考虑引用类型(也就是class)定义吧.因为传参时的复制开销也很大.可以看我的blog上关于值类型的描述.
    http://blog.csdn.net/cuit/article/details/8438107
      

  34.   

    我觉得struct是 在C#没被支持是 好的做法,这样 有了两个概念1,引用 
    2,值值的意思就是 一些简单的 数据接合,它不需要new,
    和class的区别只在于此而已
      

  35.   

    觉得4#和46# 说的有道理,“兼顾”是.net的一个特色。