c#有指针吗

C#是有指针的,只不过要先标记unsafe,在Rust语言中也是通过unsafe标记,指针在C#越来越重要,尤其是在.Net Core中使用指针也更多,在.Net Core是Unsafe类,有更多指针的操作。

C#是有指针的,只不过要先标记unsafe,在Rust语言中也是通过unsafe标记,指针在C#越来越重要,尤其在.Net Core中使用指针也更多,在.Net Core是Unsafe类,有更多指针的操作。

unsafe并不是不安全的,只是通过unsafe标记后,该函数或者该代码块区域,内存管理由我们开发人员自己掌控(内存资源的分配和释放),在C#中,GC不管理该区域的内存.

先看看使用指针的代码

不安全的

{

byte* pIn=(byte*)srcData.Scan0.ToPointer();

byte* pOut=(byte*)dstData.Scan0.ToPointer();

int stride=srcData.Stride;

字节* p;

省略

三十

}

Scan0是个句柄(Intptr),通过ToPointer返回一个void 指针,再转换为byte指针.

来看看ToPointer函数内部

[安全关键]

私人不安全的虚空*m_value;

[安全安全关键]

[CLSCompliant(false)]

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

[不可转换]

public unsafe void* ToPointer() //调用ToPointer返回void类型的指针

{

返回m_value;

}阅读Ptr源码

看看完整IntPtr句柄源码,去除一些游戏账号购买特性标签

[可序列化]

公共结构 IntPtr : ISerializedable

{

[System.Security.SecurityCritical]

不安全的私人虚空m_value;编译器将 void 处理得最接近 uint,因此需要显式强制转换来保留 int 行为

公共静态只读 IntPtr Zero;

将IntPtr与(IntPtr)0进行比较的快速方法,而IntPtr.Zero由于静态访问缓慢而无法正常工作

内部不安全的布尔是努尔()

{

返回 (this.m_value==null);

}

公共不安全的IntPtr(int值)

{

if WIN32

m_value=(void*)值;

else

m_value=(void*)(long)值;

endif

}

公共不安全的IntPtr(长数值)

{

if WIN32

m_value=(void*)checked((int)value);

else

m_value=(void*)值;

endif

}

公共不安全的IntPtr(void*值)

{

m_value=值;

}

私有不安全的IntPtr(SerializationInfo info, StreamingContext context)

{

长 l=信息。GetInt64("value");

if (Size==4 && (l > Int32.MaxValue || l < Int32.MinValue))

{

throw new ArgumentException(Environment.GetResourceString("Serialization_InvalidPtrValue"));

}

m_value=(void*)l;

}

公共不安全覆盖布尔等于(对象 obj)

{

if (obj is IntPtr)

{

return (m_value==((IntPtr)obj).m_value);

}

返回 false;

}

public unsafe override int GetHashCode()

{

返回未选中((int)((long)m_value));

}

公共不安全 int ToInt32()

{

if WIN32

返回 (整数)m_value;

else

长 l=(长)m_value;

返回 checked((int)l);

endif

}

公共不安全长 ToInt64()

{

if WIN32

返回 (长)(英特)m_value;

else

返回(多头)m_value;

endif

}

公共不安全覆盖字符串 ToString()

{

if WIN32

返回 ((int)m_value)。ToString(CultureInfo.InvariantCulture);

else

返回((长)m_value)。ToString(CultureInfo.InvariantCulture);

endif

}

公共不安全字符串 ToString(字符串格式)

{

if WIN32

返回 ((int)m_value)。ToString(format, CultureInfo.InvariantCulture);

else

返回((长)m_value)。ToString(format, CultureInfo.InvariantCulture);

endif

}

公共静态显式运算符 IntPtr(int 值)

{

return new IntPtr(value);

}

public static explicit operator IntPtr(long value)

{

return new IntPtr(value);

}

public static unsafe explicit operator IntPtr(void* value)

{

return new IntPtr(value);

}

public static unsafe explicit operator void*(IntPtr value)

{

return value.m_value;

}

public unsafe static explicit operator int(IntPtr value)

{

if WIN32

return (int)value.m_value;

else

long l=(long)value.m_value;

return checked((int)l);

endif

}

public unsafe static explicit operator long(IntPtr value)

{

if WIN32

return (long)(int)value.m_value;

else

return (long)value.m_value;

endif

}

public unsafe static bool operator==(IntPtr value1, IntPtr value2)

{

返回值1.m_值==值2.m_值;

}

公共不安全静态布尔运算符 !=(IntPtr 值 1,IntPtr 值 2)

{

返回值1.m_值 !=value2.m_value;

}

public static IntPtr Add(IntPtr 指针,int offset)

{

返回指针 + 偏移量;

}

公共静态 IntPtr 运算符 +(IntPtr 指针,int offset)

{

if WIN32

返回新的 IntPtr(指针。ToInt32() + 偏移量);

else

返回新的 IntPtr(指针。ToInt64() + 偏移量);

endif

}

公共静态 IntPtr 减去(IntPtr 指针,int offset)

{

返回指针 - 偏移量;

}

公共静态 IntPtr 运算符 -(IntPtr 指针,int offset)

{

if WIN32

返回新的 IntPtr(指针。ToInt32() - 偏移量);

else

返回新的 IntPtr(指针。ToInt64() - 偏移量);

endif

}

公共静态整数大小

{

获取

{

if WIN32

返回 4;

else

返回 8;

endif

}

}

公共不安全的 void* ToPointer()

{

返回m_value;

}

}