首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#中string变量的比较有关问题!很简单的!但是小弟我不会。

2012-02-16 
C#中string变量的比较问题!很简单的!但是我不会。。。。。。。。usingSystemusingSystem.Collections.Genericusi

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...

热点排行