如何在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;
}
}