C# 与 C++强强联合--C#中的指针
C# 与 C++强强联合--C#中的指针
非常的不好意思,距离上次随笔C# 与 C++强强联合已经过去快1个月了。承诺大家的C#指针和A*算法迟迟未上。为表歉意献上美女一枚
哈哈。流口水了吧
话归正题。
一、指针是什么呢?
指针就是指针嘛!这是我的第一想法。因为我觉得这样解释已经很明确了。要更明确的话,指针是对系统使用的变量、方法在内存上的一个页签,通过指针就能找到他们。
二、C#指针有那些应用?
int* p表示一个变量内存地址,delegate通常用于表示对方法的引用。
三、应用
1、*
unsafe static void Main(string[] args)
{
int* pa, pb;
int a = 1, b = 2;
pa = &a;
pb = &b;
Console.WriteLine(pa[0] + pb[0]);
Console.ReadLine();
}
代码不解释,会不会开发的我想都懂。但是我们是C#下使用指针需要注意些什么呢?
3.1、C#默认是不允许使用指针的,因为她任务这会增加程序的不安全性,需要我们设置下
勾上这个,然后使用的地方需要添加unsafe。
3.2、C#有个垃圾回收机制,为我们开发节约了很多时间,不用去管内存的释放。但是我们使用指针会遇到什么样的问题呢?我们系统变量可以分为活动变量和固定变量,固定的变量永久的存在并不会被GC的操作影响。(例如局部变量,值参数和间接指针)活动的变量会被GC重新分配位置或是释放(例如对象中的字段,基础数据数组)。如果我们使用的是活动变量这个这个会让我们的指针指的实际地址内容发生变化。这样我们需要fixed
fixed 语句禁止垃圾回收器重定位可移动的变量 Point pt = new Point(); fixed (int* p = &pt.x)
{
*p = 1;
}
3.3、以前有人说C#分配数组的不是连续的内存块,今天也试了下,纯粹扯蛋。
int[] array = new int[100];
for (int i = 0; i < 100; i++)
{
Console.WriteLine(Marshal.UnsafeAddrOfPinnedArrayElement(array, i).ToString());
}
Console.ReadLine();
int是32位,使用4个个字节,从上面的地址看下,所以啊,是完全连接的嘛!
3.4、暂时不知道写什么,大家补充啊!....
二、delegate
public delegate int _DSum(int a, int b); static void Main(string[] args)
{
_DSum sum = Sum;
Console.WriteLine(sum(1, 2));
Console.ReadLine();
} public static int Sum(int a, int b)
{
return a + b;
}
看上面这段代码就发现啦,我把Sum方法给_DSum的变量小sum了。这样就可以通过小sum,直接调用大Sum啦。这就是我说的方法的指针。
常用使用情况有
1、事件
class Program
{
unsafe static void Main(string[] args)
{
Calculate calculate = new Calculate(); //实例Calculate
calculate._ESum += new Calculate._DSum(calculate__ESum); //创建_ESum事件的监听,怎么监听的呢?通过Calculate的_DSum委托,触发时执行_DSum指向的方法calculate__ESum
Console.WriteLine(calculate.Sum(1, 2));
Console.ReadLine();
} static void calculate__ESum(int a, int b)
{
Console.Write("{0}+{1}=", a, b);
}
} public class Calculate
{
public delegate void _DSum(int a, int b);
public event _DSum _ESum;
public int Sum(int a, int b)
{
_ESum(a, b);
return a + b;
}
}
2、UI处理
private unsafe void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(Bind));//创建个新线程
t.Start(); //启动线程
} private void Bind()
{
for (int i = 0; i < 10; i++)
{
DShow dShow = show; //把方法show委托给dShow
this.BeginInvoke(dShow, i); //在创建textBox1的句柄上去执行dShow
Thread.Sleep(800);
}
} private delegate void DShow(int num);
private void show(int num)
{
textBox1.Text = num.ToString();
}
解释下为什么在创建textBox1的句柄上去执行dShow,Window是一个消息机制的操作系统,怎么说呢!就是你要执行的命名不是立马执行(当然了也可以马上执行,想游戏类不然都延迟卡死,不没法玩了)而是放到一个待执行命令的消息队列中,某个进程的一系列任务不是一个一个的去执行的,而且有线程池,可以同时并行去执行。我们的UI有个线程。为了不卡住UI,我们需要创建个新的线程。新的线程就直接去填值也是不行,线程间有安全机制。不能你操作我的东西,我操作别人的东西,这样就需要自己操作自己的。所以使用BeginInvoke。就算是自己操作自己的,我也可以等待你执行完了再执行下一个也可以不等啊。这样就有的BeginInvoke和Invoke区别了。
(*^__^*) 嘻嘻,写了半天了,中间还去开了会打了下酱油。今天先这样吧!不好的大家见谅,勇敢的指出来
C# 与 C++强强联合--C#中的指针的更多相关文章
- 【实战Java高并发程序设计 1】Java中的指针:Unsafe类
是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...
- c++中this指针的用法
1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...
- 在c#中使用指针
如果想在c#中使用指针,首先对项目进行配置:在解决方案资源管理器中右击项目名选择属性(或在项目菜单中选择consoleApplication属性(consoleApplication为项名)),在生成 ...
- c中的指针
一. 指针前奏 1. 指针的重要性 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言. 2. 小需求 l void change(int n)函数 ...
- 关于Vector中的元素中含有指针成员的情况
对于容器,当容器的各个元素为类类型,且该类类型中含有指针成员时: 如果类类型的析构函数中包含了对指针变量指向内存的释放操作,则在利用clear()函数删除容器所有元素时,会自动调用类的析构函数,自动实 ...
- C++中this指针的用法详解
转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
随机推荐
- cocos2d-x3.0之请求网络(phpserver)
HelloWorldScene.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos ...
- EF结合SqlBulkCopy
EF结合SqlBulkCopy在项目中的使用 这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县E ...
- IE中的事件对象
IE中的事件对象 1)type属性 用于获取事件类型 2)srcElement属性 用于获取事件的目标 3)cancelBubble属性 用于阻止事件冒泡 设置为true表示阻止事件冒泡 设置为fa ...
- 在Installshield的安装进度中显示自己设置的信息
原文:在Installshield的安装进度中显示自己设置的信息 以Installscript msi project为例,在installshield所制作的安装包安装过程中显示安装进度的,就在On ...
- PHP文件上传后缀名与文件类型对照表
ie 火狐 id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd appl ...
- 基于4.5Framework web程序、SQLSERVER数据库打包
原文:基于4.5Framework web程序.SQLSERVER数据库打包 估计很多朋友和我一样,对于C/S程序打包很熟悉,但对于B/S程序打包一头雾水... 最近公司要求我们把项目和数据库(SQL ...
- NET Socket服务编程
smark https://github.com/IKende/ .NET Socket服务编程之-高效连接接入编 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务 ...
- windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)
第一种方式:全备份,并直接覆盖原来的备份文件,固定命名. 脚本: @echo off exp system/a123@HZPG file=e:\db_backup\oradata.dmp log=e: ...
- MVC无刷新分页
MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能) 我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下 ...
- .NET和JAVA的比较- 体系结构
.NET体系结构 对于.NET Framework体系结构,参考了"你必须知道的.NET"并”借用“别人的经典体系结构图从宏观上说明一下我的理解. 图1 简单的说下几个名词: ...