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,本身就是引用类型。
[解决办法]
string 是 class!本身就是引用类型!
string 对象是不可改变 - 字符串对象一旦创建,其内容就不能更改!
每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间
string 对象的 == 运算符和两个不同引用类型的 == 运算符是不一样的!尽管 string 是引用类型,但定义相等运算符(== 和 !=)是为了比较 string 对象(而不是引用)的值
多看看MSDN...