Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中声明字符串引用变量?_C#_.net - Fatal编程技术网

如何在C#中声明字符串引用变量?

如何在C#中声明字符串引用变量?,c#,.net,C#,.net,说明我的问题的最佳方式是以下C#示例: 我能用C#做这个吗 另外,我知道我可以在函数中实现这一点。我问的是一种“在线”的方法。为什么你要把它分为一个开关,然后再分为一个作业?为什么不在开关中设置值并避免ref行为呢 string newValue = "new value"; switch(type) { case 0: someString0 = newValue; break; case 1: someString1 = ne

说明我的问题的最佳方式是以下C#示例:

我能用C#做这个吗


另外,我知道我可以在函数中实现这一点。我问的是一种“在线”的方法。

为什么你要把它分为一个开关,然后再分为一个作业?为什么不在开关中设置值并避免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;
}