我如果发表我真实的想法的话,可能又要伤到一大批人。 如果只是缺乏知识,还好办,因为知识是可以学到。重要的是要有好的学习方法,第一是虚心,第二有良好的推理能力,第三好的动手的能力。 我看了以上的回复,竟然有人得出,平台调用和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) {
谢了```
1:在类和结构之间选择
2:这种情况应该使用class作为封装,而不是struct,MSDN同样也有说明
struct(C# 参考)
http://msdn.microsoft.com/zh-cn/library/ms229031(v=vs.100).aspx
另外.net里共位体的实现也必须依赖于struct
错。和堆栈无关。如果你把引用类型的引用本身视作一种存储的话。
8楼和9楼本该是你的回复,
而不巧的是,5楼恰恰说中了10楼的你
8L9L说了一半,就是我说的“性能上的考量”,lz和3L说了另一半,“互操作”。
Java不支持结构体,导致了P/Invoke不可能实现,于是变为了Java Native Interface,自己编写一个符合接口生命的本地方法,给Java使用,超麻烦。
如果只是缺乏知识,还好办,因为知识是可以学到。重要的是要有好的学习方法,第一是虚心,第二有良好的推理能力,第三好的动手的能力。
我看了以上的回复,竟然有人得出,平台调用和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;
}
}
就算这些方法都不行,C struct不就是一个内存字节序列吗?.NET可以根据元数据生成一份字节序列,仅仅是运行效率低一些而已。
所以说struct的支持主要是因为运行效率的问题。
2、我所贴的代码,只是为了回答27楼所说没有struct 就没有平台调用,struct 只是经常用于平台调用,因为它比较简单,比较好控制它的内存布局。但绝不能说没有struct 就无法进行平台调用。至于和托管非托管有个毛关系。只要我能让非托管理解我要传的内容内存布局。我就可以进行平台调用,他们两个运行在不同的地址空间,要什么兼不兼容
另外你还没有回答我的问题。struct如何提高性能的?
还有一个问题:要像struct那样提高性能,是否能采用别的方式?
语言就是工具,工具是为了提高生产力
我相信,struct提高了不少人的生产力(我就是收益者^-^)
[StructLayout(LayoutKind.Sequential)]和 struct一起用才有义义吧, 边界对齐 对class没义义哦
这么做的优势是节省内存.
但是如果字段比较多(大对象)的话,还是考虑引用类型(也就是class)定义吧.因为传参时的复制开销也很大.可以看我的blog上关于值类型的描述.
http://blog.csdn.net/cuit/article/details/8438107
2,值值的意思就是 一些简单的 数据接合,它不需要new,
和class的区别只在于此而已