如何在C#中声明字符串引用变量?
说明我的问题的最佳方式是以下C#示例: 我能用C#做这个吗如何在C#中声明字符串引用变量?,c#,.net,C#,.net,说明我的问题的最佳方式是以下C#示例: 我能用C#做这个吗 另外,我知道我可以在函数中实现这一点。我问的是一种“在线”的方法。为什么你要把它分为一个开关,然后再分为一个作业?为什么不在开关中设置值并避免ref行为呢 string newValue = "new value"; switch(type) { case 0: someString0 = newValue; break; case 1: someString1 = ne
另外,我知道我可以在函数中实现这一点。我问的是一种“在线”的方法。为什么你要把它分为一个开关,然后再分为一个作业?为什么不在开关中设置值并避免ref行为呢
string newValue = "new value";
switch(type)
{
case 0:
someString0 = newValue;
break;
case 1:
someString1 = newValue;
break;
//And so on
default:
someStringN = newValue;
break;
}
为什么不这样设置正确的字符串变量:
switch(type)
{
case 0:
someString0 = "New Value";
break;
case 1:
someString1 = "New Value";
break;
//And so on
default:
someStringN = "New Value";
break;
}
更好的方法是用字符串数组替换n个字符串变量,以便赋值成为一行代码:
string[] someString;
someString[type] = "New Value";
如果你真的想按照你要求的方式做作业,这里有一种方法不使用ref
Action<string> action;
switch (type) {
case 0:
action = newVal => someString0 = newVal;
break;
case 1:
action = newVal => someString1 = newVal;
break;
case 2:
action = newVal => someString2 = newVal;
break;
default:
action = null;
break;
}
if (action != null) action.Invoke("some new value");
但你说话的时间比什么都没有长。在我速度不太快的笔记本电脑上,Action版本的执行时间约为13纳秒,而direct assignment方法的执行时间约为5.5纳秒。两者都不可能成为重要的瓶颈。字符串已经是引用类型。您真正想要实现什么?我需要将
someString0
、someString1
或someStringN
的值更改为“新值”,具体取决于类型
变量。如果我删除ref,我不确定这将如何工作?这听起来是个坏主意。如果你提供了更多的上下文,那么可以推荐一种实现你真正想要做的事情的方法,这可能更符合普通的C代码。C++中的这种模式不是习惯性的C语言。也许可以使用TypedReference
和一些未记录的C#关键字来实现,但我不推荐这样做。或者,如果你知道你可以在函数中实现,你可以用一个将所有N个字符串作为引用传递的代码来包装代码,并在开关中设置它们,不是吗?你为什么要“排队”呢?谢谢,但我的实际例子显然没那么简单strKey=“New Value”
不仅仅是一行代码。嗯,是的,它是。它是一行代码的定义。到目前为止,所有3个答案都和你的答案一样,所以你需要向我们展示你到底想做什么。正如您所说的,您希望根据变量的值更改不同字符串的值。这个答案(以及其他答案)就是这样。你的答案与上面的答案一模一样。是的,但我要单独写出来澄清。不管怎样,我更喜欢数组方法,它不在上面的答案中。与我的方法不完全相同,但非常接近。他有数组版本,这至少是java/c模拟REF的历史方式。非常确定,您必须将操作设置为null,以避免“使用未初始化的局部变量”编译时错误。每种情况(包括默认情况)都会设置操作,所以应该按原样进行,不是吗?开关中涵盖了每种情况(默认值捕获任何未显式大小写的内容),所以操作总是有一个赋值。我测试了这个,所以它确实能按发布的那样工作。我不认为编译器足够聪明,但是如果你测试它,我想我错了。@hatchet:很好。这正是我需要的。只是好奇。从计算的角度来看,那些操作有多“昂贵”
?
Action<string> action;
switch (type) {
case 0:
action = newVal => someString0 = newVal;
break;
case 1:
action = newVal => someString1 = newVal;
break;
case 2:
action = newVal => someString2 = newVal;
break;
default:
action = null;
break;
}
if (action != null) action.Invoke("some new value");
switch (i) {
case 0:
someString0 = "some new value";
break;
case 1:
someString1 = "some new value";
break;
case 2:
someString2 = "some new value";
break;
default:
break;
}