作者F23ko (纯洁)
看板C_Sharp
标题[问题] 指标、fixed、Managed
时间Sun Apr 18 03:02:20 2010
我原本的做法,是传递变数的位址给建构子
mySprite1 = new ClassSprite(texture,
new Vector2(0f, 0f),
&this.WindowX,
&this.WindowY);
但是编译器不给过,逼我把它改成这样
fixed(int* WX = &this.WindowX,WY = &this.WindowY)
{
mySprite1 = new ClassSprite(texture,
new Vector2(0f, 0f),
WX,
WY);
}
http://msdn.microsoft.com/zh-tw/library/f58wzh21.aspx
看一看MSDN的fixed说明,我也搞不太懂这是干什麽用的.....
指标在基础教学书上几乎都没提,顶多提一下下
而且又有delegate ref out可以用,几乎都用不到
所以我对指标的概念仅止於「这是变数的位址」而已
另外,我原本的想法是:
把变数的位址传给class,让那个class用私有栏位把指标记录下来
当变数改变的时候,就不用特别去更新那个class的数据
unsafe class ClassSprite
{
......
public int* WindowX;
public int* WindowY;
public ClassSprite(Texture2D texture, Vector2 position,
int* WindowX, int* WindowY)
{
......
this.WindowX = WindowX;
this.WindowY = WindowY;
}
......
到目前为止,写几个小程式来测试都OK
但是看到MSDN这句:
如果没有 fixed,Managed 变数的指标也许没有多大用处,因为记忆体回收可能
会在非预期下重新配置变数。C# 编译器只能让您将指标指派到 fixed 陈述式中
的 Managed 变数。
我请问.....
这是不是说.....
我想出来的那种方法有机绿会发生意外,只是我还没遇到?
如果是,那有办法可以解决吗?
--
我... 我一点都不糟糕啦!>///<
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.27.109.99
1F:→ james732:比较好奇的是你想要做什麽事呢? 04/18 03:22
这个是拿xna书上的教学范例来改的,他原本是用vector2记录
视窗的宽跟高,然後在update里记算撞到视窗後的反弹
我试着把视窗改成可变动大小,因此,需要让游戏原件里记录的
视窗宽高跟着变。
方法一:是采用this.Window.ClientSizeChanged事件,在视窗
变动时,从程式主体去修改原件的变数,这很简单,我也试成功
了。
但是考虑到,如果游戏变大的话,场上会有一大堆的游戏原件,
逐一修改很费事,就打算用指标(方法二)。
虽然有遇到视窗宽高是属性不能传位址的状况,但那个拐个弯就
能解决。
this.Window.ClientSizeChanged +=
new EventHandler(Window_ClientSizeChanged);
void Window_ClientSizeChanged(object sender, EventArgs e)
{
this.WindowX = this.graphics.GraphicsDevice.Viewport.Width;
this.WindowY = this.graphics.GraphicsDevice.Viewport.Height;
}
然後,把this.WindowX、this.WindowY的位址传出去就好。
※ 编辑: F23ko 来自: 163.27.109.99 (04/18 03:39)
※ 编辑: F23ko 来自: 163.27.109.99 (04/18 03:40)
2F:→ jhchou:fixed就是叫CLR暂时不要动fixed变数在记忆体中的位置 04/18 11:52
3F:→ jhchou:这样才能用指标直接操作 04/18 11:52
4F:→ jhchou:通常会用到指标都是要对记忆体大量读写 04/18 12:03
5F:→ jhchou:你的例子看起来没有用到指标的必要啊 让ClassSprite直接存 04/18 12:06
6F:→ jhchou:现在window的reference就好了 04/18 12:07
7F:→ F23ko:咦? 实执型别的指标跟参考型别的refernce是不一样的意思喔? 04/18 13:48
8F:→ F23ko:我还以为是类似的东西.... 04/18 13:48
9F:→ F23ko:谢谢,我觉得我需要去读一些基层的东西.... 04/18 13:59
10F:推 horngsh:要弄清楚何谓value type variable and reference variable 04/20 08:45
11F:推 horngsh:C#里是用ref or out加在实际参数前作call by address. 04/20 08:47
12F:→ F23ko:对,但是使用ref跟out,都没办法储存变数的参考位址,一定要 04/20 09:33
13F:→ F23ko:用指标.... 04/20 09:33
14F:→ F23ko:例如 04/20 09:36
15F:→ F23ko:void Func1(ref int X){ 04/20 09:36
16F:→ F23ko:int X2 = X; //存的是「值」而不是参照 04/20 09:37
17F:推 horngsh:C#里用ref or out的最大目的是产生side effect, 也就是要 04/20 13:37
18F:推 horngsh:改变原呼叫方法中的实际参数的内容... 04/20 13:37
19F:推 horngsh:最简单的例子是写一个MySwap(int x, int y)..实作看看就知 04/20 13:39
20F:→ F23ko:msdn这个方面写的蛮清楚的。 04/20 14:29
21F:→ help0430:你会不会想的太复杂了~要比较的时候再取得画面长宽即可 04/21 22:07