c#中如何实现针对类的指针 ,100分

123xie 2009-04-08 11:14:41
使用托管模式,也只能实现对结构体struct的指针,而对类不行。

在做一个类似语言代码解析的东西,需要根据代码内容不确定的调用不同的类或者类函数进行处理,在c#下该如何实现呢?

...全文
584 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
超时空要塞 2012-10-26
  • 打赏
  • 举报
回复
mark下!
漂石 2011-02-28
  • 打赏
  • 举报
回复
C#中的指针很少被用到了,引用类型即可完成指针的工作
Dobzhansky 2009-04-08
  • 打赏
  • 举报
回复
其实 C# 的设计产生了一个很坏的影响,
对于值类型的变量和引用类型的变量,
成员和函数的访问都是使用 . ,
如果值类型使用 .; 而引用 类型使用 ->;
我想这样会更加合适一些, 至少在语义上如此.

为什么不这样设计呢?
Dobzhansky 2009-04-08
  • 打赏
  • 举报
回复
C# 引用类型的变量其实是一个 tracking handle,
引用类型中的 '引用' 一词很是传神,

引用类型的变量不过是 系在 托管堆上真正对象的一条细线罢了,
zzxap 的 a 和 b, 就是这样的两条线,
对象是只有一个的.
wanghui0380 2009-04-08
  • 打赏
  • 举报
回复
实际上这样的东西使用委托比较好

看看微软的wwf你就知道了,你要做的类似语言代码解析的东西,实际就是微软wf工作流引擎想做的事情

如果你读过<wf本质论>你就知道微软在这一块的实现基本就是事件, 委托和反射的综合应用
wanghui0380 2009-04-08
  • 打赏
  • 举报
回复

class MyClass
{
public long X;
public double D;
}




MyClass myClass = new MyClass();
fixed (long *pX = &(myClass.X)) //使用fixed关键字,固定住指针,因为托管对象本身在堆上都是浮动指针,所以你要先把他固定住才能使用
{

// use *pX here only.
}


ps:这些代码是unsafe滴,所以我并不推荐用
ViewStates 2009-04-08
  • 打赏
  • 举报
回复
zhe ge yao mark yi xia
zzxap 2009-04-08
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20041008/22/3435401.html
zzxap 2009-04-08
  • 打赏
  • 举报
回复
[CODE=C#]
操作c#中的指针,是一种编写非托管中的一种技术。
c#中指针类型可能是(存储在栈)中的值类型,也可能是(存储在堆)中的引用
类型。不过无论是什么类型,基本格式都有一个共同的要求就是必须都是支持非
托管的类型或者空类型。
(这里顺便提一句,非托管的类型编译依赖系统类型库,而托管的类型依赖CLR中元
数据.)
在C#中支持非托管的类型包括: sbyte, byte, short, ushort, int, uint,
long, ulong, char, float, double, decimal , bool ,enum ,pointer,void和
用户自定义的结构体类型(但需要注意这里结构体元素必须也是支持非托管的)
定义指针类型格式:
非托管类型* 名称;
例如:int* p;
这里需要注意指针类型是一种类型,声明和一般原C#托管类型一样.
所以可以支持int* p ,q,不支持int* p,*q表示方法.
1,指针类型做数组操作
C#非托管类型可以像C++一样在非托管堆上分配地址,使用stackalloc操作.
并且通过和C++一样的操作方式*用于取地址实际内容或者[]索引方式访问.
例如:
static unsafe void Main()
{
//分配p1一个100的大小
int* p1 = stackalloc int[100];
//赋值操作
for (int i = 0; i < 100; i++)
{
p1[i] = i;
}
//测试内容
for (int i = 0; i < 100; i++)
{
Console.WriteLine(p1[i]);
Console.WriteLine(*(p1+i));
}
}
注意,这里Main函数需要声明是unsafe(非托管的代码)
2,用于获得对象地址
static unsafe void Main()
{
int i = 10; //声明一个int的存放地址
int* p = &i;//获得i存放的内存地址
Console.WriteLine(*p);//测试
}
除了上面提到的内容外,C#指针类型可以完成几乎所有C++指针可以实现的操作.
参考资料:
Pointer types (MSDN C# Programming Guide)
[/CODE]
zzxap 2009-04-08
  • 打赏
  • 举报
回复
[code=C#]
c#的类是带指针的,当时不明白这句话什么意思,今天翻书看见c#一个例子,然后就自己写了两段试了试。

c#:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
test a, b;
a=new test() ;
a.i = 10;
b = a;
Console.WriteLine(a.i);
Console.WriteLine(b.i);
b.i = 50;
Console.WriteLine(a.i);
Console.WriteLine(b.i);
Console.Read();

}
}
}
class test {
public int i;
}

输出结果:

10

10

50

50

c++:

#include <iostream>
using namespace std;
class test
{
public: int i;
};

void main(void)
{
test a,b;
a.i=10;
b=a;
cout<<b.i<<endl;
cout<<a.i<<endl;
b.i=50;
cout<<b.i<<endl;
cout<<a.i<<endl;
cin>>a.i;
}

输出结果:

10

10

50

10



很明显c#中的类的确是有指针性质,a,b是引用类型的变量,声明这两个变量只保留了一个引用——而不会实例化给定类型的对象。

写下来,免得忘记了。算学习笔记吧
[/CODE]
typeof 2009-04-08
  • 打赏
  • 举报
回复
试试 unsafe 关键字。
wanghui0380 2009-04-08
  • 打赏
  • 举报
回复
c#的确可以是用unsafe 和fix关键字来直接使用指针滴

不过并不建议这么做,通常我们用工厂模式,策略模式,模板模式 或者直接放委托或事件来达到这样的效果
Myth_NiuNiu 2009-04-08
  • 打赏
  • 举报
回复
学习了
y9313 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zzxap 的回复:]
C# code

c#的类是带指针的,当时不明白这句话什么意思,今天翻书看见c#一个例子,然后就自己写了两段试了试。

c#:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
test a, b;
a=new test() ;
a.i = 10;
b = a;

[/Quote]



呵呵 在我的blog上转的啊

注册失败 2009-04-08
  • 打赏
  • 举报
回复
需要根据代码内容不确定的调用不同的类或者类函数进行处理
按照我的理解,楼主的要求,如果用C或者C++,实际上就是需要函数指针
C#里实现函数指针的方式就是 委托

liujt09 2009-04-08
  • 打赏
  • 举报
回复
up
cja03 2009-04-08
  • 打赏
  • 举报
回复
学习+UP
saisky 2009-04-08
  • 打赏
  • 举报
回复
使用fixed可以实现类指针
但是好多书里都非常不建议这么做
我个人也没这么用过
wdzr_826 2009-04-08
  • 打赏
  • 举报
回复
试用委托(delegate)代替函数指针!
wuyq11 2009-04-08
  • 打赏
  • 举报
回复
C#在不安全代码中,可以声明和操作指针,可以在指针和整型之间执行转换
http://blog.csdn.net/lsd123/archive/2008/09/06/2890377.aspx

110,579

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧