日期:2014-05-19  浏览次数:20685 次

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,本身就是引用类型。