如何在c#中返回对字符串的引用?

如何在c#中返回对字符串的引用?,c#,C#,我想写一个函数,比如 ref String TestIt( int index ) { return this.TestArray[index]; }; 这样我就可以编写如下代码: MyClass.TestIt(0) = "Hello World"; 我的目标是模仿这个C++声明< /P> CString& MyClass::Data( UINT index); 我指的是C++术语变量的地址。 换句话说,在我调用TestIT(0)之后 TestArray[0]将包含“Hello W

我想写一个函数,比如

ref String TestIt( int index )
{
return this.TestArray[index];
};
这样我就可以编写如下代码:

MyClass.TestIt(0) = "Hello World";
我的目标是模仿这个C++声明< /P>
CString& MyClass::Data( UINT index);
<参考文献>我指的是C++术语变量的地址。 换句话说,在我调用TestIT(0)之后 TestArray[0]将包含“Hello World”

编辑
我不能使用索引器,因为我的目标是不断地将.cpp文件转换为c#。我越能模仿C++代码,就越少需要编写一个转换器。

< P>你不需要返回引用来实现你的目标。字符串类型是引用类型,但对比较有特殊处理。因此,如果您只是从TestIt返回一个字符串,那么相等性检查将进行字符串比较。

为此,您需要编写一个setter属性。不幸的是,setter不能在C#中接受进一步的参数,因此您将无法在C#中以1:1的比例编写此代码。可以获得的最接近的类是具有默认属性的嵌套类:

class YourClass {
    public class Nested {
        public Nested(YourClass outer) { m_RefToOuterWorld = outer; }
        private readonly YourClass m_RefToOuterWorld;

        public string this[int index] {
            get { return m_RefToOuter.TestArray[index];
            set { m_RefToOuter.TestArray[index] = value; }
        }
    }

    private readonly Nested m_Nested;
    private string[] TestArray = new string[10];

    public YourClass() { m_Nested = new Nested(this); }

    public Nested TestIt { get { return m_Nested; } }
}
您可以这样使用它:

var test = new YourClass();
test.TestIt[2] = "Hello world!";

顺便说一句,因为这是一项非常艰巨的工作,你可能不想这样做。而且,感觉不太舒服。在这里,通过嵌套类进行的无用的独立性不是您经常看到的东西。

简单的回答是,您不能返回对字符串变量的引用,即对字符串引用的引用)

简单的解决方案是避免这种API,并要求用户以另一种方式设置字符串:

myobj.SetString(0, "Hello, world!");
如果确实需要表示(作为一类对象)对字符串引用的引用,请尝试以下API:

Interface IStringReference
{
    void SetString(string value);
    string GetString();
}


class MyClass
{
    public IStringReference TestIt()
    {
        ... details left out ;) ...
    }
}

但是我认为这在模仿C++的左值方面做得太过分了。

你不只是使用索引器(一个接受参数的匿名属性)吗

然后打电话说:

MyClass[0] = "Hello World";
当然,它没有花哨的“TestIt”名字标签。。。你需要那个名牌吗


编辑:哈哈,我在谷歌上搜索了“C#named indexer”,在2005年,我找到了谁用出色的答案回答愚蠢的问题?正是。

我可以推荐以下解决方案

 public class Test
    {
        Dictionary<int,string> str=new Dictionary<int,string>(); 
        public string this[int i]
        {
            get
            {
                return str[i];
            }
            set
            {
                if(!str.ContainsKey(i))
                    str.Add(i,value);
                else
                    str[i] = value;
            }
        }
公共类测试
{
Dictionary str=新字典();
公共字符串this[int i]
{
得到
{
返回str[i];
}
设置
{
如果(!str.ContainsKey(i))
str.Add(i,值);
其他的
str[i]=值;
}
}

为什么要让代码的2个版本保持一致?写一个可以从.NET中使用的托管C++包装是否更容易,然后调用适当的函数?< /p> < P>所有相同的字符串只有一个引用,不管代码中引用了多少次。 从

公共语言运行库保存 通过维护表来进行字符串存储, 称为实习生池,其中包含 对每个唯一的 声明或创建的文本字符串 在您的程序中以编程方式。 因此,文本的一个实例 仅具有特定值的字符串 在系统中只存在一次

例如,如果指定相同的 多个变量的文本字符串, 运行库检索相同的数据 对中的文本字符串的引用 实习生池并将其分配给每个 变数


基于我的VB背景,我开始为他编写一个简单的索引属性,有点像这样。然后我发现,虽然VB.Net支持这种开箱即用的属性,但C#要求您创建一个全新的类。Bummer。Bummer确实如此。不过,老实说,我从来都不需要这个特定的VB功能。它主要用于模拟se无论如何,隐式CType运算符的mantics,因此我们可以使用它。它不是试图进行字符串比较,而是试图进行赋值,因此不会起作用。编辑:这并不奇怪,因为您可以搜索任何包含“C#”的搜索词,并找到一个(非常好的)Jon的回答。伙计,这家伙太无聊了,而且是可预测的。我需要持续的业务逻辑,我已经在混合模式汇编中有了它,但MFC有时很有趣,我希望100%托管代码能够为我的服务器提供健壮性。这只对文本字符串和您显式插入的字符串有效!所有其他iden字符串可以共享引用,也可以不共享引用。
 public class Test
    {
        Dictionary<int,string> str=new Dictionary<int,string>(); 
        public string this[int i]
        {
            get
            {
                return str[i];
            }
            set
            {
                if(!str.ContainsKey(i))
                    str.Add(i,value);
                else
                    str[i] = value;
            }
        }