C#中string变量的比较问题!很简单的!但是我不会。。。。。。。。
using System;
using System.Collections.Generic;
using System.Text;
namespace tttt
{
class Program
{
static void Main(string[] args)
{
string s1 = "Test ";
string s2 = "Test ";
string s3 = string.Copy(s2);
Console.WriteLine(s1 == s2);
Console.WriteLine(s2 == s3);
Console.WriteLine((object)s1 == s2);
Console.WriteLine((object)s2 == s3);
Console.Read();
}
}
}
大家请看如上程序,我的问题主要出在第三个输出语句,为什么在机子上运行第三个输出语句输出的是True,我的理解是S1在(object)后已经变成了引用类型了按理来说S1与S2比的是引用的比较也就是说比较是不是指向同一个实例而S1它被赋值为TEST,S2也是被赋值为TEST这两个变量接理来说是不一样的呀,如果从比较引用的角度上看。如果从比较值的内容角度上它们是相等的,所以说第一和第二两个输出都是TRUE。
还有就是请问一下大家怎么才能在VS2005中知道一个变量的地址呀?
谢谢了!
------解决方案--------------------你说得对,S1在(object)后已经变成了引用类型了.
之所以 Console.WriteLine((object)s2 == s3);输出的是FALSE,是因为他们的地址不一样.
而Console.WriteLine((object)s1 == s2);的输出是TRUE,是因为s1与s2在编译后实际上是指向同一个地址.(编译器优化)
------解决方案--------------------在C#中只有当使用unsafe环境才可以像C++一样直接访问变量地址(* 、&)
为了调用非托管的DLL,提供了间接的访问变量地址的功能
参考如下代码:
[DllImport( "kernel32.dll ")]
static extern bool ReadProcessMemory(uint hProcess, IntPtr lpBaseAddress,
IntPtr lpBuffer, uint nSize, ref uint lpNumberOfBytesRead);
[DllImport( "kernel32.dll ")]
static extern uint GetCurrentProcess();
private void button1_Click(object sender, EventArgs e)
{
int[] i = { 1234 };
IntPtr vBaseAddress = Marshal.UnsafeAddrOfPinnedArrayElement(i, 0);
byte[] vBuffer = new byte[4];
IntPtr vBytesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0);
uint vNumberOfBytesRead = 0;
ReadProcessMemory(GetCurrentProcess(), vBaseAddress,
vBytesAddress, 4, ref vNumberOfBytesRead);
int vInt = Marshal.ReadInt32(vBytesAddress);
Text = vInt.ToString();
}
方法UnsafeAddrOfPinnedArrayElement()
可以得到一个数组第N个元素的地址
-_-!!!更多资料参考MSDN
------解决方案--------------------楼上正解。。。
------解决方案--------------------Console.WriteLine((object)s1 == s2);输出为True,这种机制叫做字符串驻留,将两个值相等的字符串引用指向同一个变量。
p.s. String直接继承自Object,本身就是引用类型。